標(biāo)題:
STM32的RXNE+IDLE接收不定長(zhǎng)的數(shù)據(jù)包源程序
[打印本頁]
作者:
小橡皮
時(shí)間:
2018-5-2 21:40
標(biāo)題:
STM32的RXNE+IDLE接收不定長(zhǎng)的數(shù)據(jù)包源程序
最近跟老師一起準(zhǔn)備省電子設(shè)計(jì)競(jìng)賽了,老師要求先準(zhǔn)備好基礎(chǔ)的調(diào)試環(huán)境,當(dāng)然選擇usart的調(diào)試接收方法啦,由于沒確定這個(gè)項(xiàng)目后期會(huì)加進(jìn)來什么功能,不好確定每個(gè)包的大小,于是先寫好串口的不定長(zhǎng)接收包,想到的方式自然是IDLE+RXNE的查詢
1->
在IDLE里頭通過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)擊文件名下載附件
下載積分: 黑幣 -5
作者:
小橡皮
時(shí)間:
2018-5-2 21:44
我這里還沒用DMA+IDLE查詢來寫數(shù)據(jù)包的接收,這段代碼能實(shí)現(xiàn)的基礎(chǔ)是知道發(fā)送端發(fā)送數(shù)據(jù)的最小間隔大于10ms
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1