精华内容
下载资源
问答
  • 串口中断顺序及原理

    2013-12-10 11:16:17
    //打开串口中断 } /*-------------------------------------------------------------- 发送一个字节 --------------------------------------------------------------*/ void SendByte(unsigned char ...
  • 原理框图(中断,串口中断,CLK)

    千次阅读 2014-09-09 21:38:35
  • 串口中断接收通信实验 熟悉MCU的异步串行通信(SCI)的工作原理。 掌握SCI的通信编程方法。
  • (一)项目任务ü 任务1:用定时方式控制LEDn 子任务1.1 两种定期器的认识n 子任务1.2 掌握定期器的定时原理和计算方法n 子任务1.3 采用定时器方法实现点亮LED功能ü 任务2:采用按键扫描控制LEDn 子任务2.1 C语言--...

    (一)项目任务

    ü 任务1:用定时方式控制LED

    n 子任务1.1 两种定期器的认识

    n 子任务1.2 掌握定期器的定时原理和计算方法

    n 子任务1.3 采用定时器方法实现点亮LED功能

    ü 任务2:采用按键扫描控制LED

    n 子任务2.1 C语言---swtich语句认识

    n 子任务2.2 中断系统的认识

    n 子任务2.3 采用定时和中断方式驱动按键

    (二)相关知识点

    2.1、定时器的基本概念

    标准的51单片机有T0和T1两个定时器,52单片机多一个T2定时器,其余跟51单片机一样,有细心的读者会发现项目中用的是52单片机,名称却为51单片机,通常情况下把51和52单片机统称为51单片机。

    举个例子说明定时器工作的基本原理,假设一个水瓶的容量为65536ml,现在以1ml/s的速度往水瓶里滴水,那么需要65536s才能将水瓶滴满,再滴一滴水就会溢出。从中得到的启发是只要速度一定,可以根据滴的次数可以知道时间。假设现在需要定时30000s,只需往空瓶子里滴30000滴水即可,但是这样的话需要一直盯着水滴数。其实还有更好的办法,可以预先往水瓶里滴35536ml的水,再往水瓶里滴水,只要发现水瓶里的水溢出表示30000s的时间到了,定时器的工作方式亦是如此,使用定时器前首先了解相关寄存器。

    33b2dc77945c3f433c86e6ff53a52998.png

    章项目都以配置定时器T0为例,首先看下TCON寄存器各个位的含义。

    5a1712f4d056116a28879da34709209c.png

    TF1:定时器/计数器T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置“1”,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”(TF1也可由程序查询清“0”)。

    TR1:定时器T1的运行控制位。该位由软件置位和清零。TR1=1时就允许T1开始计数,TR1=0时禁止T1计数。

    TF0:同理与TF1,TF1是针对定时器/计数器T1,TF0是针对定时器/计数器T0。

    TR0:同理与TR1,TR1是针对定时器T1,TF0是针对定时器T0。

    5ae9cc90e620ddaa3f9c7bc0f86071cd.png
    表3 寄存器TMOD各位功能描述(不可位寻址)

    0d13d263b676ad8db14f149dd610e20a.png

    常用的模式有模式1和模式2,模式2常用在串口通信中,本项目中以模式1为主。注意寄存器TCON可以寻址,寄存器TMOD不可位寻址。寻址的意思是可以单独操作寄存器中的某一位,例如寄存器TCON中的第四位TR0可以取出来单独赋值,进行TR0 = 1或者TR0 = 0操作,但寄存器TMOD不可单独操作某个位,只能进行整体赋值,例如TMOD = 0x01。

    定时器内容较为丰富,建议大家阅读官方数据手册。本节部分内容摘自该手册定时器部分,本节只列出了定时器需要用到的寄存器,仅供参考。

    采用查询法配置定时器的步骤:

    1、通过配置定时器TMOD确定定时模式;

    2、将计算得到的初值装载到TH0和TL0;

    3、通过配置TR0启动定时器0;

    4、判断标志位TF0,如TF0为1表示溢出,可以通过软件方式清零再重新进行监测。

    2.2、定时器的定时计算

    时钟周期定义为时钟脉冲的倒数(时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12000000),是计算机中最基本的、最小的时间单位。

    机器周期是指完成一个基本操作所需要的时间。机器周期主要针对汇编语言而言,在汇编语言下程序的每一条语句执行所使用的时间都是机器周期的整数倍,而且语句占用的时间是可以计算出来,而C语言一条语句的时间是确定的。51单片机系列在其标准架构下一个机器周期是12个时钟周期,也就是12/11059200秒。现在有不少增强型的51单片机,其速度都比较快,有的1个机器周期等于4个时钟周期,有的1个机器周期就等于1个时钟周期,也就是说大体上其速度可以达到标准51架构的3倍或12倍。因为项目中使用的是标准的51单片机,机器周期是12个时钟周期。

    再讲解下定时器和计数器这两个概念。定时器和计数器是单片机内部的同一个模块,通过配置SFR(特殊功能寄存器)可以实现两种不同的功能,大多数情况下是使用定时器功能,因此也主要来讲定时器功能,计数器功能大家自己了解下即可

    配套的单片机学习版采用的12M的无源晶振,那么时钟周期为1/12000000,机器周期为12/12000000,假设定时20ms,那么需要的机器周期为0.02/(12/12000000)=20000个,根据2.1小结讲解的需要在定时器预装65536-20000=45536个值,因为采用的定时模式1,将45536化为十六进制装载到寄存器TH0和TL0中,45536 / 256=177,45536 % 256=244,将177转化为十六进制0XB1装载到TH0,将244转化为十六进制0XF4装载到TL0。

    同理可以计算得16位寄存器最大能定时65536*(12/12000000)≈65ms,一般来说定时的时间尽量取在0~65ms中间值,如本例中定时器配置的定时20ms,如需定时1s,只要定时循环50次即可。读者可以计算下定时50ms需要多大的装载初值。

    注意:当采用11.0592M晶振时,采用类似的计算方式!

    2.3、C语言-----“|”,“&”

    对不可寻址的寄存器需要同时处理8个位,例如采用定时器0的模式1(M1=0,M0=1),配置寄存器TMOD=0x01,改配置虽然正确配置了第0、1位,同时也改变了第2到第7位,因此希望通过某种操作方式只改变第0、1位。在实际操作过程中采用TMOD=TMOD&0XFC,TMOD= TMOD|0X01,看似更为复杂,其实逻辑更为严谨。

    运算符“|”表示“按位或”,例如“1|1”为1,“1|0”为0,“0|1”为1,“0|0”为0,可见1“或”任何数都为1,0“或”0才为0。

    运算符“&”表示“按位与”,例如“1&1”为1,“1&0”为0,“0&1”为0,“0&0”为0,可见0“与”任何数都为0,1“与”1才为1。

    2.4、C语言-----swtich语句

    在项目三中采用if else语句用于条件的判断,如果条件较多的情况一般采用swtich语句,如下所示。在switch语句中有四个关键字,分别为switch、case、default和break。当switch后的表达式满足某个case后的常量表达式时,运行该case以后的语句块。注意每个case后面都需要break,表示跳出swtich语句。default表示当表达式没有匹配的case时,运行default后的语句块。

    switch(表达式)
    {
    case常量表达式1: 执行语句;break;
    case常量表达式2: 执行语句;break;
    case常量表达式3: 执行语句;break;
    case常量表达式4: 执行语句;break;
    default: 执行语句;break;
    }

    2.5、中断系统

    CPU正在运行时,外界发生了紧急事件请求,CPU暂停当前工作,处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。向CPU请求中断的源称为中断源。中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,有个优先响应的问题,在本项目中只涉及到定时器0和定时器1的中断,详细请参看芯片手册中P156。

    通过一个例子帮助读者理解中断含义,比如小明在家看电视,突然听到有敲门声,按下电视遥控暂停键去开门,开完门后继续看电视,这就是中断也是最常用的中断形式。还是小明在家看电视,突然听到有敲门声,按下电视遥控的暂停键再去开门,刚走到门口突然听到厨房里水开的声音,急忙跑到厨房把电源关了,再去开门,开完门后继续看电视,这是嵌套中断,在 “开门”这个中断源里又有“关电源”这个中断源,小明会根据事重缓急优先处理各个事件,单片机也是如此。

    bd37651de0e9276005ee417e6bc819f9.png
    图1 中断优先查询次序

    b1ad206b04e50b1251eea196b45c444e.png
    图2 C语言优先中断查询函数

    采用中断系统需编写中断函数,如3.2小节采用定时器0,中断函数为“void InterruptTimer0() interrupt 1”,它的格式为“void 变量名() interrupt 1”,变量名后的括号里 “void”可写可不写,其余部分要按照规范写,如图2所示一般将中断函数放在程序的末尾,函数名不需要进行声明!

    表5 中断允许寄存器(可位寻址)

    c543f3e33fb3752fd1f5da914d55b76e.png

    如表5所示,介绍常用的控制位。

    EA:CPU的总中断允许控制位,EA=1,使能总中断,EA=0,关闭总中断。

    ET0:T0的溢出中断允许位。ET0=1,允许T0中断;ET0=0禁止T0中断。

    ES:串行口1中断允许位。ES=1,允许串行口1中断;ES=0,禁止串行口1中断。

    IE中断允许寄存器在本项目中只要用到了第一、七位,定时器常配合中断使用,因此要使能EA和ET0位,同时也介绍了第四位ES,因为在串口中断中也会用到。

    2.6、全局变量和局部变量

    全局变量:在所有函数外部定义的变量称为全局变量,它的作用域贯穿整个程序。全局变量定义必须在所有函数之外。在项目3第3.2小结程序中定义的table1[15],变量定义在主函数和子函数之外。在同一源文件中,允许全局变量和局部变量同名,在局部变量作用域内,同名的全局变量不起作用。

    局部变量:函数内部的变量称为局部变量,它的作用域仅限于函数内部,该函数结束后里面的变量也无效了。不同函数里面局部变量可以同名,分配不同的存放单元,互不相干,对于初学者编者建议尽量使用不同变量名。

    由于定义全局变量会永久占用单片机内存单元,局部变量只有在具有该变量的函数使用时才会占用内存,使用完该函数后会自动释放内存,因此编者建议尽量使用局部变量。

    在本项目3.2小节Key_Scan()函数中有“static unsigned char cnt1=0xFF”语句,把“cnt1”叫做静态局部变量,若没有“static”这个关键字,“unsigned char cnt1=0xFF”语句中的“cnt1”叫做局部变量。举例说明,变量cnt1在Key_Scan()函数作用后变成0xAA,那么Key_Scan()被调用完成后释放内存空间,再下次调用Key_Scan()时,变量cnt1又恢复到初值0xFF,但是我们不希望变成初值,而是希望执行上一次函数执行结束后的值0xAA,那么在不使用全局变量的情况下可以通过添加“static”关键字实现。

    (三)设计实施

    3.1、查询法定时

    #include <reg52.h>
    sbit LED=P0^4;
    void main()
    {	
    	unsigned char cnt=0;
    	TMOD &= 0XFC; // TMOD= TMOD&0XFC 可以简写成TMOD &= 0XFC
    	TMOD |= 0X01;	// TMOD= TMOD|0X01 可以简写成TMOD |= 0X01
            TH0 = 0XB1 ; //定时20ms
    	TL0 = 0XF4;
    	TR0 = 1;  //启动定时器,TR为Time Run
    	 while(1)
    	 {
    		  if(1 == TF0)  //检测标志位是否为1,TF为Time Flag
    			{
    				TF0 = 0;//标志位要及时复位,方便下次计时
    				TH0 = 0XB1;//重新加载初值
    			        TL0 = 0xF4;
    				cnt++;
    				if(cnt >= 50)
    				{
    					cnt=0;
    					LED=~LED;
    				}		
    			} 
    	 }
    }
    

    ① 在项目二中采用delay函数延时的方式来闪烁LED,虽然跟本小节的实验现象一致,但是有根本性区别。delay函数是在延时过程中占用了大量CPU资源,因此不能进行其他函数运行,如果模块较多会造成信号堵塞,影响其他功能运行。定时器是由独立的模块运行,不占有CPU资源,可以让单片机做更多的事,因此在以后项目中尽量采用定时器定时。

    ② 定时器模式1在发生溢出后会自动清空初值,因此在每次计数时要重新加载初值;

    ③ “1==TF0”也可以写成“TF0==1”,因为该语句的含义是判断TF0是否为1,如果写成

    “TF0==1”方式,有可能写成“TF0=1”,这样的话程序不会报错,但是语句是有问题的;如果写成“1 ==TF0”,那么如果漏了一个等号写成“1 =TF0”,程序会直接报错,这种方式方便读者查错。

    ④ 如果采用变量进行计数,如小节中的cnt,一定要及时清零;

    ⑤ TMOD、TH0、TR0等一些定时器相关的变量都在头文件中进行过定义,因此不需要再重新定义;

    3.2、按键中断法

    #include <reg52.h>
    sbit LED1 = P0^4;
    sbit LED2 = P0^5;
    sbit KEY1 = P3^4;
    sbit KEY2 = P3^5;
    unsigned char KeyNum=0;   
    unsigned char KeyLock1=0; //按键1的标志位
    unsigned char KeyLock2=0; //按键2的标志位
    void KEY_Scan();
    void KEY_Action();
    void main()
    {	
    	EA = 1;//打开总中断
    	TMOD &= 0XFC;
    	TMOD |= 0X01;
    	TH0 = (65536-2000)/256;//定时2ms
    	TL0 = (65536-2000)%256;
    	ET0 = 1;
    	TR0 = 1;
    	 while(1)
    	 {
    		  KEY_Action();
    	 }
    }
    void KEY_Scan()
    {
    	static unsigned char cnt1=0xFF;
    	static unsigned char cnt2=0xFF;
      	cnt1 =(cnt1<<1)|KEY1;//a语句
    	cnt2 =(cnt2<<1)|KEY2;
    	if(cnt1 != 0x00) // b语句
    	{
    		KeyLock1=0;//c语句
    	}
    	else if(KeyLock1==0)// 检测到按键按下状态且第一次按下
    	{
    	  	KeyNum = 1;
    		KeyLock1=1;// 防止重复触发
    	}
    	if(cnt2 != 0x00)
    	{
    		KeyLock2=0;
    	}
    	else if(KeyLock2==0)
    	{
    	  	KeyNum = 2;
    		KeyLock2=1;
    	}
    }
    void KEY_Action()
    {
    	 switch(KeyNum)
    	 {
    	    case 1:LED1 =!LED1; KeyNum = 0;break;
    	    case 2:LED2 =!LED2; KeyNum = 0;break;
    	   	default:break;          
    	  }
    }
    void InterruptTimer0() interrupt 1
    {
        TH0 = (65536-2000)/256;
    	TL0 = (65536-2000)%256;
    	KEY_Scan();
    }
    

    ① 按键操作采用定时中断的方式,有效避免了delay函数占用CPU资源,在以后的程序中推荐使用这种方式;

    ② 按键定时中断的原理是将按键部分分为两部分,一部分是按键扫描KEY_Scan()在中断函数中每隔2ms进行扫描,另一部分是按键函数KEY_Action()在while函数中不停运行等待指令执行,当KEY_Scan()函数检测到按键按下,那么就执行KEY_Action()函数内容;

    ③ KEY_Scan()函数每隔2ms检测变量cnt1是否为0x00,0x00表示按键按下,若检测到非按下状态,标志位KeyLock1为0。若检测到按键按下状态且第一次按下,则KeyNum = 1,同时将KeyLock1赋值为1,防止重复触发。注意else if语句一定要结合if理解。

    ④ KEY_Scan()中的“cnt1 =(cnt1<<1)|KEY1”语句用来检测按键是否按下,cnt1初值为0b1111 1111,假设按键已稳定按下,则KEY1为零,经过第一个2ms后cnt1为(11111111<<1)|0,即1111 1110,经过第2个2ms后cnt1为(11111110<<1)|0,即1111 1100…..那么经过8个2ms后此时cnt1为0x00,此状态法有效解决按键抖动问题;

    ⑤ cnt2同理于cnt1;

    ⑥ KEY_Action()函数接收到KeyNum的值进行相应的动作。

    (四)小结

    1、熟练掌握定时器、中断的使用方法;

    2、掌握按键中断扫描的方法;

    3、掌握swtich使用方法。

    可以在B站观看相关视频!!

    哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili

    展开全文
  • 说明:本次基于ZYNQ-7000系列的串口中断控制器设计主要实现通过PC机串口助手软件发送指令实现控制PS端LED的功能,整体设计不复杂,旨在于理解ZYNQ系列的串口控制器的原理以及用法,主要参考资料来自UG585官方文档。...
    说明:本次基于ZYNQ-7000系列的串口中断控制器设计主要实现通过PC机串口助手软件发送指令实现控制PS端LED的功能,整体设计不复杂,旨在于理解ZYNQ系列的串口控制器的原理以及用法,主要参考资料来自UG585官方文档。
    相关理论

    在ZYNQ7000系列器件中,UART控制器是一个全双工异步收发控制器,ZYNQ内部包含两个UART控制器,UART0和UART1。每一个UART控制器支持可编程的波特率发生器、64字节的接收FIFO和发送FIFO、产生中断、RXD和TXD信号的环回模式设置以及可配置的数据位长度、停止位和校验方式等。
    在这里插入图片描述
    由上图可知,UART控制器和IO端口由参考时钟(UART REF_CLK)驱动,同时控制器也需要连接APB总线时钟(CPU_1x clock),UART REF_CLK和CPU_1x clock都是来自于PS时钟子系统。UART控制器的配置以及状态的获取由控制(Control)和状态寄存器(Status Registers)完成。另外,UART控制器不仅可以连接至MIO,也可以映射到EMIO,从而使用PL的端口来实现串口通信的功能。当UART控制器连接到MIO时,只有Tx(发送)和Rx(接收)两个引脚;而当连接EMIO时,除Tx和Rx引脚外,可选的还有CTSN、DSDN、DSRN等引脚,这些引脚用于串口的流控制,即调制解调器的数据通讯中。UART控制器采用独立的接收和发送数据路径,每个路径包含一个64字节的FIFO,控制器对发送和接收FIFO中的数据进行串并转换操作。FIFO的中断标志支持轮询处理或中断驱动处理两种方式。另外,控制器中还有一个模式开关,支持 RXD 和 TXD 信号的各种环回配置。
    在这里插入图片描述
    UART控制器的寄存器通过APB从机接口和PS AXI总线互联,控制器的寄存器用于对UART控制器进行配置和获取状态。波特率发生器(Baud Rate Generator)为UART控制器的接收端和发送端提供位周期时钟;中断控制器(GIC)为串口的收发提供了中断服务的功能。APB总线接口通过向TxFIFO寄存器写值,将数据加载到TxFIFO存储器中。当数据加载至TxFIFO后,TxFIFO的空标志变成无效的状态,直到最后一个数据从TxFIFO中移出,加载至传输移位寄存器,TxFIFO恢复空的标志位。同时TxFIFO使用TFULL(满中断状态)用于表示当前TxFIFO已经写满,并且会阻止数据继续写入。如果此时继续执行写操作,那么会触发溢出,数据不会加载到TxFIFO中。RxFIFO存储器接收来自接收移位寄存器的数据,当接收完数据后,RxFIFO空标志信号同样变成无效的状态,直到所有的数据通过APB总线发送出去。RxFIFO的满标志状态用于表示RxFIFO已经写满,并且会阻止更多的数据写入。

    在这里插入图片描述
    对于串口的启动顺序,我们根据ug585指导手册可以总结如下:

    1. 复位控制器(在 PS 系统复位时);
    2. 配置IO引脚信号。RxD和TxD可以连接至MIO或者EMIO,只有EMIO可以使用串口的流控制。
    3. 配置UART参考时钟;
    4. 配置控制器功能(UART 控制器初始化);
    5. 配置中断,通过中断来管理RxFIFO和TxFIFO;
    6. 配置串口流控制(可选);
    7. 管理发送和接收的数据,可以采用轮询或中断驱动处理两种方式。

    本次我们在设计中采用了串口的中断方式控制,通过PC端发送一个八位的数字,开发板接收数据并进行比较判别,然后选择点亮或熄灭PS端的LED灯,用这个设计来进一步理解串口控制器的工作原理。
    在这里插入图片描述
    在串口初始化函数中,我们初始化串口设备,并让串口设备进行自检,然后在设置串口的工作模式和相关参数,例如波特率、停止位、校验位等,另外我们还要设置中断的触发等级,它可选由1-63,即当RxFIFO或者TxFIFO中写入对应的字节数,便会触发中断。
    在这里插入图片描述
    在串口的中断系统初始化中,我们将串口中断服务函数连接到串口的中断控制器上,并使能中断控制器,设置串口的中断触发方式为RxFIFO触发。
    经过编译与调试,我们采用单步仿真的方法确认了代码的逻辑没有问题,然后下载到开发板中进行测试,我们SDK软件下方的SDK Terminal窗口中连接上串口,下载验证成功。

    PS:代码工程见资源附录
    展开全文
  • STC单片机不断电下载程序.rar(723.45 KB, 下载次数: 1)原理:先测试出STC-ISP下载软件下发的串口命令,在程序中开启串口中断,中断接收得到下载命令就执行一条单片机复位命令,程序就自动下载进去了,整个...

    adfa1f2910b4c0d7ec8dde1af3b71a2e.gifb4c9b9c115f86518a92c89452d4d8def.png

    时间长了,居然把这个简单实用的功能忘了,重新整理了下,适用于STC89、STC12、STC15、STC8等所有型号的STC单片机快速高效下载程序。完整工程可查看附件。141e04135153988e312fd6460f314ef9.png STC单片机不断电下载程序.rar (723.45 KB, 下载次数: 1)原理:先测试出STC-ISP下载软件下发的串口命令,在程序中开启串口中断,中断接收得到下载命令就执行一条单片机复位命令,程序就自动下载进去了,整个过程不断电,也不需要操作复位按钮,下载过程不需要触碰硬件。791a60653d596554228a6ae079526345.png   1   下载最低波特率9600d3dbbdbecb729e2ce43fd157642a207c.png   2   接收波特率9600

    接收波特率9600,接收到的连续数据为7F,接收波特率不同,结果也会不一样。

    知道了STC-ISP软件下发的数据,我们程序开启串口接收中断,判断接收的数据如果是这里7F,让单片机执行一条复位命令,程序就下载进去了。

    #include "STC15W4K.H"      // 包含 "STC15W4K.H"寄存器定义头文件

    unsigned  char num=0;       // 存放接收到的1个字节的数据

    void delay500ms(void)

    {

       unsigned char i,j,k;

      for(i=93;i>0;i--)     //注意后面没分号

      for(j=235;j>0;j--)    //注意后面没分号

      for(k=125;k>0;k--);    //注意后面有分号

    }

    void UART_init(void)

    {        

        // 下面代码设置定时器2

        T2H  = 0xFD;  //波特率:9600 /22.1184MHZ,1T

        T2L  = 0xC0;  //波特率:9600 /22.1184MHZ,1T

        AUXR = 0x15;    // 0001 0101,T2R=1启动T2运行,T2x12=1,定时器2按1T计数,S1ST2=1

        // 下面代码设置定串口1

        SCON = 0x50;  // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接收)

        // 下面代码设置中断

        ES   = 1;     //开串口1中断

        EA   = 1;     //开总中断

    }

    void main()

    {

        UART_init();

        P00=0;

        delay500ms();

        P00=1;

        while(1)

        {

           P01=!P01;

           delay500ms();

        }

    }  

    void UART1(void) interrupt 4 // 串行口1中断函数

    {

        if(TI)

        {

           TI = 0;           

        }

        if(RI)

        {

           RI = 0;

           num = SBUF;

           if (num==0x7F)  

           {

               IAP_CONTR   =    0x60;   //0110,0000  软复位到系统ISP监控区

           }      

        }

    }

    本文转自网络,版权归原作者,如果您觉得不好,请联系我们删除!

    ↓点击下方

    “阅读原文”

    查看更多

    展开全文
  • 没写博客的感悟:昨天没有写博客,...今天主要总结和复习三个知识点,NVIC中断优先级管理、串口通信、及串口通信的简单配置实例: 第一部分: NVIC中断优先级管理: 首先是中断分组,我们知道所用的CM3内核支持
  • 串口调试小节之二 串口通讯原理

    千次阅读 2015-06-08 10:49:14
    我们以接收方为例,详细讲解串口通讯的简单原理,一个串口数据的接收情况基本如下:  主要分了三层: 1、  硬件层:负责将比特位转换成字节型数据,并且将数据传输的通讯状态记录下来,产生中断让驱动读取,...
  • 时间在2021年1月26日,寒假放假在家好好学一学 开发板:初雪的100出头那块 NRF52840 EVAL KIT 下载工具:JINLK V11(最好是...参考资料: NRF52840-Eval-Kit-Schematic.pdf(原理图) nRF5_SDK_17.0.2_d674dde(官方例程.
  • 2.怎么进行触屏开发2.1 关键词定义和工作原理页面:一个串口触摸屏一般可以制作多个页面,一个页面对应着一幅画面,每个页面需要编号。控件:串口触摸屏上大部分显示的图形和文字都可以当作控...
  • 图上是串口的结构图。 SBUF是数据缓冲寄存器,发送和接收用的是一个地址,但是不用担心冲突,读只能从接收缓冲区,写只能在发送缓冲区里。 寄存器SCON(SM0 SM1 SM2 REN TB8 RB8 RI) SM0和SM1: 工作方式选择(0...
  • 这一节实现利用中断实现串口中断功能,关于串口原理我就不再讲述了,如果不明白,就请查看我的另一篇博客  http://blog.csdn.net/mybelief321/article/details/8931064  下面我还是贴出自己的实验代码,...
  • 原文来自 ... 今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM...IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢...
  • STM32串口IDLE中断

    2020-07-29 00:45:47
    后面我发现有个很好的东西,串口IDLE中断,能自动响应你从电脑(别的串口)接收到的不定长数据。而不是一直干等着。 先简单说说原理吧,大概是,你的stm32接收数据时,并不会马上把数据马上处理掉,而是写到你定义的缓冲区里...
  • 在时钟设置语句中或在main.c初始化语句中加入: NVIC_SetVectorTable(0x20000000,0x0); 原理是让中断向量表映射到SRAM中。
  • 关于单片机串口原理

    2014-11-21 20:43:26
    //允许串口中断 汇编中可用 SETB EA ;允许总中断 SETB ES ;允许串口中断 当单片机接收到一帧数据后,RI会置1,向CPU申请中断,若之前有中断允许,则产生了中断,进入中断服务程序。当然,单片机发送完一帧数据,TI...
  • 串口空闲中断+DMA.zip

    2019-05-25 13:18:56
    串口3空闲中断+DMA接收不定长度的数据,3.5TFTLCD显示接收数据内容与发送次数,并通过随机颜色增强观感。 接收不定长度数据是串口空闲中断的重要使用方法,在裁判系统、OpenMV、 Manifold数据解析的使用中帮助巨大。...
  • 今天说一下STM32单片机的接收不定长度字节...IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做...
  • 本文开发环境: MCU型号:STM32F051R8T6 IDE环境: MDK 5.25 代码生成工具:STM32CubeMx 5.2.0 ...串口接收中断的配置 串口接收DMA线的配置 示例程序及起运行流程 附件:代码工程(MDK) 文章...
  • 制定串口通信协议并定时发送一帧数据,常见的处理方法是利用空闲中断,但STM32 HAL库好像没有专用的空闲中断,自己实现起来比较麻烦,这里利用非空中断可以实现同样的功能,缺点是效率比较低,具体实现过程如下 ...
  • 文章字数:1600 干货指数:⭐⭐⭐⭐⭐导读:这里讲的内容主要是原理,文章最后小创会送大家一个【福利】(《Linux 内核设计的艺术》)配合书籍,学习效果更好。01按下电源键,打开电源我们知道pc指针是指向当前需要...
  • 串口的时序和工作原理就不写了,主要写如何应用 串口的设置除了GPIO外,需要设置的参数有波特率、数据位、停止位,校验方式; GPIO输出配置AF_PP复用推挽输出 GPIO出入配置IN_FLAOTING浮空输入 USART的配置为115200...
  • 通过中断方式接收数据,可以有效提高单片机的效率。本程序采用中断方式接收数据,并通过数码管显示出来,很简单,仅仅是对初学者知道中断的基本操作,带原理
  • 串口作为MCU的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。STM32的串口资源相当丰富的,功能也相当强劲。ALIENTEK战舰STM32开发板所使用的STM32F103ZET6最多可提供5路串口,有分数波特率发生...
  • bootloader功能介绍 初始化开发板上主要硬件(时钟,内存,硬盘), 把操作系统从硬盘拷贝到内存,然后让cpu跳转到内存中执行操作系统。...-关闭中断 CPSR I和F位设置为1,关闭,不响应任何中断。 2.初始

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 476
精华内容 190
关键字:

串口中断原理