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

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

[复制链接]
STMCU小助手 发布时间:2021-11-14 23:04
测试ST 官网的 FreeRTOS
" R1 J! c. J1 y5 T( A, v6 P% g/ S5 o/ _/ L
移植shell
  n1 m" ]2 C$ M% _: k主要是串口对接, 需要重写两个函数2 t9 n- n2 O6 p8 }7 x" n

  ^7 ~* P! y& r- J, l
  1. int fputc(int ch, FILE *f)
    8 U) j6 e, w4 ~* c, m& E  j
  2. {
    & m7 O" s9 S/ X& F, U4 t
  3.   /* Place your implementation of fputc here */" e2 s: _5 _8 x1 d. `& A
  4.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */1 z5 Y# K, U/ K+ L4 n
  5.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, UART_TIMEOUT_VALUE);
    * \; X- o' J0 n) J
  6.   return ch;
    : L6 j) `$ r9 h# W- b& E
  7. }! D9 ]4 @3 Y( G. a; V
  8. // #endif
    ' G6 J! G$ J( D6 m. `
  9. , C" O. J+ B) Z0 G/ ]7 O3 @" `
  10. char shell_buf[RXBUFFERSIZE]={0};6 @1 @) z2 ]. z1 p
  11. char shell_len=0;
    : W4 a5 O$ Z8 H1 B* t0 K
  12. char *shell_buf_head=NULL;
    # M0 s: [( v" k6 K3 c* D% ~) @
  13. 6 U  {5 x: W! ]) S- }# g; b
  14. 5 t! ~9 K  q: G, f5 _4 w) ?
  15. int fgetc(FILE *f). u: c4 B( q* Y& r
  16. {
    2 ?+ q& Y: y8 b' I  H% ?

  17. 1 c. ]. {6 b/ h" U5 m5 r
  18.   while (0 == shell_len) {! O8 r4 V. E, O) |/ _& y
  19.     osDelay(1);
    / _0 h* J% I' h9 |
  20.   }
    - h( Q  U! Z. ?
  21.   char ch = *shell_buf_head;; e: n/ }/ W+ e! g. {( [
  22.   shell_buf_head ++;* }% o# Z, P  g# O/ P! ]. ?
  23.   shell_len --;& n! k# O5 @+ W! Y4 P% N
  24. / A5 f$ e: L# a3 Q' q+ c
  25.   return ch;
    * B  s8 _9 U  J1 A
  26. }
复制代码
. d' C+ O8 D( L- g* s' v  O" s/ O
增加了一个回调函数, 收到数据拷贝到shell_buf,  然后重新初始化串口中断接收参数,指针,size,count
. Q7 K& Q/ L; R# U# u8 w0 l, M& h7 B& m# \) x
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
    " c: X- B: D, h. N
  2. {
    ( ], c0 e# W0 ]) |
  3.   /* Set transmission flag: transfer complete */# i$ _- f% M6 _9 v% N; J
  4.   if(UartHandle->Instance == USART1) {# _. K$ v5 R3 S2 M% y. g
  5.     // UartReady = SET;, I) A5 A, l  \% H0 N( A
  6.     shell_len = UartHandle->pRxBuffPtr - aRxBuffer;7 H, l7 I$ h! I1 u- k( J; F6 Z
  7.     shell_buf_head = shell_buf;
    2 f, Z7 e# }/ T. H/ `" J
  8.     memcpy(shell_buf, aRxBuffer, shell_len);+ N% V9 C3 {+ i2 B0 l

  9. / R, e# e& H. x* z0 L
  10.     UartHandle->pRxBuffPtr = aRxBuffer;. {: J6 i6 l& x1 `/ v
  11.     UartHandle->RxXferSize  = RXBUFFERSIZE;
    1 C5 c! U, `, e8 W2 P
  12.     UartHandle->RxXferCount = RXBUFFERSIZE;; u3 U8 C) o$ ^4 m  y9 s
  13.   }
    5 ~8 S; t  u" X) O: q

  14. # d' H9 s9 |0 _1 O; J& c" ^
  15. }
