stm32串口中断总结23013.pdf
《stm32串口中断总结23013.pdf》由会员分享,可在线阅读,更多相关《stm32串口中断总结23013.pdf(14页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、.本文以 USART1 为例,表达串口中断的编程过程。1、先来讲述一下在应用串口中断时涉及到的一些库文件。首先对于 STM32 外设库文件的应用编程,misc.c 和 stm32f10*_rcc.c 是肯定要添加到。接下来就是我们要用到的相关外设了。毫无疑问,串口文件 stm32f10*_usart.c 是必须的。串口通信是对通用 GPIO 端口引脚的功能复用,所以还需要 stm32f10*_gpio.c 文件。另外,因为有中断的产生,所以中断文件 stm32f10*_it.c 也是必要的,当然这个文件一般和main.c 放在一个文件夹下(一般习惯为 User 文件夹),因为我们的中断响应函数
2、是要在里面自己编写的。当然还有其他的根本必须文件如系统配置文件等在这地方就不说了,这个是创立一个工程应该知道的。2、初始化 对于串口通信的初始化,不仅仅只是对串口的初始化(这个地方是比拟烦人的,不像别的芯片那样简洁明了)。首先时钟使能配置。STM32 部的时钟有很多,感兴趣的自己看看参考手册。此处以USART1 为例说明。有 USART1 时钟、GPIOA 时钟、GPIO 复用(AFIO)时钟。由于此处USART1 和 GPIOA、AFIO 均在 APB2 上,所以可以一次配置完成。如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2P
3、eriph_AFIO|RCC_APB2Periph_USART1,ENABLE);其次中断配置。主要有优先级组设定、USART1 中断使能、该中断的优先级,中断初始化。程序如下:void NVIC_Configuration(void)NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/选择分组方式 0 /*使能 USART1 中断*/NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IR
4、QChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);然后 GPIO 复用功能配置。一般情况下我们使用原始的外设和 GPIO 端口引脚的映射关系,如果要改变其映射的话,请另外查看参考手册上关于 GPIO 重映射局部。对于 GPIO 的复用,其引脚的输入与输出模式都有要求,在参考手册上有详细说明。void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;/*配置 USART1 R*作为
5、浮空输入*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(USARTy_GPIO,&GPIO_InitStructure);/*配置 USART1 T*作为推挽输出*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;.GPIO_I
6、nit(USARTy_GPIO,&GPIO_InitStructure);串口初始化配置。主要有串口根本参数配置(如波特率、数据位、工作方式等),串口中断使能,串口使能。(1)根本参数配置 USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate=9600;/波特率 USART_InitStructure.USART_WordLength=USART_WordLength_8b;/数据长度 USART_InitStructure.USART_StopBits=USART_StopBits_1;/停顿位 US
7、ART_InitStructure.USART_Parity=USART_Parity_No;/校验 USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;/硬件流控制无 USART_InitStructure.USART_Mode=USART_Mode_R*|USART_Mode_T*;/发送与承受两种方式 USART_Init(USART1,&USART_InitStructure);/用配置的参数惊喜串口初始化(2)串口中断使能 USART_ITConfig(USARTy,USART_IT
8、_R*NE,ENABLE);/使能承受中断,在承受移位存放器中有数据是产生 USART_ITConfig(USARTy,USART_IT_T*E,ENABLE);/使能发送中断,在发送完数据后产生。一般情况下,如果与 PC 通信的话,我们只用承受中断即可。(3)串口使能 USART_Cmd(USART1,ENABLE);/USART1 使能 好了,经过以上不走之后呢,我们就可以进展数据的收发了。3、发送数据 使用函数 USART_SendData(USART1,chardata),一次只能发送一个字符。当然我们可以用如下函数发送字符串。void USART1_Puts(char*str)whi
9、le(*str)USART_SendData(USART1,*str+);/发送一个字符 while(USART_GetFlagStatus(USART1,USART_FLAG_T*E)=RESET);/等待发送完毕 当然我们也可以循环发送字符串数组 for(i=0;T*Buf1!=0;i+)/T*Buf1为定义好的字符串数组 USART_SendData(USART2 ,T*Buf1);while(USART_GetFlagStatus(USART2,USART_FLAG_TC)=RESET);4、接收数据.由于我们使用的是承受中断,所以当有数据需要接收时,会执相应的中断函数。此处我们USA
10、RT1的 中 断 函 数 在stm32f10*_it.c文 件 中。找 到 函 数void USART1_IRQHandler(void),如果没有的话就自己加上吧,别忘了头文件中需要声明一下。当然你也可以在其他文件中写下该中断函数。当产生中断进入该函数之后,我们就可以进展自己的操作了。void USARTy_IRQHandler(void)if(USART_GetITStatus(USARTy,USART_IT_R*NE)!=RESET)/如果存放器中有数据 /*Read one byte from the receive data register */R*Buffer1R*Counter
11、1+=USART_ReceiveData(USART1);/*if(USART_GetITStatus(USARTy,USART_IT_T*E)!=RESET)USART_SendData(USARTy,T*Buffer1T*Counter1+);/这个地方那个之所以把这个写出来主要是想说发送中断和承受中断其实是共用一个/中断函数的,到底是那个中断发生了呢,这就需要我们读取中断状态标志来识别了。*/别忘了在承受完数据进展别的操作之前为了防止数据被覆盖最好先制止一下承受中断/*制止 USART1接收中断 */USART_ITConfig(USART1,USART_IT_R*NE,DISABLE)
12、;/*制止 USART1发送中断 */USART_ITConfig(USART1,USART_IT_T*E,DISABLE);5、main函数 int main(void)/这个地方和特别,我们知道一般 main 函数是没有返回值的,但在STM32/的编程中其返回类型为 int。RCC_Configuration();NVIC_Configuration();GPIO_Configuration();USART_InitStructure.USART_BaudRate=9600;USART_InitStructure.USART_WordLength=USART_WordLength_8b;U
13、SART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode =USART_Mode_R*|USART_Mode_T*;USART_Init(USART1,&USART_InitStructure);USART_ITConfig(USART1,U
14、SART_IT_R*NE,ENABLE);/USART_ITConfig(USART1,USART_IT_T*E,ENABLE);USART_Cmd(USART1,ENABLE);.while(1)/等待中断 当然你也可以在main()中添加一些发送指令之类的东西。以上容为个人总结,请注明出处。假设有错误,本人概不负任何责任。STM32 外部中断配 NVIC_Configuration 函数实现配置嵌套向量中断中断优先级并使能中断。其中的NVIC_PriorityGroupConfig 函数配置中断优先级的组织方式,STM32 的嵌套向量中断控制器可以配置 16 个可编程的优先等级,使用了 4
15、 位表示中断优先级2 的 4 此方就是 16,16 个 可 编 程 的 优 先 等 级 又 可 以 分 为 主 优 先 级 和 次 优 先 级,例 如 参 数 NVIC_PriorityGroup_1 表示 1bit 主优先级pre-emption priority3 bits 次优先级subpriority。一、配置中断 1、分配中断向量表:/*Set the Vector Table base location at 0*20000000*/NVIC_SetVectorTable(NVIC_VectTab_RAM,0*0);2、设置中断优先级:NVIC_PriorityGroupConfi
16、g(NVIC_PriorityGroup_0);/设置中断优先级 3、初始化外部中断:/*允许 E*TI4 中断*/NVIC_InitStructure.NVIC_IRQChannel=E*TI4_IRQChannel;/中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=PreemptionPriorityValue;/占先优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;/响 应 次 级 优 先 级NVIC_InitStructure.NVIC_IRQChannelCmd=
17、ENABLE;/通道中断使能 NVIC_Init(&NVIC_InitStructure);/初始化中断 注意:如果我们配置的外部针脚为 PA4,或 PB4,或 PC4,PD4 等,则采用的外部中断也必须是 E*TI4,同样,如果外部中断针脚是 PA1,PB1,PC1,PD1 则中断就要用 E*TI1,其他类推。二、配置 GPIO 针脚作为外部中断的触发事件 1、选择 IO 针脚 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;注意,如果的针脚是端口的 4 号针脚,配置的中断一定是 E*TI4 2、配置针脚为输入 GPIO_InitStructure.GPIO_M
18、ode=GPIO_Mode_IN_FLOATING;3、初始化针脚 GPIO_Init(GPIOD,&GPIO_InitStructure);3 配置 E*TI 线,使中断线和 IO 针脚线连接上 1、将 E*TI 线连接到 IO 端口上 将E*TI线4连接到端口GPIOD的第4个针脚上.GPIO_E*TILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource4);注意:如果配置的针脚是 4 号,则参数必须是 GPIO_PinSource4 如果配置的针脚是 3 号,则参数必须是 GPIO_PinSource3 2、配置中断边沿 /*配置 E*TI 线 4
19、 上出现下降沿,则产生中断*/E*TI_InitStructure.E*TI_Line=E*TI_Line4;注意:如果配置的 4 号针脚,则 E*TI_Line4 是必须的 E*TI_InitStructure.E*TI_Mode=E*TI_Mode_Interrupt;E*TI_InitStructure.E*TI_Trigger=E*TI_Trigger_Falling;/下降沿触发 E*TI_InitStructure.E*TI_LineCmd=ENABLE;/中断线使能 E*TI_Init(&E*TI_InitStructure);/初始化中断 E*TI_GenerateSWInte
20、rrupt(E*TI_Line4);/E*TI_Line4 中断允许 到此中断配置完成,可以写中断处理函数。举例:配置函数/*函数名 NVIC_Configration*描述 配置各个中断存放器*/void NVIC_Configration(void)NVIC_InitTypeDef NVIC_InitStructure;/#ifdef VECT_TAB_RAM /*Set the Vector Table base location at 0*20000000*/NVIC_SetVectorTable(NVIC_VectTab_RAM,0*0);/#else/*VECT_TAB_FLASH
21、*/*Set the Vector Table base location at 0*08000000*/NVIC_SetVectorTable(NVIC_VectTab_FLASH,0*0);/#endif NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/设置中断优先级 /*允许 E*TI4 中断*/NVIC_InitStructure.NVIC_IRQChannel=E*TI4_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=PreemptionPriorityV
22、alue;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);/*允许 E*TI9 中断*/.NVIC_InitStructure.NVIC_IRQChannel=E*TI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stm32 串口 中断 总结 23013
限制150内