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

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

[复制链接]
STMCU小助手 发布时间:2021-11-14 23:04
测试ST 官网的 FreeRTOS
+ K+ P& m/ j8 Y2 Y4 F$ Y
% @3 c3 I2 a1 Y移植shell
' w/ e# j( n3 K* O主要是串口对接, 需要重写两个函数  O7 r( }- S  U3 q3 Z9 `- r" d  O
! W' X0 |; K! f
  1. int fputc(int ch, FILE *f)2 [$ g& u- l4 F5 R7 V2 F' i
  2. {
    $ ^1 v4 V7 W6 V
  3.   /* Place your implementation of fputc here */) U7 Q; C( x& X- m& y
  4.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    - B$ M0 b' Z' B. @8 W
  5.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, UART_TIMEOUT_VALUE);
    9 y7 |4 N+ I2 K2 e, c# C. P" b
  6.   return ch;0 }6 i6 L( l3 _* @) O+ e, }4 `7 ]
  7. }! l7 g3 c1 u# `. e4 }, ~- l6 M
  8. // #endif
    ' k5 M( V: N2 A

  9. 3 D) P7 I# M0 Y4 Q1 s3 e3 }
  10. char shell_buf[RXBUFFERSIZE]={0};/ u( x: ?: C; Q9 D& D
  11. char shell_len=0;* x5 n3 s) o" l* W
  12. char *shell_buf_head=NULL;) L8 ?, {+ I0 W/ n1 t* t" y0 i0 M
  13. 5 X. L7 U3 w, h6 i: G- P8 Y! v7 |$ `

  14.   o* N8 H; i' G+ p
  15. int fgetc(FILE *f)
    + F/ i0 r3 J+ j3 @' }! V4 N
  16. {
    3 o. e: ?% K. Y$ Q, w$ c1 P

  17. ! k) k7 N  ~, r( T3 G( r: x
  18.   while (0 == shell_len) {
    3 v+ j# G- e; e, R: s
  19.     osDelay(1);$ H% g: S  J: w, e& K! ~
  20.   }$ @5 ]* n* v5 V
  21.   char ch = *shell_buf_head;6 b% N* b% N0 R/ i$ D0 ^7 Y$ o
  22.   shell_buf_head ++;
    # F7 a6 I( J" Y4 S2 V
  23.   shell_len --;
    5 W4 T9 v+ V1 r1 n1 q2 \
  24. ( f! A; e0 g. o) p; }5 B
  25.   return ch;
    7 {) B, q; J0 F& Z& r- W
  26. }
复制代码
6 {$ J: R5 L0 q1 R8 c- I9 G
增加了一个回调函数, 收到数据拷贝到shell_buf,  然后重新初始化串口中断接收参数,指针,size,count( [/ |, I) G0 D- h6 a, ^0 C

' I7 H7 ^. V2 d  b8 O
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)6 k" S" F. G; r
  2. {
    ' |4 g, G7 l7 j' W; k( |. h
  3.   /* Set transmission flag: transfer complete */+ i3 u1 t% |0 L5 ]+ i$ _
  4.   if(UartHandle->Instance == USART1) {$ r2 [3 c1 D! p7 l  G7 U
  5.     // UartReady = SET;
    : |0 b5 o2 V. f7 ^
  6.     shell_len = UartHandle->pRxBuffPtr - aRxBuffer;/ T2 w( @6 y& Q. b& r& O
  7.     shell_buf_head = shell_buf;
    8 ?0 n; E& V$ I9 r6 T) }
  8.     memcpy(shell_buf, aRxBuffer, shell_len);
    2 ~& W) ]+ s& G" w$ m3 F  [
  9.   @9 d' ~7 i! b, |+ c; n4 h
  10.     UartHandle->pRxBuffPtr = aRxBuffer;
    6 O& e  U6 r$ [% G( h+ P0 J
  11.     UartHandle->RxXferSize  = RXBUFFERSIZE;0 z- j9 P0 ]( h/ ?! n! z
  12.     UartHandle->RxXferCount = RXBUFFERSIZE;
    # b7 L+ L& O# y9 S5 |- |9 x# h' ]
  13.   }- Y3 z$ k& ~3 S' Z
  14. ( N/ V8 q9 L" x5 x. B) o" _; s- m% x0 d
  15. }
复制代码
& G$ U$ X8 \1 B- f) d- m0 J. X
遇到的问题, 1. fgetc 不能直接调用HAL_UART_Receive, 否则会死等,导致其他任务无法运行。) S: J; W- U* v! A

' y  c' m; @" }& P" D) z0 D6 q解决这个问题的方法是,接收采用中断方式。
1 Y; V/ f. D& V' u6 p% g) F
0 q) ?2 X% j& J& p6 L% w问题2. STM32CubeMX 生成的代码,串口中断接收是固定长度的方式, 对于shell 不适用。% X. B9 K2 n. |" e/ ]

' M' K# g. d+ K解决这个问题的方法是,修改中断处理程序,如果是调试用的串口,直接处理接收数据
( U4 o% B9 K! [
( b7 w5 F% r+ z9 X
  1. static void UART_RxISR_8BIT(UART_HandleTypeDef *huart)9 N0 g* g! y; B6 r' Z9 U1 C9 W
  2. {
    9 @6 f3 u" `7 M$ h
  3.   uint16_t uhMask = huart->Mask;
    / U% A1 `! j) I( o6 S
  4.   uint16_t  uhdata;" G" s8 D% `5 u4 u& E' d
  5. 1 u! b. N: c% b! ^; |  x
  6.   /* Check that a Rx process is ongoing */( |/ Z' P9 n; ]. ]; y" b' |
  7.   if (huart->RxState == HAL_UART_STATE_BUSY_RX)8 `  {$ e6 e# @9 D( s, K, Q2 N
  8.   {
    5 u1 q9 Q) Y2 s7 A! T4 S
  9.     uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
    7 m4 }3 n$ J4 G" S
  10.     *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);6 S: h8 q) T; O( V4 o2 l7 O! h
  11.     huart->pRxBuffPtr++;
    4 ?$ Z! _- B3 d+ l" X# n) ?/ j
  12.     huart->RxXferCount--;0 A! ?; T  Q6 j& m% A
  13. - @- f3 N8 \: E6 c# M
  14.     if(USART1 == huart->Instance) {
    5 e6 j* j9 X" ?$ Y/ ^9 F
  15.       HAL_UART_RxCpltCallback(huart);
    5 r- Z6 L! ]1 I1 b- {8 ?# u$ E
  16.     }
    8 n- w) y6 q' `' _
  17.     if (huart->RxXferCount == 0U) {% @. h" J5 L7 h9 J
  18.       /* Disable the UART Parity Error Interrupt and RXNE interrupts */& `9 r/ z6 m! v& P: e# n+ |; J! ^
  19.       CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));/ H, x! A5 W! ^. a* D

  20. ( j0 k8 d( @( T$ r% F
  21.       /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */' F) D) L0 `9 z1 w9 ]% L( z) U
  22.       CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
    ' ]1 a7 z" V# L0 S% I
  23. 2 X+ {2 f5 b% W5 z; {
  24.       /* Rx process is completed, restore huart->RxState to Ready */
    : f6 V7 E1 F! L6 ^: O
  25.       huart->RxState = HAL_UART_STATE_READY;
      L( r! o5 {8 p( O, s5 S7 t& `

  26. ' N% @( s* o- z- P0 h3 g$ B
  27.       /* Clear RxISR function pointer */
    ; V; X' {) S" {8 r, h* b: r
  28.       huart->RxISR = NULL;9 |. l$ l6 n- W
  29. * k6 X& z! T+ h" N* {$ b
  30. #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
    + X/ O  R* S! \# m$ W( L; H$ V
  31.       /*Call registered Rx complete callback*/; A0 X& N  y  K( p( ?
  32.       huart->RxCpltCallback(huart);' I" F6 {( b6 b/ X1 J- ~/ A/ E
  33. #else# U0 K) ?: U9 f* v; h% y
  34.       /*Call legacy weak Rx complete callback*/
    1 f- |; G0 [$ j: r0 o  H
  35.       HAL_UART_RxCpltCallback(huart);
    : l$ {4 f( d- H9 |* q2 x5 @; r4 e
  36. #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
    8 k; @' R) {, a5 \) D8 h) o- ?, M
  37.     }; ]8 p6 r9 x3 B) C7 V
  38.   }
    ! ^/ [2 ]" W) s5 @$ \, m1 h
  39.   else
    4 `* c8 U( E; v8 o6 e" @9 @# e
  40.   {/ t* x; Z2 N- D& e2 f6 `  {5 S
  41.     /* Clear RXNE interrupt flag */
    5 ^- p% f9 \* u+ `$ ~+ O1 c  t2 ?2 \  X
  42.     __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);, I. E7 M/ H4 x/ U
  43.   }+ @% M) @; n! W4 ~1 J2 t/ c1 o& N
  44. }
复制代码

; e! R, N# w6 g& b5 G$ N) S问题3. shell 放在Mgr task里面,由于内存分配128*4 不够导致死机
* ?5 d3 {' N2 O4 L3 P/ O
3 ]+ N7 f) U8 F1 n( h+ w解决这个问题的方法是,去掉没有用的shell 指令,限制最多支持64条指令。 任务内存分配加大 256*4
) \! R, ]$ X( a, q: f" ]
& V3 x$ {2 w: L0 B: F! V; K) d最终效果图
; ~$ j! z1 H) W# P3 ~( p$ @
2 C0 u* j* v# M- S: V
20201124190505583.png

6 ?. z! \5 x$ v6 U$ L
1 ]$ j) S1 C5 \# l
0 W1 u/ U" ]# Y' C
收藏 评论0 发布时间:2021-11-14 23:04

举报

0个回答

所属标签

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