[MM32生态] 【EV Board (MM32L0136C7P)测评】+移植Letter Shell

[复制链接]
1666|16
 楼主| freeelectron 发表于 2022-12-9 20:33 | 显示全部楼层 |阅读模式
本帖最后由 freeelectron 于 2022-12-9 20:35 编辑

本文移植Letter shell,通过串口输入命令,与开发板交互。
Letter shell的项目地址:https://github.com/NevermindZZT/letter-shell,最新的版本是3.1.2,也正是本文移植的版本。

在移植之前首先要保证串口收发正常,本文使用串口轮询发送和中断接收。
1、串口相关代码
  1. void SerialInit(void)
  2. {
  3.             /* GPIOA. */
  4.     RCC_EnableAHBPeriphs(RCC_AHB_PERIPH_GPIOA, true);
  5.     RCC_ResetAHBPeriphs(RCC_AHB_PERIPH_GPIOA);
  6.         
  7.          /* UART2. */
  8.     RCC_EnableAPB1Periphs(RCC_APB1_PERIPH_UART2, true);
  9.     RCC_ResetAPB1Periphs(RCC_APB1_PERIPH_UART2);
  10.         
  11.     GPIO_Init_Type gpio_init;

  12.     /* PA2 - UART2_TX. */
  13.     gpio_init.Pins  = GPIO_PIN_2;
  14.     gpio_init.PinMode  = GPIO_PinMode_AF_PushPull;
  15.     gpio_init.Speed = GPIO_Speed_50MHz;
  16.     GPIO_Init(GPIOA, &gpio_init);
  17.     GPIO_PinAFConf(GPIOA, GPIO_PIN_2, GPIO_AF_1);

  18.     /* PA3 - UART2_RX. */
  19.     gpio_init.Pins  = GPIO_PIN_3;
  20.     gpio_init.PinMode  = GPIO_PinMode_In_Floating;
  21.     gpio_init.Speed = GPIO_Speed_50MHz;
  22.     GPIO_Init(GPIOA, &gpio_init);
  23.     GPIO_PinAFConf(GPIOA, GPIO_PIN_3, GPIO_AF_1);
  24.     UART_Init_Type uart_init;

  25.     /* Setup the xfer engine. */
  26.     uart_init.ClockFreqHz   = 24000000u; /* 48mhz, APB2. */
  27.     uart_init.BaudRate      = 9600u;
  28.     uart_init.WordLength    = UART_WordLength_8b;
  29.     uart_init.StopBits      = UART_StopBits_1;
  30.     uart_init.Parity        = UART_Parity_None;
  31.     uart_init.XferMode      = UART_XferMode_RxTx;
  32.     uart_init.HwFlowControl = UART_HwFlowControl_None;
  33.     UART_Init(UART2, &uart_init);

  34.     /* Enable RX interrupt. */
  35.     UART_EnableInterrupts(UART2, UART_INT_RX_DONE, true);
  36.     NVIC_EnableIRQ(UART2_IRQn);

  37.     /* Enable UART. */
  38.     UART_Enable(UART2, true);
  39. }

  40. void SerialSend(uint8_t *data,uint16_t len)
  41. {
  42.         for(uint16_t i=0; i<len;i++)
  43.         {
  44.                 while ( 0u == (UART_STATUS_TX_EMPTY & UART_GetStatus(UART2)) ){}
  45.                 UART_PutData(UART2, (uint8_t)data[i]);
  46.         }
  47. }
2、Letter Shell接口

主要是shell_port.c文件中的userShellWrite和userShellRead,本文使用串口中断,可不实现userShellRead。

  1. short userShellWrite(char *data, unsigned short len)
  2. {
  3.         void SerialSend(uint8_t *data,uint16_t len);
  4.         SerialSend((uint8_t *)data,len);
  5.         
  6.     return len;
  7. }
  1. void UART2_IRQHandler(void)
  2. {
  3.         uint8_t ch;  
  4.         
  5.     if(0u != (UART_INT_RX_DONE & UART_GetInterruptStatus(UART2)))
  6.         {
  7.        ch=UART_GetData(UART2);

  8.                 shellHandler(&shell, ch);
  9.     }
  10. }
  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] 用户shell初始化
  3. *
  4. */
  5. void userShellInit(void)
  6. {
  7.     shell.write = userShellWrite;
  8.     shellInit(&shell, shellBuffer, 512);
  9. }
shell对象和缓冲区:
  1. Shell shell;
  2. char shellBuffer[512];

完成以上后,调用void userShellInit(void)函数,初始化即可,正常运行shell。


3、shell配置

shell_cfg.h文件中,主要是对shell进行配置的,可以配置用户名、密码等参数,可根据实际需要裁剪。


4、新增命令

本文新增了reboot命令,来进行测试:

  1. /* 系统重启 */
  2. void reboot(int argc, char *agrv[])
  3. {
  4.         NVIC_SystemReset();
  5. }
  6. SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), reboot, reboot, reboot);
5、现象

本文使用SecureCRT串口终端与mcu交互。


letter shell.gif




tpgf 发表于 2023-1-4 13:13 | 显示全部楼层
letter shell 3.0是一个C语言编写的,可以嵌入在程序中的嵌入式shell,通俗一点说就是一个串口命令行
heimaojingzhang 发表于 2023-1-4 13:24 | 显示全部楼层
etter-shell的移植非常简单,自己实现串口读写一个字符的接口,自己编写一个初始化函数,完成
keaibukelian 发表于 2023-1-4 13:33 | 显示全部楼层
letter-shell具备很多功能,可以通过宏定义来开启或者关闭,在shell_cfg.h文件中根据需要进行配置
paotangsan 发表于 2023-1-4 13:45 | 显示全部楼层
在调试的模组比较复杂时,比如SPI Flash、LCD屏幕这些,我希望可以在串口直接调用某几个功能函数开始执行,当移植了shell之后,在代码中只需要添加一行宏定义,就可以在串口中调用此函数开始执行
renzheshengui 发表于 2023-1-4 14:00 | 显示全部楼层
函数最大传入参数个数由shell_cfg.h中的宏定义配置
wakayi 发表于 2023-1-4 14:34 | 显示全部楼层
在lettershell中输入keys命令即可查看当前支持的按键键值解析
usysm 发表于 2023-1-5 13:21 | 显示全部楼层
这个必须使用超级终端才行吗?              
phoenixwhite 发表于 2023-1-5 14:27 | 显示全部楼层
能不能使用串口调试助手?              
Jacquetry 发表于 2023-1-5 17:05 | 显示全部楼层
一个可以嵌入在程序中的嵌入式shell
jtracy3 发表于 2023-1-5 17:42 | 显示全部楼层
Letter Shell还是挺好用的。
geraldbetty 发表于 2023-1-6 12:58 | 显示全部楼层
注册函数怎么搞的?              
mnynt121 发表于 2023-1-6 14:01 | 显示全部楼层
怎么注册shell命令呢?              
deliahouse887 发表于 2023-1-6 15:53 | 显示全部楼层
Letter Shell主要自己写串口的吗?
i1mcu 发表于 2023-1-6 19:20 | 显示全部楼层
这个Letter Shell会占用多大的空间?
 楼主| freeelectron 发表于 2023-1-6 19:23 | 显示全部楼层
deliahouse887 发表于 2023-1-6 15:53
Letter Shell主要自己写串口的吗?

是的
 楼主| freeelectron 发表于 2023-1-6 19:23 | 显示全部楼层
usysm 发表于 2023-1-5 13:21
这个必须使用超级终端才行吗?

普通串口也可以啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:stm32/LoRa物联网:304350312

66

主题

786

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部