OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3646|回复: 1

usmart 移植到 freertos+f429,系统报错

[复制链接]

12

主题

22

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-7-9
在线时间
23 小时
发表于 2022-11-29 16:22:39 | 显示全部楼层 |阅读模式

  1. void USART3_IRQHandler(void)
  2. {
  3.         u8  Res;
  4.         u32 timeout=0;
  5.         u32 maxDelay=0x1FFFF;

  6.     HAL_UART_IRQHandler(&g_DebugUartHandle);
  7.         if((__HAL_UART_GET_FLAG(&g_DebugUartHandle,UART_FLAG_RXNE)!=RESET))  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  8.         {
  9.         HAL_UART_Receive(&g_DebugUartHandle,&Res,1,1000);
  10.                 if((DBG_USART_RX_STA&0x8000)==0)//接收未完成
  11.                 {
  12.                         if(DBG_USART_RX_STA&0x4000)//接收到了0x0d
  13.                         {
  14.                                 if(Res!=0x0a)DBG_USART_RX_STA=0;//接收错误,重新开始
  15.                                 else DBG_USART_RX_STA|=0x8000;        //接收完成了
  16.                         }
  17.                         else //还没收到0X0D
  18.                         {       
  19.                                 if(Res==0x0d) DBG_USART_RX_STA|=0x4000;
  20.                                 else
  21.                                 {
  22.                                         DBG_USART_RX_BUF[DBG_USART_RX_STA&0X3FFF]=Res ;
  23.                                         DBG_USART_RX_STA++;
  24.                                         if(DBG_USART_RX_STA>(USART_REC_LEN-1))DBG_USART_RX_STA=0;//接收数据错误,重新开始接收          
  25.                                 }                 
  26.                         }
  27.                 }                    
  28.         }
  29.         HAL_UART_IRQHandler(&g_DebugUartHandle);       

  30. }
复制代码


移植正点原子的UMaster组件,到F429+freertos 系统(关键代码如上),使用串口3,删除了代码 OSIntEnter();     OSIntExit();
敲指令出错如下所示:

delay_ms(10)
delay_ms(0XA)Error:..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,441
;
Error:..\FreeRTOS\tasks.c,2807

指令delay_us  和 LCD_Clear  等都正常


freertos   系统,进中断需要调用类似  OSIntEnter,OSIntExit  的接口?




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-11-29 19:36:57 | 显示全部楼层
不需要。
   下面的代码,当USART3通过DMA方式接收到一帧完整的报文,发送消息队列


  1. //////////////////////////////////////////////////////////////////////////////////////////
  2. //DMA中断方式
  3. //////////////////////////////////////////////////////////////////////////////////////////
  4. void USART3_IRQHandler(void)
  5. {
  6.         uint16_t ch;
  7.         uint8_t Buffer[10];       
  8.         BaseType_t xHigherPriorityTaskWoken = pdFALSE;
  9.        
  10.        
  11.         if (USART_GetITStatus(USART3,USART_IT_IDLE) != RESET)
  12.         {               
  13.                 USART_ClearITPendingBit(USART3 , USART_IT_IDLE);        //必须先清除总线空闲中断标识,然后读一下数据寄存器,DMA接收才会正确(先读SR,然后读DR才能清除空闲中断标识)注意:这句必须要,否则不能够清除中断标志位。
  14.                 ch =  USART_ReceiveData(USART3);                                        //必须先清除总线空闲中断标识,然后读一下数据寄存器,DMA接收才会正确(先读SR,然后读DR才能清除空闲中断标识)注意:这句必须要,否则不能够清除中断标志位。

  15.                 DMA_Cmd(DMA1_Channel3 , DISABLE);                                         //关闭DMA,防止处理其间有数据
  16.                 DMA_ClearFlag(DMA1_FLAG_GL3 | DMA1_FLAG_TC3 | DMA1_FLAG_HT3 | DMA1_FLAG_TE3);
  17.                 ch = USART3_DMA_RX_BUFFER_MAX_LENGTH - DMA_GetCurrDataCounter(DMA1_Channel3);
  18.                 if (ch > 0)
  19.                 {
  20.                         MB_USART3.receCount = ch;
  21.                         memcpy(MB_USART3.mscomm_buffer , USART3_DMA_RX_Buffer , MB_USART3.receCount);
  22.                 }
  23.                 DMA_SetCurrDataCounter(DMA1_Channel3 , USART3_DMA_RX_BUFFER_MAX_LENGTH);
  24.                 DMA_Cmd(DMA1_Channel3, ENABLE);
  25.                

  26.                 Buffer[0] = 1;
  27.                 xQueueSendToBackFromISR(xQueueWIFI , Buffer , &xHigherPriorityTaskWoken);
  28.                 portYIELD_FROM_ISR(xHigherPriorityTaskWoken);                  
  29.         }
  30.         else if (USART_GetITStatus(USART3,USART_IT_TC)!= RESET)
  31.         {
  32.                 USART_ClearITPendingBit(USART3, USART_IT_TC);                               
  33.                 DMA_ClearFlag(DMA1_FLAG_GL2 | DMA1_FLAG_TC2 | DMA1_FLAG_HT2 | DMA1_FLAG_TE2);
  34.                 DMA_SetCurrDataCounter(DMA1_Channel2 , 0);
  35.         }       
  36. }
复制代码



回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 13:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表