|
最近跟老師一起準(zhǔn)備省電子設(shè)計(jì)競(jìng)賽了,老師要求先準(zhǔn)備好基礎(chǔ)的調(diào)試環(huán)境,當(dāng)然選擇usart的調(diào)試接收方法啦,由于沒(méi)確定這個(gè)項(xiàng)目后期會(huì)加進(jìn)來(lái)什么功能,不好確定每個(gè)包的大小,于是先寫好串口的不定長(zhǎng)接收包,想到的方式自然是IDLE+RXNE的查詢
1->
在IDLE里頭通過(guò)systick檢測(cè)接收空閑的時(shí)間,如果空閑時(shí)間>10ms就給標(biāo)記,停止IDLE中斷而去處理這個(gè)數(shù)據(jù)包
//USART1 IRQ handler
- void USART1_IRQHandler(void)
- {
- #if defined (USART_RECIEVE_BY_DMA)
- //handle by DMA + IDLE inquiry
- uint16_t dmaCounter = DMA_GetCurrDataCounter(DMA1_Channel5);
- if ( USART_GetITStatus( USART1 , USART_IT_IDLE ) != RESET ) {
- printf("DMA counter:%d\r\n",dmaCounter);
- //has dealt rx buffer
- // if (dmaCounter != USART_BUFF_SIZE) {
- usartRx.isDeal = false;
- DMA_Cmd(DMA1_Channel5,DISABLE);
- DMA_ClearFlag(DMA1_FLAG_GL3);
- usartRx.buffHead = USART_BUFF_SIZE - dmaCounter;
- DMA_SetCurrDataCounter( DMA1_Channel5 , USART_BUFF_SIZE );
- //reset the counter register
- // }
- USART_ClearITPendingBit(USART1,USART_IT_IDLE);
-
- USART_ITConfig(USART1,USART_IT_IDLE,DISABLE);
- //close usart IDLE interrupt
- }
- #else
- //IRQ handle by SYSTICK + IDLE inquiry
- static uint32_t thisRcvTime = 0;
-
- if ( USART_GetITStatus( USART1 , USART_IT_RXNE ) != RESET ) {
- usartRx.endTime = thisRcvTime;
- thisRcvTime = millis();
- //update lastTime recieved a byte
- usartRx.buff[usartRx.buffHead] = USART1->DR;
-
- //interval > 10ms
- if(thisRcvTime - usartRx.endTime > 10){
- usartRx.frameHead = usartRx.buffHead;
- }else{
- // usartRx.isDeal = true;
- usartRx.frameEnd = usartRx.buffHead;
- //if interval < 10ms ,stream belong to same frame
- USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
- //start idle time detect
- }
- usartRx.buffHead = (usartRx.buffHead + 1)%USART_BUFF_SIZE;
-
- USART_ClearITPendingBit(USART1,USART_IT_RXNE);
- }
- //detect IDLE time
- if ( USART_GetITStatus( USART1 , USART_IT_IDLE ) != RESET ) {
- if(millis() - thisRcvTime > 10 ){
- USART_ITConfig(USART1,USART_IT_IDLE,DISABLE);
- //close idle interrupt for save CPU
- usartRx.isDeal = false;
- }
- USART_ClearITPendingBit(USART1,USART_IT_IDLE);
- }
- #endif
- }
復(fù)制代碼 2->
然后再處理函數(shù)里頭實(shí)現(xiàn)一個(gè)簡(jiǎn)單的回顯
- #if defined(USART_RECIEVE_BY_SYSTICK)
- //USART1 recieve frame by systick + RXNE
- void usart_recieve_systick_handler(void)
- {
- uint16_t i;
- if(usartRx.isDeal == false){
- USART_ITConfig(USART1,USART_IT_IDLE|USART_IT_RXNE,DISABLE);
- if(usartRx.frameHead < usartRx.frameEnd){
- // printf("%d < %d\r\n",usartRx.frameHead,usartRx.frameEnd);
- for(i=usartRx.frameHead; i<=usartRx.frameEnd; i++){
- while((USART1->SR & 0X40)==0);
- USART1->DR = usartRx.buff[i];
- }
- }else{
- // printf("%d > %d\r\n",usartRx.frameHead,usartRx.frameEnd);
- for(i=usartRx.frameHead; i<USART_BUFF_SIZE; i++){
- while((USART1->SR & 0X40)==0);
- USART1->DR = usartRx.buff[i];
- }
- for(i=0; i<usartRx.frameEnd; i++){
- while((USART1->SR & 0X40)==0);
- USART1->DR = usartRx.buff[i];
- }
- }
- USART_ITConfig(USART1,USART_IT_IDLE|USART_IT_RXNE,ENABLE);
- usartRx.isDeal = true;
- }
- }
- #endif
復(fù)制代碼
全部資料51hei下載地址:
ST.rar
(264.57 KB, 下載次數(shù): 11)
2018-5-2 23:29 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|