前言
硬件的配置由前面的工程递增,会根据目的修改部分控制代码
由于本人较懒,记录主要是过程,原理性的东西网上一大把,我就不赘述了,由于懒,主要由图片和代码加少量文字组成
一、nr_micro_shell简介和下载
nr_micro_shell是轻量级的shell,代码和实现与uboot的shell非常相似,本文中下载的版本为当前最新版本2.0
下载地址https://gitee.com/nrush/nr_micro_shell
下载完成后将src
下的nr_micro_shell_core.c
和nr_micro_shell_cmds.c
拷贝到Src内待用;将inc
下的nr_micro_shell.h.h
和examples\simulator\
下的nr_micro_shell_port.h
拷贝到Inc内待用
keil工程内添加对应文件
二、代码修改和测试
将nr_micro_shell_port.h
的两个宏定义注释,否则由于外部代码依赖无法编译
///#define NR_SHELL_CMD_TIME /* Enable time cmd */
......
///#define NR_SHELL_DEBUG /* Enable debug logging functionality for the shell */
在freertos.c
的StartDefaultTask
函数里对shell初始化,关闭之前打印的干扰
#include "nr_micro_shell.h"
......
/* USER CODE BEGIN StartDefaultTask */
shell_init();
/* Infinite loop */
for(;;)
{
HAL_GPIO_TogglePin(GPIOF,LED0_Pin);
//printf("this is DefaultTask\r\n");
osDelay(1000);
}
/* USER CODE END StartDefaultTask */
修改usart.c中串口接收的中断回调函数
#include "nr_micro_shell.h"
......
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
#if 0
if(Uart1_Rx_Cnt >= 255) //溢出判断
{
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);
}
else
{
RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer; //接收数据转存
if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
{
HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //回环
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
}
}
#else
shell(aRxBuffer);//shell
#endif
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
}
连接好烧录器编译并烧录
可以观察到shell的打印和help指令的打印
要编写自己的指令参照nr_micro_shell_cmds.c
中的指令格式即可(一个入口函数、在cmd_table
里添加对于函数的结构体成员)
总结
主要介绍了STM32 nr_micro_shell的配置和测试