[活动专区] 【AT-START-WB415测评】移植Letter shell,串口命令与开发板交互

[复制链接]
1442|8
 楼主| freeelectron 发表于 2022-8-25 19:52 | 显示全部楼层 |阅读模式
本文移植LetterShell,通过串口输入命令,与开发板交互。
Letter shell的项目地址:https://github.com/NevermindZZT/letter-shell


最新的版本是3.1.2,也正是本文移植的版本。


在移植之前首先要保证串口收发正常,本文使用串口轮询发送和中断接收。

1、串口相关代码
  1. void UartInit(void)
  2. {
  3.         gpio_init_type gpio_init_struct;

  4.         /* enable the uart and gpio clock */
  5.         crm_periph_clock_enable(CRM_USART2_PERIPH_CLOCK, TRUE);
  6.         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

  7.         gpio_default_para_init(&gpio_init_struct);

  8.         /* configure the usart2 tx pin */
  9.         gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  10.         gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  11.         gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  12.         gpio_init_struct.gpio_pins = GPIO_PINS_2;
  13.         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  14.         gpio_init(GPIOA, &gpio_init_struct);
  15.        
  16.         /* configure the usart2 rx pin */
  17.         gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  18.         gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  19.         gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  20.         gpio_init_struct.gpio_pins = GPIO_PINS_3;
  21.         gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  22.         gpio_init(GPIOA, &gpio_init_struct);
  23.   
  24.         /* configure uart param */
  25.         usart_init(USART2, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
  26.        
  27.         usart_transmitter_enable(USART2, TRUE);
  28.         usart_receiver_enable(USART2, TRUE);
  29.    
  30.         nvic_irq_enable(USART2_IRQn, 0, 0);

  31.         usart_interrupt_enable(USART2, USART_RDBF_INT, TRUE);
  32.         usart_enable(USART2, TRUE);
  33. }




  34. /* retarget the C library printf function to the USART */
  35. int fputc(int ch, FILE *f)
  36. {
  37.         while(usart_flag_get(USART2, USART_TDC_FLAG) == RESET);
  38.         usart_data_transmit(USART2, (uint8_t) ch);
  39.        
  40.     return ch;
  41. }
2、Letter shell接口
主要是shell_port.c文件中的userShellWrite和userShellRead,本文使用串口中断,可不比实现userShellRead。
2.1、userShellWrite

  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] 用户shell写
  3. *
  4. * @param data 数据
  5. * @param len 数据长度
  6. *
  7. * [url=home.php?mod=space&uid=266161]@return[/url] short 实际写入的数据长度
  8. */
  9. short userShellWrite(char *data, unsigned short len)
  10. {
  11.         for(uint16_t i=0;i<len;i++)
  12.         {
  13.                 while(usart_flag_get(USART2, USART_TDC_FLAG) == RESET);
  14.                 usart_data_transmit(USART2, data[i]);
  15.         }
  16.        
  17.     return len;
  18. }
2.2、在串口中断接收中处理shell接收
  1. void USART2_IRQHandler(void)
  2. {
  3.         uint8_t ch=0;

  4.         if(usart_flag_get(USART2, USART_RDBF_FLAG) != RESET)
  5.         {
  6.                 /* read one byte from the receive data register */
  7.                 ch = usart_data_receive(USART2);
  8.                 shellHandler(&shell, ch);
  9.         }
  10. }


2.3、shell注册读写函数
  1. void userShellInit(void)
  2. {
  3.     shell.write = userShellWrite;
  4.     shellInit(&shell, shellBuffer, 512);
  5. }
2.4、定义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、现象
本文使用CRT串口终端,
Letter shell.jpg







lvben5d 发表于 2022-8-26 06:55 | 显示全部楼层
本帖最后由 lvben5d 于 2022-8-28 08:20 编辑

请问这个 实战意义是不是代替了上位机软件,可以做可视化 控制交互作用为主吗?讲讲 列举下 主要好处是哪些?
有的8位机 不支持prinf C函数,步知道这个Shell是不是有助力的功能 从而实现一些便利。
看样子 只需要MCU的支持C库编译 int fputc(int ch, FILE *f)      并不用操作系统模式分配一个task
有的8位机 不支持这个函数。。也不能printf
 楼主| freeelectron 发表于 2022-8-26 12:39 | 显示全部楼层
lvben5d 发表于 2022-8-26 06:55
请问这个 实战意义是不是代替了上位机软件,可以做可视化 控制交互作用为主吗? ...

当然可以了
jimmhu 发表于 2022-9-3 17:17 | 显示全部楼层
串口命令是怎么关联上的?
chenci2013 发表于 2022-9-3 17:46 | 显示全部楼层
串口有什么影响吗
vivilyly 发表于 2022-9-3 21:50 | 显示全部楼层
lettershell有什么功能呢
Henryko 发表于 2022-9-7 21:29 | 显示全部楼层
串口有什么影响?
Undshing 发表于 2022-10-5 21:07 | 显示全部楼层
串口命令是咋关联的啊?
 楼主| freeelectron 发表于 2022-10-6 08:30 | 显示全部楼层
Undshing 发表于 2022-10-5 21:07
串口命令是咋关联的啊?

提供串口输入,输出字节的接口就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

66

主题

786

帖子

11

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