Letter-Shell在STM32MCU上的移植-PART1基于前后台
MCU上,没有⼀个像Linux或者DOS⼀样,通过命令⾏来操作,调试,实在是太不⽅便了,好在有⼤师已经写好了⼀个Letter-Shell,亲测好⽤,基于前后台的命令⾏控制的移植步骤介绍如下。
1. 下载源⽂件
2. 准备STM32Cube⽣成程序框架
配置时钟,使能SWD,开启UART1⽤于SHELL和控制台交互,记得开启中断,SHELL要⽤。
3.导⼊Letter-Shell核⼼⽂件
这⾥新建了⼀个Group,取名为shell-letter,将核⼼⽂件导⼊,其中shell_port.c是需要⾃⼰编写的,适应⾃⼰的平台的移植⽂件,只需要改这个就⾏,另外还有⼀个cfg的头⽂件,是⽤于配置shell的。
4. 配置⼯程⽂件信息-头⽂件以及编译选项(重要)
第⼀步把新建的group的头⽂件包括进来
第⼆步(很重要)
加⼊以下这个Misc controls,否则导出命令会有问题,⾄今不知道这个选项是⼲啥的,也是搜了很久才发现,留待⾼⼿深究告诉我。--keep shellCommand*
5. 编写移植⽂件shell_port.c
核⼼的代码如下,
/**
* @file shell_port.c
* @author Letter (NevermindZZT@gmail)
* @brief
* @version 0.1
* @date 2019-02-22
*
* @Copyright (c) 2019 Unicook
*
*/
#include"shell.h"
#include"main.h"
#include"shell_port.h"
#include"stdio.h"
#include"bmp280_drv.h"
Shell shell;
char shellBuffer[512];
uint8_t recv_buf =0;
static float bmp280_t, bmp280_p;
/**
* @brief ⽤户shell写
*
* @param data 数据
*/
void userShellWrite(char data)
{
//调⽤STM32 HAL库 API 使⽤查询⽅式发送
extern UART_HandleTypeDef huart1;
HAL_UART_Transmit(&huart1,(uint8_t*)&data,1,0xFFFF);
shell代码
}
/**
* @brief ⽤户shell读
*
* @param data 数据
* @return char 状态
*/
signed char userShellRead(char*data)
{
return0;
}
/**
* @brief ⽤户shell初始化
*
*/
void User_Shell_Init(void)
{
extern UART_HandleTypeDef huart1;
//使能串⼝中断接收
HAL_UART_Receive_IT(&huart1,(uint8_t*)&recv_buf,1);
shell.write = userShellWrite;
shellInit(&shell, shellBuffer,512);
}
/* 中断回调函数 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
{
extern UART_HandleTypeDef huart1;
/* 判断是哪个串⼝触发的中断 */
if(huart ->Instance == USART1)
{
//调⽤shell处理数据的接⼝
shellHandler(&shell, recv_buf);
//使能串⼝中断接收
HAL_UART_Receive_IT(&huart1,(uint8_t*)&recv_buf,1);
}
}```
我⾃⼰编写的⼀些例⼦
```c
/* 系统重启 */
int reboot(int argc,char*agrv[])
{
HAL_NVIC_SystemReset();
printf("%dparameter(s)\r\n", argc);
for(char i =1; i < argc; i++)
{
printf("%s\r\n", agrv[i]);
}
return0;
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), reboot, reboot, reboot); /* 不优化宏定义试试(能⽤)SHELL_USING_CMD_EXPORT == 1需要把这个打开 */
int func(int argc,char*agrv[])
{
printf("%dparameter(s)\r\n", argc);
for(char i =0; i < argc; i++)
{
printf("argument %d --- %s\r\n", i, agrv[i]);
}
return0;
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), func, func, test);
/* 系统信息 */
int sysinfo(int argc,char*agrv[])
{
uint32_t temp;
//printf("%dparameter(s)\r\n", argc);
printf("\r\n");
temp =HAL_GetDEVID();printf("HAL_GetDEVID            ------    0x%08x\r\n", temp);
temp =HAL_GetHalVersion();printf("HAL_GetHalVersion      ------    0x%08x\r\n", temp);
temp =HAL_GetREVID();printf("HAL_GetREVID            ------    0x%08x\r\n", temp);
temp =HAL_GetUIDw0();printf("HAL_GetUIDw0            ------    0x%08x\r\n", temp);
temp =HAL_GetUIDw1();printf("HAL_GetUIDw1            ------    0x%08x\r\n", temp);
temp =HAL_GetUIDw2();printf("HAL_GetUIDw2            ------    0x%08x\r\n", temp);
temp = SystemCoreClock;printf("SystemCoreClock        ------    0d%08d\r\n", temp);
temp =HAL_RCC_GetHCLKFreq();printf("HAL_RCC_GetHCLKFreq    ------    0d%08d\r\n", temp);
temp =HAL_RCC_GetPCLK1Freq();printf("HAL_RCC_GetPCLK1Freq    ------    0d%08d\r\n", temp);
temp =HAL_RCC_GetPCLK2Freq();printf("HAL_RCC_GetPCLK2Freq    ------    0d%08d\r\n", temp);
temp =HAL_RCC_GetSysClockFreq();printf("HAL_RCC_GetSysClockFreq ------    0d%08d\r\n", temp);
/*
for (char i = 1; i < argc; i++)
{
printf("%s\r\n", agrv[i]);