本帖最后由 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[i]);
- }
- }
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);
- }
- }
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] 用户shell初始化
- *
- */
- void userShellInit(void)
- {
- shell.write = userShellWrite;
- shellInit(&shell, shellBuffer, 512);
- }
shell对象和缓冲区:- Shell shell;
- char shellBuffer[512];
完成以上后,调用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交互。
|