复制代码
7 ~5 `8 B; \, y/ }/ ~
遇到的问题, 1. fgetc 不能直接调用HAL_UART_Receive, 否则会死等,导致其他任务无法运行。
# C* J6 @; b0 c7 o+ M$ p* F4 p- r* ]4 A& [! [
解决这个问题的方法是,接收采用中断方式。4 a! c3 n! X7 r6 @' h. @% f

1 |6 @0 ?9 s1 K) l: u( ?5 y- g问题2. STM32CubeMX 生成的代码,串口中断接收是固定长度的方式, 对于shell 不适用。
$ [0 I: M5 p* a" X1 b# [0 k' w, s" k* q9 Y9 x1 S" ?- @" s5 k
解决这个问题的方法是,修改中断处理程序,如果是调试用的串口,直接处理接收数据
, G# e. y; y  [8 F8 J
$ g' \/ i" k  v8 {& M
  1. static void UART_RxISR_8BIT(UART_HandleTypeDef *huart)
    & N7 D5 v: G1 T& ~& m
  2. {8 B3 C2 V; e& |2 O. \  M' k
  3.   uint16_t uhMask = huart->Mask;5 {; B- |! L, S1 x# t
  4.   uint16_t  uhdata;
    . O3 F! h: Y9 Z, T. {, e9 S
  5. 5 j+ N0 t4 I  I  ^3 y
  6.   /* Check that a Rx process is ongoing */5 T0 T! _* H$ a# A6 H
  7.   if (huart->RxState == HAL_UART_STATE_BUSY_RX)+ L6 d9 [' \' f1 }
  8.   {, l- w- l2 W3 d* T8 q9 ?
  9.     uhdata = (uint16_t) READ_REG(huart->Instance->RDR);/ d) H6 n- G5 C5 S/ Q6 i
  10.     *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);; Z* p$ |# Y5 [: t
  11.     huart->pRxBuffPtr++;
    ' |" `; H& h* ~! K; `, N$ z
  12.     huart->RxXferCount--;
    ) `5 B6 A' s' c
  13. ' u% W9 _! `; B, S
  14.     if(USART1 == huart->Instance) {) X6 m8 k# T. i8 R( ?: |- C8 `6 t  z
  15.       HAL_UART_RxCpltCallback(huart);
    - U) T0 R$ @1 ^
  16.     }9 {$ @, C% \" V
  17.     if (huart->RxXferCount == 0U) {- I; \7 d' O" l, o" A) r# V
  18.       /* Disable the UART Parity Error Interrupt and RXNE interrupts */, u5 V' R& M) C
  19.       CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));! g8 H6 u0 s5 q# @
  20. 3 D$ y! N/ h" r+ l& a9 P
  21.       /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
    + W! k( M0 c2 _+ t3 E8 `
  22.       CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);4 ?$ r- P* A" F, {% Q

  23. 0 E1 T. C: X, z; T) {* A* b
  24.       /* Rx process is completed, restore huart->RxState to Ready */, N+ ?* h) L( e& S2 y( V
  25.       huart->RxState = HAL_UART_STATE_READY;" v4 a* ^+ F% V8 T5 {' J1 q( C9 Y

  26. ! u3 O" V; ~3 ^- _; }
  27.       /* Clear RxISR function pointer */
    / Z2 `! ]7 a  ^6 P* ]$ m
  28.       huart->RxISR = NULL;) C* ?/ f" v4 D4 U# t* g) H( D

  29. 0 T+ y0 y7 O  J7 K' |4 v* D  a
  30. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
    , ]5 D) e; s1 f+ L( a( r" Y
  31.       /*Call registered Rx complete callback*/
    & y/ u, \6 s4 J6 T$ K
  32.       huart->RxCpltCallback(huart);
    3 z2 v- p7 j: ]3 O9 F
  33. #else
    2 v5 A0 N4 T" D  f$ G) r
  34.       /*Call legacy weak Rx complete callback*/* [& |  L! A  J0 X% p5 q
  35.       HAL_UART_RxCpltCallback(huart);! a( R1 w3 ^0 K: Y- A% }
  36. #endif /* USE_HAL_UART_REGISTER_CALLBACKS */2 T6 F0 `4 h9 N- b; s# m
  37.     }% j+ q: j0 g5 |8 p) o
  38.   }  \) O9 ?5 L: [+ _6 u
  39.   else# C9 P4 q5 D- W5 b+ w9 Z# d0 ?6 Z
  40.   {; ?. e  p7 I. S) L0 H" r% i
  41.     /* Clear RXNE interrupt flag */& J' j6 }4 N! i* G5 Q- G
  42.     __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
    / Q) y! T4 R6 I/ V5 R
  43.   }
      ?5 V$ p- F% v- j' \
  44. }
复制代码

0 z' |/ W5 T$ H, _' Q' x. i$ t问题3. shell 放在Mgr task里面,由于内存分配128*4 不够导致死机
6 g( N1 @+ K7 h2 T
* B& `5 K0 J  s+ H+ @1 m解决这个问题的方法是,去掉没有用的shell 指令,限制最多支持64条指令。 任务内存分配加大 256*43 C: L- X  X+ @5 g
4 i2 ]; f4 H7 [& y% C) K
最终效果图
( ^  V" [0 Y/ u7 P- \" N3 ]1 g7 m
20201124190505583.png

1 w, `; `7 X& t6 ^2 ?2 k; W) @, \" {$ X" y7 c  O9 T

/ g9 @+ e8 [$ t' m0 n- I6 X, w
收藏 评论0 发布时间:2021-11-14 23:04

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版