久久久久久久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://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
中国少妇xxxxhd做受
|
黄色片视频免费
|
操操av
|
亚洲国产伦理
|
国产午夜免费视频
|
美女福利网站
|
精品国产一区二区三区四区
|
在线看成人片
|
色婷婷狠狠
|
亚洲不卡视频
|
欧美一区二区在线视频
|
国产精品久久久久久久久久久久久久
|
一区在线视频
|
欧美在线不卡
|
国产视频一二三区
|
在线中文av
|
免费观看a级片
|
第一福利丝瓜av导航
|
日韩欧美精品
|
狠狠五月
|
五月婷婷亚洲
|
97国产视频
|
国产成人免费观看
|
国产三级在线看
|
欧美一级免费
|
久久精品久久久久
|
欧洲av网站
|
黄色网在线
|
欧美日韩黄
|
国产欧美一区二区精品性色超碰
|
免费黄色一级
|
五月婷婷
|
视频一二区
|
国产高清自拍视频
|
久久99精品久久久久久
|
久久香蕉精品
|
欧美黄色精品
|
成人手机在线观看
|
成人福利
|
中文一级片
|
欧美在线一区二区
|