精华内容
下载资源
问答
  • 大家好: 通常Xen DomainU是通过前后端驱动来访问外设的,那Domain0如果需要对...在 Domain0是怎么访问外设的过程中,Xen做了什么? 如何Domain0是直接访问物理驱动的话,那Xen在其中做了什么工作? 谢谢!
  • MAX3420E可与任何SPI主...SPI主控制器必须参与处理,当MAX3420的INT引脚指示有中断发生时,SPI主控制器将读取14个中断请求位,以确定需要服务的中断,一般情况下,主要由这些中断请求(IRQ)位确定MAX3420E的工作过程
  • AWIC可以在CPU休眠时(在Deep Stop模式中)通过异步机制继续响应来自存活外设的中断请求以唤醒CPU。但是在之前的理解中,AWIC和NVIC是相互独立工作,分别接入CPU中的。这也导致了我在理解例如LLWU等从特殊低功耗

    之前对Kinetis的低功耗系统进行学习的过程中,大体上了解NVIC是主管同步唤醒事件,而AWIC是主管异步唤醒事件,同步和异步主要指的是是否与CPU的时钟保持同步。NVIC是在CPU醒着的时候(有时钟供应)的情况下接受中断请求,处于ARM核心内部,需要CPU的时钟供应以维持工作。AWIC可以在CPU休眠时(在Deep Stop模式中)通过异步机制继续响应来自存活外设的中断请求以唤醒CPU。但是在之前的理解中,AWIC和NVIC是相互独立工作,分别接入CPU中的。这也导致了我在理解例如LLWU等从特殊低功耗模式下唤醒的执行序列时仍存在诸多疑惑(唤醒后到底是先复位还是先执行中断服务程序?)。

    今天详读一份Kinetis的datasheet时,注意到如下一段关于AWIC说明:

    此处的意思是“AWIC在异步模式下(包括CPU的系统时钟停止供应)捕获到事件,AWIC恢复系统时钟(包括CPU时钟)。系统时钟恢复后,NVIC恢复工作,监测到中断事件发生,然后执行常规的基于NVIC的中断服务处理程序”。这就说明AWIC和NVIC有交接工作的关系:AWIC从一些Deep Sleep模式中恢复系统时钟,它的工作内容就结束了。系统时钟恢复后,NVIC自动接替事件的响应过程,启动中断服务程序处理相应的中断事件。

    再拿文中提到的一个案例进行分析:

    由此可以解释,当使用LLWU(隶属于AWIC的范畴)这类超低功耗掉电模式的唤醒事件监控模块时,会先唤醒系统,然后通过NVIC的引导开始执行中断服务程序,当系统从中断服务程序的高优先级的特权状态中回归到常规优先级的普通状态时,开始启动复位操作序列(此时的复位操作序列感觉像是一个最低优先级的中断服务程序,同LLWU的中断服务组成“咬尾中断”,也就是说指令序列从来都没有回到过main函数)(当然也有另一种可能的解释,就是LLWU的中断服务最后面由硬件自动添加了一段复位操作序列,用户看不到,也不可编程,此时指令序列也没有回到main函数)。总之,结论是“先执行中断服务程序再复位”,那么在这种情况下,LLWU的中断服务程序一般可以用来在时钟完备的情况下保存一下复位前的现场信息。这样在复位之后,在新一轮的生命周期中,使用上一个生存周期末尾保存的现场信息执行一些对应的处理工作。

     

     

    展开全文
  • 通用定时器的工作过程(学习笔记)通用定时器框图:整张图可以分成5部分。第一部分是时钟发生器。第二部分为时基单元。第三部分为输入捕获。第四部分为输出比较。第五部分包含了几个捕获/比较寄存器。讲解如下: 第...

    通用定时器的工作过程(学习笔记)

    通用定时器框图:

    3958bce9f250854e46f9d14cb7e5641b.png

    整张图可以分成5部分。

    4b560ee213e805d495616bed1ef730a0.png

    第一部分是时钟发生器。第二部分为时基单元。第三部分为输入捕获。第四部分为输出比较。第五部分包含了几个捕获/比较寄存器。

    讲解如下:

    第一部分:首先看到第二部分中psc预分频器需要接收时钟源,而时钟源共有四种来源,分别如下:

    1、RCC寄存器中的APB1外设时钟使能寄存器,经过倍频之后输出时钟源,这是因为该寄存器的位0到位5分别表示的是定时器2到定时器7的使能位。(位于图上第一部分)

    2、外部触发引脚TIMx_ETR的外部触发输入ETR,对应的引脚可以通过查数据手册得到。ETR经过分频得到ETRP,在经过滤波得到ETRF作为时钟信号。(位于图上第一部分)

    3、内部触发输入(ITRx),来自其他的定时器的时钟,即将其他定时器产生的脉冲信号作为该定时器的时钟源,经过后面的选择器,进入到触发控制器。(位于图上第一部分)

    4、外部输入引脚Tix,这个主要来自于TIMx_CHx (四个通道)。(位于图上第三部分)

    第二部分:为时基单元,包括PSC预分频器、自动重装载寄存器和CNT计数器。首先由第一部分产生时钟源,进入PSC预分频器进行分频处理,得到新的时钟信号CK_CNT,使得CNT计数器加1或者减1,此时在自动重装载寄存器中有一个预先设定的装载值,当计数器的值达到装载值的时候,会产生溢出事件,然后触发中断。

    第三部分为输入捕获,TIMx_CH1——TIMx_CH4 这四个通道,在芯片中都有对应的引脚,当脉冲从通道口进入时,经过输入滤波器(抗干扰的作用),然后经过边沿检测器检测到上升沿(下降沿),经过分频器,输入到第五部分中的捕获寄存器中,然后捕获寄存器记录此刻CNT计数器的值,当下一次下降沿(上升沿)过来时,也记录下CNT计数器的值,这样就可以计算出输入脉冲的宽度。

    第四部分为输出比较(注意输入捕获和输出比较不可以同时进行),比如在比较寄存器中预先设定一个值,计数器从初始值到装载值之间计数时,当正好等于比较寄存器中的预设值时,控制TIMx_CH1——TIMx_CH4通道输出低电平或者高电平,这样随着计数器不断的计数,就可以获得一个脉冲,通过调整预设值,就可以调整脉冲宽度,调整初始值和装载值就可以调整周期。

    注:PSC预分频器

    目的是将定时器时钟源分频输出。它的值由TIMx_PSC决定,是一个16位正整数的值。为什么要分频输出呢?

    例如当使用内部时钟时,它的频率一般比较高,导致时间体现在定时器上的效果就非常短,而如果我们需要更长的时间间隔,就需要对该时钟源分频处理,以降低定时器时钟(CK_CNT)的频率。

    PSC预分频器工作的工作原理:定时器时钟源每tick一次,预分频器计数器值+1,直到达到预分频器的设定值,然后再tick一次后计数器归零,同时,CNT计数器值+1。

    展开全文
  • 通用定时器的工作过程 通用定时器框图: 整张图可以分成5部分。 第一部分是时钟发生器。第二部分为时基单元。第三部分为输入捕获。第四部分为输出比较。第五部分包含了几个捕获/比较寄存器。 讲解如下: 第一部分...

    我的学习笔记

    通用定时器的工作过程
    通用定时器框图:
    在这里插入图片描述
    整张图可以分成5部分。
    在这里插入图片描述
    第一部分是时钟发生器。第二部分为时基单元。第三部分为输入捕获。第四部分为输出比较。第五部分包含了几个捕获/比较寄存器。

    讲解如下:

    第一部分首先看到第二部分中psc预分频器需要接收时钟源,而时钟源共有四种来源,分别如下:

    1、RCC寄存器中的APB1外设时钟使能寄存器,经过倍频之后输出时钟源,这是因为该寄存器的位0到位5分别表示的是定时器2到定时器7的使能位。(位于图上第一部分)

    2、外部触发引脚TIMx_ETR的外部触发输入ETR,对应的引脚可以通过查数据手册得到。ETR经过分频得到ETRP,在经过滤波得到ETRF作为时钟信号。(位于图上第一部分)

    3、内部触发输入(ITRx),来自其他的定时器的时钟,即将,经过后面的选择器,进入到触发控制器。(位于图上第一部分)

    4、外部输入引脚Tix,这个主要来自于TIMx_CHx (四个通道)。(位于图上第三部分)

    第二部分为时基单元,包括PSC预分频器、自动重装载寄存器和CNT计数器。首先由第一部分产生时钟源,进入PSC预分频器进行分频处理,得到新的时钟信号CK_CNT,使得CNT计数器加1或者减1,此时在自动重装载寄存器中有一个预先设定的装载值,当计数器的值达到装载值的时候,会产生溢出事件,然后触发中断。

    第三部分为输入捕获,TIMx_CH1——TIMx_CH4 这四个通道,在芯片中都有对应的引脚,当脉冲从通道口进入时,经过输入滤波器(抗干扰的作用),然后经过边沿检测器检测到上升沿(下降沿),经过分频器,输入到第五部分中的捕获寄存器中,然后捕获寄存器记录此刻CNT计数器的值,当下一次下降沿(上升沿)过来时,也记录下CNT计数器的值,这样就可以计算出输入脉冲的宽度。

    第四部分为输出比较(注意输入捕获和输出比较不可以同时进行),比如在比较寄存器中预先设定一个值,计数器从初始值到装载值之间计数时,当正好等于比较寄存器中的预设值时,控制TIMx_CH1——TIMx_CH4通道输出低电平或者高电平,这样随着计数器不断的计数,就可以获得一个脉冲,通过调整预设值,就可以调整脉冲宽度,调整初始值和装载值就可以调整周期。

    注:PSC预分频器

    目的是将定时器时钟源分频输出。它的值由TIMx_PSC,是一个16位正整数的值。为什么要分频输出呢?

    例如当使用内部时钟时,它的频率一般比较高,导致时间体现在定时器上的效果就非常短,而如果我们需要更长的时间间隔,就需要对该时钟源分频处理,以降低定时器时钟(CK_CNT)的频率。

    PSC预分频器工作的工作原理:定时器时钟源每tick一次,预分频器计数器值+1,直到达到预分频器的设定值,然后再tick一次后计数器归零,同时,CNT计数器值+1。

    展开全文
  • 参考前文-ZYNQ-实现外设驱动开发-iic接口光强度传感器GY-30搭建过程 下面给出部分更改操作: 这里我们需要把之前选到MIO改成EMIO 同时参考我们pynq电路图: 进行管脚分配,这里我开始把管脚分配到了AR_...

    学习内容

    进一步熟悉IIC接口的开发调试,上次工程只是模拟开发,本次将进行实践操作。

    开发环境

    vivado 18.3
    SDK
    pynq-z2

    硬件平台搭建

    参考前文-ZYNQ-实现外设驱动开发-iic接口的光强度传感器GY-30的搭建过程
    下面给出部分更改操作:
    这里我们需要把之前选到的MIO改成EMIO
    在这里插入图片描述
    同时参考我们的pynq的电路图:
    在这里插入图片描述
    进行管脚分配,这里我开始把管脚分配到了AR_SCL和AR_SDA上,试了很多次都不行,然后我就改到了相邻的AR12和A13上,就能正常工作了,这里应该是之前电平一直没有匹配的问题,这里我也没找到好的办法,只能更换引脚。
    添加约束文件,为EMIO提供管脚分配文件

    set_property -dict { PACKAGE_PIN N17   IOSTANDARD LVCMOS18 } [get_ports { IIC_0_scl_io }]; #IO_L24N_T3_34 Sch=ar_scl
    set_property -dict { PACKAGE_PIN P18   IOSTANDARD LVCMOS18 } [get_ports { IIC_0_sda_io }]; #IO_L24P_T3_34 Sch=ar_sdaIIC_0_scl_io
    
    

    搭建完成,生成bit流然后输出。

    SDK软件部分

    这里我就直接给出代码吧,详细解释在前文了。

    /*
     * helloworld.c: simple test application
     *
     * This application configures UART 16550 to baud rate 9600.
     * PS7 UART (Zynq) is not initialized by this application, since
     * bootrom/bsp configures it to baud rate 115200
     *
     * ------------------------------------------------
     * | UART TYPE   BAUD RATE                        |
     * ------------------------------------------------
     *   uartns550   9600
     *   uartlite    Configurable only in HW design
     *   ps7_uart    115200 (configured by bootrom/bsp)
     */
    
    #include <stdio.h>
    #include "platform.h"
    #include "xil_printf.h"
    #include "xiicps.h"
    #include "xparameters.h"
    #include "sleep.h"
    #define I2C_0_DEVICE_ID XPAR_PS7_I2C_0_DEVICE_ID
    #define I2C_0_CLK 100000
    #define IIC_0_SALV_ADDR 0x40
    // XIicPs* iicps;
    static XIicPs iicps;
    static XIicPs_Config * iicpscfgtr;
    
    
    //初始化 iic
    int initIicPs(XIicPs *iicps , XIicPs_Config * iiccfg);
    int main()
    {
        int status;
        double h_out;
        double t_out;
        unsigned short tmp;
        char CmdHumidity = 0xE5;
        char CmdTemperature = 0xE3;
        char t_temp[2];
        char h_temp[2];
        init_platform();
        status=initIicPs(&iicps,iicpscfgtr);
        if(status !=XST_SUCCESS){
        		return XST_FAILURE;
        	}
        printf("load success!\n");
        while(1){
    		status=XIicPs_MasterSendPolled(&iicps,&CmdTemperature,1,IIC_0_SALV_ADDR);
    			if(status !=XST_SUCCESS){
    						return XST_FAILURE;
    					}
    		XIicPs_MasterRecvPolled(&iicps,t_temp,2,IIC_0_SALV_ADDR);
    		status=XIicPs_MasterSendPolled(&iicps,&CmdHumidity,1,IIC_0_SALV_ADDR);
    				if(status !=XST_SUCCESS){
    							return XST_FAILURE;
    						}
    				XIicPs_MasterRecvPolled(&iicps,h_temp,2,IIC_0_SALV_ADDR);
    		tmp=(h_temp[0]<<8)|(h_temp[1]&0xfe);
    		h_out=((125*tmp)/65536)- 6;
    		tmp=(t_temp[0]<<8)|(t_temp[1]&0xfc);
    		t_out=((175.72*tmp)/65536) - 46.85;
    		printf("Humidity : %.1f   Temperature : %.1f\n",h_out,t_out);
    		usleep(1000000);
        }
        cleanup_platform();
        return 0;
    }
    int initIicPs(XIicPs *iicps , XIicPs_Config * iiccfg){
    	int status;
    	iiccfg = XIicPs_LookupConfig(I2C_0_DEVICE_ID);
    	status = XIicPs_CfgInitialize(iicps,iiccfg,iiccfg->BaseAddress);
    	if(status != XST_SUCCESS){
    		return	XST_FAILURE;
    	}
    	//set iic rate
    	status = XIicPs_SetSClk(iicps,I2C_0_CLK);
    	if(status != XST_SUCCESS){
    			return	XST_FAILURE;
    	}
    	return XST_SUCCESS;
    }
    

    运行效果

    在这里插入图片描述

    summary

    在我们进行IIC或者不同协议的开发时候,我们一定要进行电平的匹配,本次工程就是遇到了这样的问题,根据具体的开发板,传感器,还有配置的输出电平,进行合适的配置,是成功运行的关键。

    展开全文
  • SPI通信总线原理及工作过程

    万次阅读 2016-09-25 21:19:40
    SPI, serial peripheral interface, 串行外围设备接口。...常作为单片机外设芯片串行扩展接口,主要应用于EEPROM,FLASH,实时时钟,AD转换器,数字信号处理器和数字信号解码器之间。   通信原理: 以主从方式工作 MOSI
  • 单片机外设篇——SPI协议

    千次阅读 2021-01-31 14:15:40
    题外话:工作过程中,一直在移植别人写好的SPI协议,然后和外设的芯片(例如:Flash芯片、NFC芯片等)进行通信,但是都没有往底层深入的看,下午看了照着代码看了三个多小时,写这篇博客作为总结。 一、SPI协议是...
  • 1.2 微型计算机系统 外部设备:可以与CPU进行... 因为往往一个外设配备一个IO接口,所以IO接口 和 外设 之间传输多长时间没关系,当IO接口接收完数据后,通知下CPU将数据取走即可。 当CPU需要向外设写入数据时...
  • 通用定时器的工作过程(学习笔记)通用定时器框图:整张图可以分成5部分。第一部分是时钟发生器。第二部分为时基单元。第三部分为输入捕获。第四部分为输出比较。第五部分包含了几个捕获/比较寄存器。讲解如下: 第...
  • 在驱动开发过程中我们最常接触就是寄存器。内核与硬件联系紧密,但它本身属于软件,可以说是与硬件联系最紧密软件。作为软件,与硬件沟通很多情况下都是通过寄存器实现。 寄存器按照功能不同一般可以分为三类...
  • Fpclk:为外设提供时钟如定时器,UART,PWM,IIC,SPI,WatchDog等。 我板子晶振是11.0592MHz, 可以在Keil中Startup.s中设定Fcclk和Fpclk。 首先了解: MPLLCFG寄存器中MSEL位倍增器值 PPLLCFG...
  • 5.2:外设-块设备磁盘

    2020-04-14 09:23:35
    磁盘工作过程 1)磁头移动,找到柱面 2)柱面中选择读写磁道 3)旋转磁盘,将对应磁道中要读写那个扇区转到磁头下方 4)都系扇区中内容到缓存中 代码实现 1:第一层抽象-扇区到磁盘块请求 因为数据传输数据和...
  • 一 准备好你树莓派4B,TF卡(个人建议16GB+),TF读卡器。还有一台电脑。 二 去树莓派官网下载最新...等待过程中可以进行TF卡准备工作: sudo fdisk -l #查找TF卡名字,一般都是 /dev/sdb sudo umount /dev/sdb ...
  • 1 系统文件 与 ST 官方不一致 ,无法兼容Cube MX , 导致用户自行开发 外设时 需要大量初始化工作 ,而且遇到问题难以查找 原因 ,因为系统初始化过程 与官方差异较大,这点 入手比较难 2 软件包 可靠性无法...
  • 其通信方式为总线:cpu与内存,以及cpu与i/o控制芯片通过前端总线(FSB)进行通信,后来随着cpu与内存的工作频率的差异化(cpu频率日渐加快,而内存以及其他外设跟不上其频率),i/o口不需要那么高的通信频率,发展....
  • 前言:最近在学习原子阿波罗,进行到待机实验,实验目的是摁下KEY_UP时候就可以让MCU从待机模式唤醒了。...(1)睡眠模式(CM4内核停止工作外设仍在运行) (2)停止模式(所有时钟都停止) (3)待...
  • 文章目录冯诺依曼计算机模型...控制器(Control):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。 运算器(D
  • STM32F0xx_SPI读写(Flash)配置详细过程

    万次阅读 2016-06-05 00:05:43
    关于SPI(Serial Peripheral Interface)串行外设接口可以说是单片机或者嵌入式软件开发人员必须掌握一项通信方式,就是你在面试相关工作的时候都可能会问及这个问题。在这里问一个简单问题:硬件SPI和软件模拟SPI...
  • I/O口是单片机中非常常用的外设,STM32I/O口有8种状态,虽然一直在使用过程中没有遇到什么问题,但是一直都不是很清楚,因此这里做一个总结(实际上这里概念也是和STM8等其他单片机,理解了这8中状态,也就基本...
  • uboot启动过程

    千次阅读 2016-10-20 16:52:49
    1. 初始化单板,包括DDR控制器、PLL、时钟、MIO及部分外设的控制器寄存器配置; 2. 将bit文件下载到FPGA内; 3. 把u-boot.elf以及cpu1上运行的elf文件拷贝到内存中的指定位置。 那在实际应用时,应该是可以在...
  • 背景:上周用qq视频聊天都正常,这周突然显示检测不到摄像头...确保电脑除电源线以外,没有连接任何外设产品。3.同时按住左下角control,option和shift,按住15秒。这个过程中,电脑不会有任何反应。4.按下电源键...
  • 单片机有最小系统,所谓最小系统,就是单片机能正常工作所需要最少外设。对于Uboot来说,同样有个最小系统,因为Uboot最主要功能就是引导内核。下面我们通过一个简单Mini-Uboot来分析Uboot启动加载过程。...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 332
精华内容 132
关键字:

外设的工作过程