在上次的串口例程中,我们使用了两个全局变量,一个是串口接收中断完成标志,另一个是串口接收的数据,但是这两个变量在使用过程中发现了在中断中赋值后主循环检测不到改变的情况的情况。比如:
- /*******************************************************************************
- * Function Name : USART2_IRQHandler
- * Description : This function handles USART2 global interrupt request.
- * Input : None
- * Return : None
- *******************************************************************************/
- void USART1_IRQHandler(void)
- {
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生
- {
- RxBuffer[0] = USART_ReceiveData(USART1); //接收数据
- USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志
- RxOK = 1;
- USARTx_SendByte(USART1,0x01);
- }
- }
- while(1)
- {
- if(RxOK == 1)
- {
- if(RxBuffer[0] == 0x01)
- {
- Toggle_User_Led(User_LED1);
- }
- RxOK = 0;
- }
- }
当我们在中断中RxOK 置1的时候,while循环怎么也检测不到RxOK为一的情况,这是什么原因呢?
定义,定义,在定义全局变量的时候,必须要加volatile进行修饰才可以。
比如下面这样定义:
- //定义一个字节的缓冲数组
- volatile uint8_t RxBuffer[RxBufferSize]={0};
- //接收OK标志
- volatile uint8_t RxOK = 0;
|