stm32串口中断总结要点.pdf
《stm32串口中断总结要点.pdf》由会员分享,可在线阅读,更多相关《stm32串口中断总结要点.pdf(15页珍藏版)》请在三一文库上搜索。
1、本文以 USART1为例,叙述串口中断的编程过程。 1、先来讲述一下在应用串口中断时涉及到的一些库文件。 首先对于 STM32 外设库文件的应用编程,misc.c 和 stm32f10x_rcc.c 是肯定要添加到。 接下来就是我们要用到的相关外设了。毫无疑问,串口文件stm32f10x_usart.c 是必须的。 串口通信是对通用GPIO端口引脚的功能复用,所以还需要stm32f10x_gpio.c 文件。另外, 因为有中断的产生,所以中断文件stm32f10x_it.c 也是必要的,当然这个文件一般和main.c 放在一个文件夹下(一般习惯为User 文件夹 ), 因为我们的中断响应函数是
2、要在里面自己编写 的。 当然还有其他的基本必须文件如系统配置文件等在这地方就不说了,这个是创建一个工 程应该知道的。 2、初始化 对于串口通信的初始化,不仅仅只是对串口的初始化(这个地方是比较烦人的,不像别的芯 片那样简洁明了)。 首先时钟使能配置。STM32 内部的时钟有很多,感兴趣的自己看看参考手册。此处 以 USART1为例说明。有USART1时钟、 GPIOA 时钟、 GPIO复用 (AFIO)时钟。由于 此处 USART1和 GPIOA、AFIO均在 APB2上,所以可以一次配置完成。如下: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RC
3、C_APB2Periph_AFIO|RCC_APB 2Periph_USART1 ,ENABLE); 其次中断配置。主要有优先级组设定、USART1中断使能、该中断的优先级,中断初 始化。程序如下: void NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); / 选择分组方式0 /* 使能 USART 1 中断 */ NVIC_InitStructure.NVIC_IRQChannel = USART 1_IRQn; NVIC
4、_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init( 然后 GPIO复用功能配置。一般情况下我们使用原始的外设和GPIO 端口引脚的映射 关系,如果要改变其映射的话,请另外查看参考手册上关于GPIO重映射部分。对 于 GPIO的复用,其引脚的输入与输出模式都有要求,在参考手册上有详细说明。 void GPIO_Configuration(void) GPIO_InitTypeDef GPIO_InitStructure; /* 配置 US
5、ART 1 Rx 作为浮空输入 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(USARTy_GPIO, /* 配置 USART 1 Tx 作为推挽输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_ 9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_
6、AF_PP; GPIO_Init(USARTy_GPIO, 串口初始化配置。主要有串口基本参数配置(如波特率、数据位、工作方式等),串口 中断使能,串口使能。 (1) 基本参数配置 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; / 波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; / 数据长度 USART_InitStructure.USART_StopBits = USART_StopBits_1;
7、 / 停止位 USART_InitStructure.USART_Parity = USART_Parity_No; / 校验 USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;/ 硬件流控制无 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /发 送与接受两种方式 USART_Init(USART 1, / 用配置的参数惊喜串口初始化 (2) 串口中断使能 USART_ITConfig(USARTy, USA
8、RT_IT_RXNE, ENABLE);/ 使能接受中断,在接受移 位寄存器中有数据是产生 USART_ITConfig(USARTy, USART_IT_TXE, ENABLE);/ 使能发送中断,在发送完数 据后产生。 一般情况下,如果与PC通信的话,我们只用接受中断即可。 (3) 串口使能 USART_Cmd(USART 1, ENABLE); /USART1 使能 好了,经过以上不走之后呢,我们就可以进行数据的收发了。 3、发送数据 使用函数 USART_SendData(USART1, char data ),一次只能发送一个字符。当然我们可 以用如下函数发送字符串。 void US
9、ART1_Puts(char * str) while(*str) USART_SendData(USART1, *str+); / 发送一个字符 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) = RESET); / 等待发 送完毕 当然我们也可以循环发送字符串数组 for(i = 0; TxBuf1 != 0; i+) / TxBuf1为定义好的字符串数组 USART_SendData(USART2 , TxBuf1); while(USART_GetFlagStatus(USART2, USART_FLAG_TC)=RESET); 4、
10、接收数据 由于我们使用的是接受中断, 所以当有数据需要接收时, 会执相应的中断函数。 此处我 们USART1的中断函数在stm32f10x_it.c文件中。找到函数void USART1_IRQHandler(void),如 果没有的话就自己加上吧, 别忘了头文件中需要声明一下。 当然你也可以在其他文件中写下 该中断函数。当产生中断进入该函数之后,我们就可以进行自己的操作了。 void USARTy_IRQHandler(void) if(USART_GetITStatus(USARTy, USART_IT_RXNE) != RESET)/ 如果寄存器中有数据 /* Read one byte
11、 from the receive data register */ RxBuffer1RxCounter1+ = USART_ReceiveData(USART1); /* if(USART_GetITStatus(USARTy, USART_IT_TXE) != RESET) USART_SendData(USARTy, TxBuffer1TxCounter1+); / 这个地方那个之所以把这个写出来主要是想说发送中断和接受中断其实是共用一个 / 中断函数的,到底是那个中断发生了呢,这就需要我们读取中断状态标志来识别了。 */ 别忘了在接受完数据进行别的操作之前为了防止数据被覆盖最好先禁止
12、一下接受中 断/* 禁止 USART1接收中断 */ USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); /* 禁止 USART1发送中断 */ USART_ITConfig(USART1, USART_IT_TXE, DISABLE); 5、main函数 int main(void)/ 这个地方和特别,我们知道一般main函数是没有返回值的,但在 STM32/ 的编程中其返回类型为int。 RCC_Configuration(); NVIC_Configuration(); GPIO_Configuration(); USART_InitStruc
13、ture.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None; USART_InitStructure.USART_
14、Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /USART_ITConfig(USART1, USART_IT_TXE, ENABLE); USART_Cmd(USART1, ENABLE); while (1)/ 等待中断 当然你也可以在main()中添加一些发送指令之类的东西。 以上内容为个人总结,转载请注明出处。若有错误,本人概不负任何责任。 STM32 外部中断配 NVIC_Configuration 函数实现配置嵌套向量中断
15、中断优先级并使能中断。其中的 NVIC_PriorityGroupConfig 函数配置中断优先级的组织方式,STM32 的嵌套向量中断 控制器可以配置16 个可编程的优先等级,使用了4 位表示中断优先级(2 的 4 此方就 是16 ) , 16 个 可 编 程 的 优 先 等 级 又 可 以 分 为 主 优 先 级 和 次 优 先 级 , 例 如 参 数 NVIC_PriorityGroup_1表示 1bit 主优先级 (pre-emption priority)3 bits 次优先 级( subpriority )。 一、配置中断 1、 分配中断向量表: /* Set the Vector
16、 Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 2、 设置中断优先级: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /设置中断优先级 3、 初始化外部中断: /* 允许 EXTI4中断*/ NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel; /中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= Preemp
17、tionPriorityValue; / 占先优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; / 响应(次级)优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /通道中断使能 NVIC_Init( / 初始化中断 注意:如果我们配置的外部针脚为PA4 ,或 PB4 ,或 PC4, PD4 等,那么采用的外部 中断也必须是EXTI4 ,同样,如果外部中断针脚是PA1 ,PB1 , PC1 ,PD1 那么中断就 要用 EXTI1 ,其他类推。 二、配置GPIO针脚作为外部中断的触发事
18、件 1、 选择 IO 针脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; 注意,如果的针脚是端口的4 号针脚,配置的中断一定是EXTI4 2、 配置针脚为输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 3、 初始化针脚 GPIO_Init(GPIOD, 3 配置 EXTI 线,使中断线和IO 针脚线连接上 1、 将 EXTI 线连接到IO 端口上 将 EXTI 线 4 连接到端口GPIOD的第 4 个针脚上 GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,G
19、PIO_PinSource4); 注意:如果配置的针脚是 4 号,那么参数必须是GPIO_PinSource4 如果配置的针脚是3 号,那么参数必须是GPIO_PinSource3 2、配置中断边沿 /* 配置 EXTI 线 4 上出现下降沿,则产生中断*/ EXTI_InitStructure.EXTI_Line = EXTI_Line4; 注意:如果配置的4 号针脚,那么EXTI_Line4是必须的 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigg
20、er_Falling; /下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; / 中断线使能 EXTI_Init( / 初始化中断 EXTI_GenerateSWInterrupt(EXTI_Line4); /EXTI_Line4中断允许 到此中断配置完成,可以写中断处理函数。 举例: 配置函数 /* * * 函数名NVIC_Configration * 描述配置各个中断寄存器 * */ void NVIC_Configration(void) NVIC_InitTypeDef NVIC_InitStructure; /#ifdef VECT_TAB
21、_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); /#else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ /NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); /#endif NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /设置中断优先级 /
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stm32 串口 中断 总结 要点
链接地址:https://www.31doc.com/p-5198213.html