你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G070 移植一个shell,方便调试。基于FreeRTOS

[复制链接]
STMCU小助手 发布时间:2021-11-14 23:04
测试ST 官网的 FreeRTOS

移植shell
主要是串口对接, 需要重写两个函数

  1. int fputc(int ch, FILE *f)
  2. {
  3.   /* Place your implementation of fputc here */
  4.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  5.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, UART_TIMEOUT_VALUE);
  6.   return ch;
  7. }
  8. // #endif

  9. char shell_buf[RXBUFFERSIZE]={0};
  10. char shell_len=0;
  11. char *shell_buf_head=NULL;


  12. int fgetc(FILE *f)
  13. {

  14.   while (0 == shell_len) {
  15.     osDelay(1);
  16.   }
  17.   char ch = *shell_buf_head;
  18.   shell_buf_head ++;
  19.   shell_len --;

  20.   return ch;
  21. }
复制代码

增加了一个回调函数, 收到数据拷贝到shell_buf,  然后重新初始化串口中断接收参数,指针,size,count

  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
  2. {
  3.   /* Set transmission flag: transfer complete */
  4.   if(UartHandle->Instance == USART1) {
  5.     // UartReady = SET;
  6.     shell_len = UartHandle->pRxBuffPtr - aRxBuffer;
  7.     shell_buf_head = shell_buf;
  8.     memcpy(shell_buf, aRxBuffer, shell_len);

  9.     UartHandle->pRxBuffPtr = aRxBuffer;
  10.     UartHandle->RxXferSize  = RXBUFFERSIZE;
  11.     UartHandle->RxXferCount = RXBUFFERSIZE;
  12.   }

  13. }
复制代码

遇到的问题, 1. fgetc 不能直接调用HAL_UART_Receive, 否则会死等,导致其他任务无法运行。

解决这个问题的方法是,接收采用中断方式。

问题2. STM32CubeMX 生成的代码,串口中断接收是固定长度的方式, 对于shell 不适用。

解决这个问题的方法是,修改中断处理程序,如果是调试用的串口,直接处理接收数据

  1. static void UART_RxISR_8BIT(UART_HandleTypeDef *huart)
  2. {
  3.   uint16_t uhMask = huart->Mask;
  4.   uint16_t  uhdata;

  5.   /* Check that a Rx process is ongoing */
  6.   if (huart->RxState == HAL_UART_STATE_BUSY_RX)
  7.   {
  8.     uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
  9.     *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);
  10.     huart->pRxBuffPtr++;
  11.     huart->RxXferCount--;

  12.     if(USART1 == huart->Instance) {
  13.       HAL_UART_RxCpltCallback(huart);
  14.     }
  15.     if (huart->RxXferCount == 0U) {
  16.       /* Disable the UART Parity Error Interrupt and RXNE interrupts */
  17.       CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));

  18.       /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
  19.       CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

  20.       /* Rx process is completed, restore huart->RxState to Ready */
  21.       huart->RxState = HAL_UART_STATE_READY;

  22.       /* Clear RxISR function pointer */
  23.       huart->RxISR = NULL;

  24. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
  25.       /*Call registered Rx complete callback*/
  26.       huart->RxCpltCallback(huart);
  27. #else
  28.       /*Call legacy weak Rx complete callback*/
  29.       HAL_UART_RxCpltCallback(huart);
  30. #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
  31.     }
  32.   }
  33.   else
  34.   {
  35.     /* Clear RXNE interrupt flag */
  36.     __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
  37.   }
  38. }
复制代码

问题3. shell 放在Mgr task里面,由于内存分配128*4 不够导致死机

解决这个问题的方法是,去掉没有用的shell 指令,限制最多支持64条指令。 任务内存分配加大 256*4

最终效果图

20201124190505583.png



收藏 评论0 发布时间:2021-11-14 23:04

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版