久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32的RXNE+IDLE接收不定長的數據包源程序
[打印本頁]
作者:
小橡皮
時間:
2018-5-2 21:40
標題:
STM32的RXNE+IDLE接收不定長的數據包源程序
最近跟老師一起準備省電子設計競賽了,老師要求先準備好基礎的調試環境,當然選擇usart的調試接收方法啦,由于沒確定這個項目后期會加進來什么功能,不好確定每個包的大小,于是先寫好串口的不定長接收包,想到的方式自然是IDLE+RXNE的查詢
1->
在IDLE里頭通過systick檢測接收空閑的時間,如果空閑時間>10ms就給標記,停止IDLE中斷而去處理這個數據包
//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
}
復制代碼
2->
然后再處理函數里頭實現一個簡單的回顯
#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
復制代碼
全部資料51hei下載地址:
ST.rar
(264.57 KB, 下載次數: 11)
2018-5-2 23:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
小橡皮
時間:
2018-5-2 21:44
我這里還沒用DMA+IDLE查詢來寫數據包的接收,這段代碼能實現的基礎是知道發送端發送數據的最小間隔大于10ms
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久久久久久久久久国产
|
男人的天堂中文字幕
|
亚洲成人免费视频
|
一区二区三区国产视频
|
国产精品久久久久久久久久
|
午夜免费福利电影
|
日本精品一区二区三区在线观看
|
18性欧美
|
91在线精品播放
|
亚洲 欧美 激情 另类 校园
|
久久中文字幕一区
|
操操操日日日
|
欧美精品一区二区在线观看
|
久久男人天堂
|
91免费高清
|
国产h视频
|
国产日产久久高清欧美一区
|
午夜视频一区
|
五月激情婷婷网
|
av网站在线播放
|
自拍偷拍亚洲欧美
|
色性av
|
91精品国产91久久久久久最新
|
久久久精品一区
|
99精品免费视频
|
久草精品在线
|
久久国产一区二区三区
|
伊人网站
|
亚洲欧美日韩在线
|
www..com18午夜观看
|
亚洲精品视频在线播放
|
日韩中文字幕一区
|
一区二区三区日韩
|
国产精品久久久久久久久久久久
|
日韩久久久久久
|
超碰婷婷
|
国产精品美女久久久久
|
国产亚洲高清视频
|
国产亚洲成av人片在线观看桃
|
国产小视频在线
|
成人精品毛片国产亚洲av十九禁
|