




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
STM32USART串口的应用STM32中断系统专题讲解STM32,从字面上来理解,ST是意法半导体,M是Microelectronics的缩写,32表示32位,合起来理解,STM32就是指ST公司开发的32位微控制器。在如今的32位控制器当中,STM32可以说是最璀璨的新星,它受宠若娇,大受工程师和市场的青睐,无芯能出其右。51是嵌入式学习中一款入门级的精典MCU,因其结构简单,易于教学。51诞生于70年代,属于传统的8位单片机,如今,久经岁月的洗礼,既有其辉煌又有其不足。现在的市场产品竞争越来越激烈,对成本极其敏感,相应地对MCU的性能要求也更苛刻:更多功能,更低功耗,易用界面和多任务。面对这些要求,51现有的资源就显得得抓襟见肘。所以无论是高校教学还是市场需求,都急需一款新的MCU来为这个领域注入新的活力。基于这样的市场需求,ARM公司推出了其全新的基于ARMv7架构的32位Cortex-M3微控制器内核。紧随其后,ST(意法半导体)公司就推出了基于Cortex-M3内核的MCU——STM32。STM32凭借其产品线的多样化、极高的性价比、简单易用的库开发方式,迅速在众多Cortex-M3MCU中脱颖而出,成为最闪亮的一颗新星。STM32一上市就迅速占领了中低端MCU市场,受到了市场和工程师的无比青睐,颇有星火燎原之势。作为一名合格的嵌入式工程师,面对新出现的技术,我们不是充耳不闻,而是要尽快吻合市场的需要,跟上技术的潮流。如今STM32的出现就是一种趋势,一种潮流,我们要做的就是搭上这趟快车,让自己的技术更有竞争力。STM32USART串口的应用USART:UniversalSynchronousAsynchronousReceiverandTransmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。UART:(UniversalAsynchronousReceiverandTransmitter),它是在USART基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。USART在STM32应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个USART通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。用户平时基本上用的都是UART,很多外设与STM32进行数据传送时都是用的UART。开发板与电脑对于电平的定义是不一样的,即对逻辑1和0的电平定义不同,因此需要一个转换器,和其他开发板连接时,由于电平一样,可直接连接。串口通信协议介绍:正常情况下,没有数据传输时,两端的信号线保持高电平,要发送数据时,发送方向接收方发送一个低电平,接收方就知道对面要发送数据了。接下来发送方发送数据,两端约定好数据大小是8位还是9位,一般情况下是8位,紧跟数据位后的校验位和停止位。在串行通信中,用“波特率”来描述数据的传输速率。所谓波特率,既每秒传送的二进制位数,其单位为bps(bitspersecond)。它是衡量串行数据速度快慢的重要指标。国际上规定一个标准的波特率系列:110、300、600、1200、1800、2400、4800、9600、115200、14.4Kbps、19.2Kbps、……例如:115200bps、指每秒传送115200位。通信双方必须设置同样的同学速率才能正常通信注意:实际的数据没这么多,还包括起始位,结束位,校验位。使用寄存器方法发送数据位7TXE:发送数据寄存器为空(Transmitdataregisterempty)当TDR寄存器的内容已传输到移位寄存器时,该位由硬件置1。如果USART_CR1寄存器中TXEIE位=1,则会生成中断。通过对USART_DR寄存器执行写入操作将该位清零。0:数据未传输到移位寄存器。1:数据传输到移位寄存器,也就是数据寄存器为空。注意:单缓冲区发送期间使用该位。。发送数据前一定要检查发送数据寄存器是否为空,为空才可以发送数据。voidUSART1_PutChar(uint8_tch){while(!(USART1->SR&1<<7));//等待TDR为空USART1->DR=ch;//直接将数据扔给数据寄存器}//第7位为0,与出来的结果为0,非运算之后为1,继续while循环//第7位为1,与出来的结果为非0值,非运算之后为0,退出while循环使用寄存器方法接收数据位5RXNE:读取数据寄存器不为空(Readdataregisternotempty)当RDR移位寄存器的内容已传输到USART_DR寄存器时,该位由硬件置1。如果USART_CR1寄存器中RXNEIE=1,则会生成中断。通过对USART_DR寄存器执行读入操作将该位清零。RXNE标志也可以通过向该位写入零来清零。建议仅在多缓冲区通信时使用此清零序列。0:未接收到数据1:已准备好读取接收到的数据,即读取数据寄存器不为空uint8_tUSART1_GetChar(void){while(!(USART1->SR&1<<
5));//等待RDR不为空returnUSART1->DR;}//第5位为0,没有得到数据,与出来的结果为0,非运算之后为1,继续while循环//第5位为1,数据寄存器不为空,与出来的结果为非0值,非运算之后为0,退出while循环printf的实现:intfputc(intch,FILE*p){while(!(USART1->SR&1<<
7));USART1->DR=ch;returnch;}//实现原理参考上文STM32中断系统专题讲解中断能提高CPU的效率,同时能对突发事件做出实时处理。实现程序的并行化,实现嵌入式系统进程之间的切换。NVIC(内嵌向量中断控制器:NestedVectoredInterruptControlle)的主要功能:NVIC其实就是一个中断管理的部件,这个部件和其他外设没有区别,内部仍然是由一系列寄存器构成的,它的功能都可已通过寄存器的设置来实现。控制一个中断本质上就是操作寄存器。1.中断管理Cortex-M4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断优先级设置。但STM32F4并没有使用Cortex-M4内核的全部东西,而是只用了它的一部分。Cortex-M4处理器中,每一个外部中断都可以被使能或者禁止,并且可以被设置为挂起状态或者清除状态。注:ISER:使能中断,8位刚好控制256个中断的使能,有些中断是不可以被屏蔽的。ICER:清除中断使能,8位刚好控制256个中断的清除使能ISPR:挂起中断,若中断产生但没有立即执行,它就会被挂起(产生的中断没有当前正在处理的中断的优先级高就会被挂起,但是当前中断处理完成后仍然会处理新的中断,总之,有中断就会被处理)ICPR:清除挂起,中断处理完成后应该清除挂起,表示已被处理完成,如果不清除挂起标志位,下一次CPU检查的时候发现该中断还在等待处理,就会重复触发,这不是我们想要的。也就是我们常说的清中断。IABR:每个外部中断都有一个活跃状态位,当处理器正在处理时,该位会被置1IP:用于设置中断的优先级,8位宽原则上可以设置256级优先级,但实际上STM32并没有使用到这么多,而是使用了高4位,低4位保留,共16个可编程优先级。2.中断和异常向量表Cortex-M4内核支持256个中断,其中包含了16个内核中断和240个外部中断。STM32F407实际上只使用了10个内部异常和82个外部中断。当异常或中断发生时,处理器会把PC设置为一个特定地址,这一地址就称为异常向量。每一类异常源都对应一个特定的入口地址,这些地址按照优先级排列以后就组成一张异常向量表。统一的处理方式需要软件去完成。采用向量表处理异常,M0处理器会从存储器的向量表中,自动定位异常的程序入口。从发生异常到异常的处理中间的时间被缩减。注:中断和异常的区别:中断是微处理器外部发送的,通过中断通道送入处理器内部,一般是硬件引起的,比如串口接收中断,而异常通常是微处理器内部发生的,大多是软件引起的,比如除法出错异常,特权调用异常等待。不管是中断还是异常,微处理器通常都有相应的中断/异常服务程序。3.支持嵌套中断:在执行一个中断服务程序的时候当前处理器正在执行某一中断处理程序时,在执行期间有一优先级更高,更紧急的中断需要处理,会打断当前的中断处理程序,去执行高优先级中断的处理程序,执行完成后再继续当前的中断处理程序。STM32有3个固定的优先级,都是负值,不能改变,值越小优先级越高,有16个可编程优先级,用4个bit位表示。在NVIC有一个专门的寄存器:中断优先级寄存器NVIC_IPRx(在F407中,x=0...81,即82个外部中断)用来配置外部中断的优先级,IPR宽度为8bit,原则上每个外部中断可配置的优先级为0~255,数值越小,优先级越高。但是绝大多数CM4芯片都会精简设计,以致实际上支持的优先级数减少,在F407中,只使用了高4bit。STM32还会把优先级分为两级,一级叫做主优先级,第二级叫做子优先级,主优先级又叫做抢占优先级,子优先级又叫做响应优先级。比较时首先比较主优先级,主优先级高则优先级一定高,主优先级相同时比较子优先级,响应优先级数值越小,则优先级越高。IPR中的高4位,又分为抢占优先级和响应优先级。抢占优先级在前,响应优先级在后。而这两个优先级各占几个位又要根据SCB->AIRCR中的中断分组设置来决定。这里简单介绍一下STM32F4的中断分组:STM32F4将中断分为5个组,组04。该分组的设置是由SCB->AIRCR寄存器的bit108来定义的。注意:工程开发中应当首先确定中断优先级分组,之后就不要再做修改了。4.中断优先级总结抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。同一时刻发生的中断,优先处理优先级较高的中断。高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。抢占优先级相同就看响应优先级,同样数值越小优先级越高。如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。如果同时发生则优先处理编号较小(对10个内部异常和82个外部中断所对应的中断入口进行编号,如EXIT5-EXIT9合用一个中断入口,其编号为23,内部异常的中断入口编号均为负数)的那个,也就是异常向量表中排前面的先执行。EXTI,外部中断控制器简单来说,EXTI就是管理GPIO产生的中断,是GPIO与NVIC连接的中介,由于GPIO管脚太多,需要一个统一管理,就是EXIT,而其他的片内外设如串口、定时器、I2C等产生的中断直接被NVIC管理。EXTI共有16个通道选择器,每一个编号相同的GPIO管脚连接到编号相同的通道选择器中,每个通道选择器最终输出一根中断输入线,工作时,每一个选择器下同时只能有一个管脚被配置使用,具体配置哪一个管脚由该器件的外部中断配置控制器SYSCFG配置。EXTI0-EXTI4每一个都有单独的中断入口,而EXTI5-EXTI9合用一个中断入口,EXTI10-EXTI15也合用一个中断入口。一个SYSCFG只能配置4个通道选择器,因此需要4个SYSCFG。外部中断处理流程:1:中断输入线,外部管脚产生的中断由此输入。可以是高电平,也可以是低电平,根据设定要求产生2:边沿检测电路会根据设定中断产生的方式检测电平,判断是否发生中断,如上升沿触发中断、下降沿触发中断或者上升沿和下降沿均可触发中断3:如果2满足条件,会经过一个“或”门,“或”表示由外部输入的中断信号可以触发中断,内部的事件也可以产生中断,如定时器的更新事件等,不论外部内部,只有有一个就继续下去如果是电平,就向上走,如果是事件就向下走4:通过一个“与”门,与表示新来的中断已被挂起(中断产生还未处理)记录,且次此中断没有被屏蔽,二者同时满足后可交由NVIC处理,传送至内核进行响应。、按键中断实例配置GPIO为外部中断模式,触发方式为下降沿触发,使能外部中断入口,设置优先级,包括主优先级和子优先级。在CubeMX中只要使能了中断入口肯定会生成对应的中断处理函数,这些处理函数被归纳到stm32f4xx_it.c当中,这里面的文件都是中断处理函数的入口(IRQHander,InterruptReQuestHander,中断处理请求函数)在此文件的相应的函数入口处一步步追下去,就可以得到相应的中断处理代码。这里的Callback函数一般是若函数,意味着用户可以对该函数进行重新编写完成自己的逻辑功能。将该函数复制到gpio.c中进行重新编写,复制时不需要复制函数前的__weak(弱函数典型的标记为函数前有__weak),因此在整个工程里就会有两个同名的函数,系统在编译的时候遇到两个同名函数时,就会自动忽略有__weak标记的函数,转而去编译用户自己编写的同名函数。//gpio.cvoidHALGPIOEXTI_Callback(uint16_tGPIO_Pin){if(GPIO_Pin==GPIO_PIN_9){HAL_Delay(20);//延时,用于消除抖动if(HAL_GPIO_ReadPin(GPIOI,GPIO_PIN_9)==GPIO_PIN_RESET){//读管脚为低电平表示确实被按下了printf("KEY3INTsuccessn");}}}//main.cinclude"gpio.c"include"usart.c"main(){MX_GPIO_Init();//对GPIO口时钟配置,中断优先级配置,触发方式等的初始化MX_USART1_UART_Init();对USART1初始化配置while(){}}HAL_Delay()函数是由Systick定时器实现的,也涉及到一个中断的处理过程,执行的是系统内部的定时器产生的异常处理函数,因此设置按键中断的优先级必须要比HAL_Delay()要小,否则HAL_Delay()函数无法抢占导致程序死掉。串口中断实例、配置串口管脚参数,使能串口中断入口,设置优先级分组,设置串口中断优先级。1.HAL_UART_IRQHandler(&huart1);追进去有相当多类型的中断处理函数,选择串口在传输模式下发送完成的中断处理函数。用户只需实现voidHAL_UART_TxCpltCallback(UART_HandleTypeDef*huart)的逻辑代码2.HAL_UART_IRQHandler(&huart1);追进去有相当多类型的中断处理函数,选择串口在接收模式下的中断处理函数。该中断处理函数仍然会调用一个回调函数。用户只需实现voidHALUARTRxCpltCallback(UARTHandleTypeDef*huart)的逻辑代码串口中断有专门的串口接收中断函数和发送中断函数用来触发中断。HAL_UART_Transmit_IT();HAL_UART_Receive_IT();//main.cinclude"gpio.c"include"usart.c"uint8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供应链协同管理试题及答案集锦
- 高效学习2024年CPSM考试试题及答案
- 供应链管理师团队建设知识试题及答案
- 四川省眉山市重点中学2025届高考仿真卷化学试卷含解析
- 蛋白质的折叠与功能的关系试题及答案
- SCMP问题梳理与试题及答案
- 2024年物流师考试的重点难点试题及答案
- 2024年CPSM考试基本概念试题及答案
- 铸铁闸门吊装专项施工方案
- 2025四川西南航空职业学院辅导员考试题库
- 材料研究方法重点总结
- 道德与法治课件:《学会宽容》PPT课件(第1课时)
- 平行四边形对角线的性质 (4)
- 新媒体运营-如何打造私域流量PPT课件(带内容)
- 北京语料库检索使用说明
- 高职单招英语单词
- 睿智cpld开发板用户手册10版本
- 高效执行四原则
- 勇者斗恶龙怪兽篇 金手指
- 喷油车间生产管理制度 (共5篇)
- 课题研究思路流程图
评论
0/150
提交评论