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

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

[复制链接]
STMCU小助手 发布时间:2021-11-14 23:04
测试ST 官网的 FreeRTOS0 L' c6 ]4 U& J1 P8 @# |6 D  a
1 a) `2 N& X1 ^+ n6 k
移植shell
- J) S* W4 g" f: o' P主要是串口对接, 需要重写两个函数* A& p. N" H8 \0 m* |
. `* [  e0 {: W$ ^+ Z# a/ c* _: X
  1. int fputc(int ch, FILE *f)
    # ^& @2 _& E) o' W& a/ O2 X
  2. {6 I8 U: a9 O* i5 k' r
  3.   /* Place your implementation of fputc here */7 [1 R) D: w4 \% a) @0 I2 c
  4.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    6 x% Y$ C8 ?3 @" A, l/ }1 b7 t; t- M8 {
  5.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, UART_TIMEOUT_VALUE);+ w, Z* W) n1 d0 d+ G# K
  6.   return ch;
    9 u, h0 v% ]9 b* b
  7. }# S' v& p8 Y/ P4 v8 E
  8. // #endif7 a% A" B1 D4 F2 B

  9. 4 H1 P+ r1 @" L2 ]/ O8 |
  10. char shell_buf[RXBUFFERSIZE]={0};
    9 T) p$ u1 E7 G8 v: X' T2 a
  11. char shell_len=0;5 x8 X1 x; w7 `0 S' L  ?. a8 b
  12. char *shell_buf_head=NULL;6 V$ m  D) @" N, V/ P

  13. $ N0 ~& A" B/ Y, t3 _
  14. # V) `. j2 ?: h" B) s; ^1 d  z
  15. int fgetc(FILE *f)
    9 d& B  D9 [1 u
  16. {
    " Z6 v; X% t/ K- e, y- k6 z
  17. / O0 R, `8 K1 u" E" M
  18.   while (0 == shell_len) {
    , E' A+ F9 j" @4 D
  19.     osDelay(1);
    % Y! a1 r2 `/ h& `% g
  20.   }9 J$ n; X+ {" R7 W
  21.   char ch = *shell_buf_head;
    8 k) D+ y2 T3 [( D( `2 N+ R0 ]3 q
  22.   shell_buf_head ++;
    0 G; f. X8 L# Q, h: U
  23.   shell_len --;
    $ `8 i& D: Z1 J1 X9 [% p
  24. 0 [# @0 J* @% P/ `0 o) C& R
  25.   return ch;2 ~2 u( Q) z6 `# l
  26. }
复制代码
6 E: r4 I2 S% g# {: W
增加了一个回调函数, 收到数据拷贝到shell_buf,  然后重新初始化串口中断接收参数,指针,size,count
, ]$ |, p  m- f) e2 }7 b2 A8 \% W1 V, q
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)0 r1 L' R) N. A
  2. {2 I' B: T8 D7 e) y
  3.   /* Set transmission flag: transfer complete */
    0 I. Q+ x& e& \! O; X; m8 X8 \/ g
  4.   if(UartHandle->Instance == USART1) {. b" K: _! E5 Y# j" Z! |2 ?8 u
  5.     // UartReady = SET;; P9 [. r) E: w- W, H# F
  6.     shell_len = UartHandle->pRxBuffPtr - aRxBuffer;
    - B0 K8 C. {% K; Z6 z& o
  7.     shell_buf_head = shell_buf;
    . d& n( n+ [/ v' t4 e3 _$ Y
  8.     memcpy(shell_buf, aRxBuffer, shell_len);, ^3 z# R& V* ?7 {' |0 o8 _) o
  9. - Q* G& Z2 H  K7 p
  10.     UartHandle->pRxBuffPtr = aRxBuffer;, j$ Y/ a7 P: b& B3 S' i9 V1 R" K8 g7 Q
  11.     UartHandle->RxXferSize  = RXBUFFERSIZE;5 ~& O6 A/ y8 x7 x) s8 z
  12.     UartHandle->RxXferCount = RXBUFFERSIZE;7 m5 b2 A& L6 Z! j/ v% d& _8 L& Y
  13.   }( r5 E# C' Q) C3 V
  14. ! b) p0 i0 s; T; G. X
  15. }
复制代码
! i0 ]& G/ j6 Q- L+ x
遇到的问题, 1. fgetc 不能直接调用HAL_UART_Receive, 否则会死等,导致其他任务无法运行。1 E, U1 \4 S+ @8 P, v

( J5 L1 d! b, Q9 I解决这个问题的方法是,接收采用中断方式。
6 a8 V2 U% X7 C5 @# Z7 G* J! S) C. r$ g* O8 l2 @
问题2. STM32CubeMX 生成的代码,串口中断接收是固定长度的方式, 对于shell 不适用。
0 R' X2 j/ k9 i; B7 Z! J( n4 x
5 p( C8 d0 o. W" v! Q) B解决这个问题的方法是,修改中断处理程序,如果是调试用的串口,直接处理接收数据  a/ W; @2 r3 R/ Q

% n: J6 c( b6 V3 g1 N  E/ s- v
  1. static void UART_RxISR_8BIT(UART_HandleTypeDef *huart)
    ) W& b) o* ^6 d9 ?
  2. {
    ) T- P) f4 N# W
  3.   uint16_t uhMask = huart->Mask;- X4 _* @2 u, }( z* e! [: A, v
  4.   uint16_t  uhdata;
    * L- I6 Z8 ~  Y* h, ?3 w

  5. + a7 k- ?; H+ V* s" p, o/ H. V
  6.   /* Check that a Rx process is ongoing */
    , Y# j$ X, `( y4 H/ d
  7.   if (huart->RxState == HAL_UART_STATE_BUSY_RX)
    7 R5 ]( n2 _) c/ ^5 ?
  8.   {1 n. g( b/ k# G: {+ x) {- K
  9.     uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
    " M% H, P8 H- e# g& W1 V! Z+ L0 [
  10.     *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);
    . l( m+ K2 k/ p2 `( ?+ p
  11.     huart->pRxBuffPtr++;( J) _+ F2 c* \1 D3 n& a) g
  12.     huart->RxXferCount--;6 v5 ?5 A& }- Y" [7 S2 }
  13. 1 @' r# O7 w2 N) K) ^' }
  14.     if(USART1 == huart->Instance) {
    6 H- x+ d0 A, P" a/ t! O4 ]
  15.       HAL_UART_RxCpltCallback(huart);. b; |$ n& e2 F0 A4 w6 @( [" g
  16.     }7 k1 z' C. Y6 t# _% z  B
  17.     if (huart->RxXferCount == 0U) {! W1 N' B8 h5 U9 s* s( P0 K  U
  18.       /* Disable the UART Parity Error Interrupt and RXNE interrupts */# _4 @5 m8 z7 X$ \8 s
  19.       CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
    ( `( |  t' E% I4 v8 @
  20. $ w& p( U  e- c: }6 \7 E
  21.       /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
    5 L, y8 p: v$ V% k  J' L
  22.       CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);  O4 F# h4 i2 t) Y# ]8 ?

  23. . t% h  X, s8 R& V
  24.       /* Rx process is completed, restore huart->RxState to Ready */8 N0 S- n, k  f& A
  25.       huart->RxState = HAL_UART_STATE_READY;
    ' B/ n! q4 j  b0 W5 X+ O( @7 p4 Y( H

  26. 5 }# T' n6 D6 M) J7 U
  27.       /* Clear RxISR function pointer */1 j2 \% G0 `! h% f7 y- o% W
  28.       huart->RxISR = NULL;
    , Q/ S& K3 I( h; x' f
  29. 1 O; i9 D# t/ [
  30. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
    * m, ~' M& O, b4 f& S, e
  31.       /*Call registered Rx complete callback*/, w1 W) R/ J2 t- [- J( U7 |
  32.       huart->RxCpltCallback(huart);
    , j9 N% B, `. W  N, h3 P# ]
  33. #else9 j; y1 h" G* _
  34.       /*Call legacy weak Rx complete callback*/, Y; b! }) \1 h! m" a( o
  35.       HAL_UART_RxCpltCallback(huart);  ]" D3 t$ ?' `4 F
  36. #endif /* USE_HAL_UART_REGISTER_CALLBACKS */: Z" Z( {# ^8 Q! p2 `- d. b
  37.     }- \7 f% I: I$ ?4 _
  38.   }: c1 D! p) A" A7 l2 Y6 A
  39.   else' U  v+ L& G9 `5 }* _% |
  40.   {
    : p/ j  E# |( j4 A% Z4 J+ C: p
  41.     /* Clear RXNE interrupt flag */, c8 h" C0 `; a) ?
  42.     __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
    % y- d8 s7 r7 O% B  w. q; [' _% L
  43.   }8 B8 c8 q; ?+ K' G9 e
  44. }
复制代码

  ^( k& S8 J/ z, Y8 [( k9 f问题3. shell 放在Mgr task里面,由于内存分配128*4 不够导致死机! U) w9 |+ p, c) Q6 B/ M1 A) P* {! Y

/ |) G: X! a: \解决这个问题的方法是,去掉没有用的shell 指令,限制最多支持64条指令。 任务内存分配加大 256*4" b+ z& p; z/ Z

8 H; c5 d, D, U6 p- o5 o9 I最终效果图
6 h7 [7 |) j' ~! D. B# v2 I* k# _5 _! N  g+ }+ ^; l
20201124190505583.png
( ^# w2 B+ K) D: }5 [
' W% S1 ]# `' r- k$ d: a4 l8 u9 J# }
0 b; g3 q1 P3 c) V/ z* Q
收藏 评论0 发布时间:2021-11-14 23:04

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版