回想起自己當時才接觸串口需要接受未知數據時,在網上聽人說可以使用空閑中斷,到處去找資料,胡亂配置碰了很多壁。而現在看見時不時還有人在問進不去空閑中斷,我就把我自己的一些經驗和配置分享給大家參考一下,希望能幫到大家。
空閑中斷出現問題,一個是可能沒有同時打開接受中斷和空閑中斷,再則就是清除空閑中斷標志位沒弄對。
單片機源程序如下:
- #include "usart.h"
- uint8_t drbuf[100];//數據存儲數組
- uint32_t rxcounter=0;//數據的位數
- uint32_t rxflag=0;//接受完成標志變量
- //配置PRINTF()
- #if 1
- #pragma import(__use_no_semihosting)
- struct __FILE
- {
- int handle;
- };
- FILE __stdout;
- //定義_sys_exit()以避免使用半主機模式
- _sys_exit(int x)
- {
- x = x;
- }
- //重定義fputc函數
- int fputc(int ch, FILE *f)
- {
- while((USART1->SR&0X40)==0);//循環發送,直到發送完畢
- USART1->DR = (u8) ch; // 可以更改串口,更改printf的輸出串口
- return ch;
- }
- #endif
- void usart1_init(uint32_t BaudRate)
- {
- GPIO_InitTypeDef GPIO_InitSTRUTURE;
- USART_InitTypeDef USART_InitSTRUCTURE;
- NVIC_InitTypeDef NVIC_InitSTRUCTURE;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
-
- GPIO_InitSTRUTURE.GPIO_Mode=GPIO_Mode_AF;
- GPIO_InitSTRUTURE.GPIO_OType=GPIO_OType_PP;
- GPIO_InitSTRUTURE.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;
- GPIO_InitSTRUTURE.GPIO_PuPd=GPIO_PuPd_UP;
- GPIO_InitSTRUTURE.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&GPIO_InitSTRUTURE);
-
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//映射千萬不要忘了
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
-
- USART_InitSTRUCTURE.USART_BaudRate=BaudRate;
- USART_InitSTRUCTURE.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
- USART_InitSTRUCTURE.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
- USART_InitSTRUCTURE.USART_Parity=USART_Parity_No;
- USART_InitSTRUCTURE.USART_StopBits=USART_StopBits_1;
- USART_InitSTRUCTURE.USART_WordLength=USART_WordLength_8b;
- USART_Init(USART1,&USART_InitSTRUCTURE);
-
- USART_Cmd(USART1,ENABLE);//上面都是按部就班的配置
-
- USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//打開接受中斷
- USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);//打開空閑中斷
-
- NVIC_InitSTRUCTURE.NVIC_IRQChannel=USART1_IRQn;
- NVIC_InitSTRUCTURE.NVIC_IRQChannelCmd=ENABLE;
- NVIC_InitSTRUCTURE.NVIC_IRQChannelPreemptionPriority=0X01;//搶占優先級為1,一般不需要搶占很高
- NVIC_InitSTRUCTURE.NVIC_IRQChannelSubPriority=0X01;//響應優先級為1
- NVIC_Init(&NVIC_InitSTRUCTURE);
- }
- void USART1_IRQHandler()
- {
- uint8_t clear,i=0;
- if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
- {
- drbuf[rxcounter++]=USART1->DR;//
- }
- else if(USART_GetITStatus(USART1,USART_IT_IDLE)!=RESET)//
- {
- clear=USART1->DR;//先讀取接受數據寄存器
- clear=USART1->SR;//再讀取發送數據寄存器解可以清除空閑中斷標志位
- rxflag=1;
- }
-
- }
復制代碼
所有資料51hei提供下載:
stm32f407zet6 串口1接受不定長.rar
(396.89 KB, 下載次數: 59)
2017-8-6 00:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|