我用STM8的串口中斷接收GSM模塊的數(shù)據(jù),波特率是38400,串口接收到的字符串有時(shí)候是對(duì)的,有時(shí)候會(huì)少一個(gè)字符。我發(fā)現(xiàn)是串口溢出錯(cuò)誤引起的,如果不清除溢出標(biāo)志,就會(huì)在串口中斷里跳不出來(lái)了。 問(wèn)題是,為啥我的程序老是溢出錯(cuò)誤呢? 有的人說(shuō)是串口的FIFO不夠,所以溢出,有的人說(shuō)是中斷優(yōu)先級(jí)不夠高,是這樣么?我這里也就一個(gè)串口中斷,一個(gè)定時(shí)器中斷。希望高手指教,非常感謝??! int main( void ) { u8 *pr,i; u8 loc_temp[20]; GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast); //TXD //txd初始化為高電平互補(bǔ)推挽輸出模式 GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT); //RXD //rxd初始化為不帶中斷上拉輸入模式 CLK_PeripheralClockConfig (CLK_Peripheral_USART1,ENABLE);//開(kāi)啟USART時(shí)鐘 USART_Init(USART1,38400,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_Mode_Tx|USART_Mode_Rx);//設(shè)置USART參數(shù)9600,8N1,接收/發(fā)送 USART_ITConfig (USART1,USART_IT_RXNE,ENABLE);//使能接收中斷 USART_Cmd (USART1,ENABLE);//使能USART CLK_PeripheralClockConfig (CLK_Peripheral_TIM4,ENABLE); //使能外設(shè)時(shí)鐘 TIM4_TimeBaseInit(TIM4_Prescaler_128, 0xff); TIM4_ClearFlag(TIM4_FLAG_Update); TIM4_ITConfig(TIM4_IT_Update, ENABLE); TIM4_Cmd(ENABLE); enableInterrupts(); Delay(60000); GSM_Start_Config(); while(1) { } } //=============================================================== INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28) //串口中斷處理程序 { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ u8 cc; if( USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//接收中斷處理 { USART_ClearITPendingBit (USART1,USART_IT_RXNE);//清中斷標(biāo)志 cc=USART_ReceiveData8 (USART1); if(USART_RX_STA<200) { receive_count=0; if(USART_RX_STA==0) { count_start_flag =1;//計(jì)數(shù)器開(kāi)始計(jì)數(shù) } USART_RX_BUF[USART_RX_STA++]=cc; } else { USART_RX_STA|=1<<14; count_start_flag =0; } } if(USART_GetFlagStatus(USART1,USART_FLAG_OR)==SET)//溢出中斷處理 { USART_ClearFlag(USART1,USART_FLAG_OR); USART_ReceiveData8 (USART1); } } |
|
來(lái)自: wwkfisker1 > 《待分類(lèi)》