STM32 不断进入串口中断问题 解决方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32 不断进入串口中断问题解决方法
STM32 有时候会不断进入中断,解决方法如下
1.串口初始化配置时,需要打开ORE 溢出中断,如下红色代码所示 [cpp] view plain copy
1.void Usart_Init(void)
2.{
3.
4.
5. GPIO_InitTypeDef GPIO_InitStructure;
6. NVIC_InitTypeDef NVIC_InitStructure;
7. USART_InitTypeDef USART_InitStructure;
8.
9. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENA
BLE); // 开启串口时钟
10.
11. GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_
1);
12. GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_
1);
13.
14. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pi
n_10;
15. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MH
z;
16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
17. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
18. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
19. GPIO_Init(GPIOA,&GPIO_InitStructure);
20.
21.
22.
23. USART_ART_BaudRate = 5760
0; // 配置波特率为115200
24. USART_ART_StopBits = USART_WordLen
gth_8b; // 配置数据长度为8
25. USART_ART_StopBits = USART_StopBits_
1; //设置停止位
26. USART_ART_Parity = USART_Parity_N
o; // 配置奇偶校验为NONE
27. USART_ART_HardwareFlowControl = USA
RT_HardwareFlowControl_None; // 配置硬件流为NONE 28. USART_ART_Mode = USART_Mode_R
x | USART_Mode_Tx; // 打开Rx接收和Tx发送功能
29.
30. USART_Init(USART1,&USART_InitStructur
e); // 配置
31.
32.
33. USART_Cmd(USART1,ENABLE);
34.
35. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQ
n; // 选择中断通道
36. NVIC_InitStructure.NVIC_IRQChannelPriorit
y = 2; // 抢断优先1
37. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABL
E; // 使能中断
38.
39. NVIC_Init(&NVIC_InitStructure);
40.
41.<span style="color:#ff0000;"> USART_ITConfig(USART1, U
SART_IT_RXNE, ENABLE); // 打开中断
42. USART_ITConfig(USART1, USART_IT_ORE, ENABLE);</sp
an> // 打开中断
43.
44.
45.}
2.在中断中,检测溢出中断并作处理,代码如下所示
[cpp] view plain copy
1.void USART1_IRQHandler(void)
2.{
3. u8 dat;
4.
5.<span style="color:#ff0000;"> if (USART_GetITStatus(USAR
T1, USART_IT_ORE) == SET)
6. {
7. USART_ClearITPendingBit(USART1,USART_IT_OR
E);
8. USART_ReceiveData( USART1 );
9.
10. }</span>
11.if( USART_GetITStatus(USART1,USART_IT_RXNE) != RES
ET ) // 等价于if( !RI ) 检查串口数据是否已就位
12. {
13. USART_ClearITPendingBit(USART1,USART_IT_RXNE);
14. dat = USART_ReceiveData( USART1 );
15. uart_rec_buf[uart_len++]=dat;
16. RX_TIM=UART_INIT_TIM;
17.
18. }
19.
20.}
这样就可以解决,串口不断进入中断的问题。

相关文档
最新文档