【EV Board (MM32L0136C7P)测评】+移植Letter Shell
本帖最后由 freeelectron 于 2022-12-9 20:35 编辑本文移植Letter shell,通过串口输入命令,与开发板交互。
Letter shell的项目地址:https://github.com/NevermindZZT/letter-shell,最新的版本是3.1.2,也正是本文移植的版本。
在移植之前首先要保证串口收发正常,本文使用串口轮询发送和中断接收。
1、串口相关代码
void SerialInit(void)
{
/* GPIOA. */
RCC_EnableAHBPeriphs(RCC_AHB_PERIPH_GPIOA, true);
RCC_ResetAHBPeriphs(RCC_AHB_PERIPH_GPIOA);
/* UART2. */
RCC_EnableAPB1Periphs(RCC_APB1_PERIPH_UART2, true);
RCC_ResetAPB1Periphs(RCC_APB1_PERIPH_UART2);
GPIO_Init_Type gpio_init;
/* PA2 - UART2_TX. */
gpio_init.Pins= GPIO_PIN_2;
gpio_init.PinMode= GPIO_PinMode_AF_PushPull;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio_init);
GPIO_PinAFConf(GPIOA, GPIO_PIN_2, GPIO_AF_1);
/* PA3 - UART2_RX. */
gpio_init.Pins= GPIO_PIN_3;
gpio_init.PinMode= GPIO_PinMode_In_Floating;
gpio_init.Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio_init);
GPIO_PinAFConf(GPIOA, GPIO_PIN_3, GPIO_AF_1);
UART_Init_Type uart_init;
/* Setup the xfer engine. */
uart_init.ClockFreqHz = 24000000u; /* 48mhz, APB2. */
uart_init.BaudRate = 9600u;
uart_init.WordLength = UART_WordLength_8b;
uart_init.StopBits = UART_StopBits_1;
uart_init.Parity = UART_Parity_None;
uart_init.XferMode = UART_XferMode_RxTx;
uart_init.HwFlowControl = UART_HwFlowControl_None;
UART_Init(UART2, &uart_init);
/* Enable RX interrupt. */
UART_EnableInterrupts(UART2, UART_INT_RX_DONE, true);
NVIC_EnableIRQ(UART2_IRQn);
/* Enable UART. */
UART_Enable(UART2, true);
}
void SerialSend(uint8_t *data,uint16_t len)
{
for(uint16_t i=0; i<len;i++)
{
while ( 0u == (UART_STATUS_TX_EMPTY & UART_GetStatus(UART2)) ){}
UART_PutData(UART2, (uint8_t)data);
}
}2、Letter Shell接口
主要是shell_port.c文件中的userShellWrite和userShellRead,本文使用串口中断,可不实现userShellRead。short userShellWrite(char *data, unsigned short len)
{
void SerialSend(uint8_t *data,uint16_t len);
SerialSend((uint8_t *)data,len);
return len;
}void UART2_IRQHandler(void)
{
uint8_t ch;
if(0u != (UART_INT_RX_DONE & UART_GetInterruptStatus(UART2)))
{
ch=UART_GetData(UART2);
shellHandler(&shell, ch);
}
}/**
* @brief 用户shell初始化
*
*/
void userShellInit(void)
{
shell.write = userShellWrite;
shellInit(&shell, shellBuffer, 512);
}shell对象和缓冲区:Shell shell;
char shellBuffer;完成以上后,调用void userShellInit(void)函数,初始化即可,正常运行shell。
3、shell配置
shell_cfg.h文件中,主要是对shell进行配置的,可以配置用户名、密码等参数,可根据实际需要裁剪。
4、新增命令
本文新增了reboot命令,来进行测试:/* 系统重启 */
void reboot(int argc, char *agrv[])
{
NVIC_SystemReset();
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), reboot, reboot, reboot);5、现象
本文使用SecureCRT串口终端与mcu交互。
letter shell 3.0是一个C语言编写的,可以嵌入在程序中的嵌入式shell,通俗一点说就是一个串口命令行 etter-shell的移植非常简单,自己实现串口读写一个字符的接口,自己编写一个初始化函数,完成 letter-shell具备很多功能,可以通过宏定义来开启或者关闭,在shell_cfg.h文件中根据需要进行配置 在调试的模组比较复杂时,比如SPI Flash、LCD屏幕这些,我希望可以在串口直接调用某几个功能函数开始执行,当移植了shell之后,在代码中只需要添加一行宏定义,就可以在串口中调用此函数开始执行 函数最大传入参数个数由shell_cfg.h中的宏定义配置 在lettershell中输入keys命令即可查看当前支持的按键键值解析 这个必须使用超级终端才行吗? 能不能使用串口调试助手? 一个可以嵌入在程序中的嵌入式shell Letter Shell还是挺好用的。
注册函数怎么搞的? 怎么注册shell命令呢? Letter Shell主要自己写串口的吗? 这个Letter Shell会占用多大的空间? deliahouse887 发表于 2023-1-6 15:53
Letter Shell主要自己写串口的吗?
是的 usysm 发表于 2023-1-5 13:21
这个必须使用超级终端才行吗?
普通串口也可以啊
页:
[1]