Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
FinSH
关于用STM32CubeMAX 生成的Keil工程,如何添加finsh shell 问题
发布于 2017-11-16 12:43:12 浏览:5639
订阅该版
Hi all 最近RT-Thread 这么火,于是也想自己的Demo 能用上rtthread,看了官网关于 rtthread nano的入门教程,成功的在我的STM32L053C8 DIS开发板上运行成功。 ![微信图片_20171116123553.jpg](/uploads/9799_d6d757a9dd7476c7012a93ab586fced5.jpg) 然后我想试一下finsh shell , 短接板子上 SB2 SB3,让串口和板载的STLINK的串口连接,调了一个串口程序,可以使用。然后搜索调试finsh shell的教程,发现网上唯一的相关说明就是:[rt-thread下的串口驱动程序分析](http://www.rt-thread.org/dokuwiki/doku.php?id=rt-thread%E4%B8%8B%E7%9A%84%E4%B8%B2%E5%8F%A3%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E5%88%86%E6%9E%90) 然而太复杂了,没有直接用CubeMAX生成的串口代码,而是自己编的,我想问一下,有没有直接使用CubeMAX生成的串口程序,然后在哪添加finsh shell关于串口部分的硬件底层驱动?
查看更多
9
个回答
默认排序
按发布时间排序
tanek
2017-11-16
这家伙很懒,什么也没写!
nano推荐使用msh,msh是类似linux命令行风格的shell。 怎么使用msh可以看rtthread和正点原子合作的demo。
cnbeta2004
2017-12-04
这家伙很懒,什么也没写!
最近在MDK在使用了rtthread nano版本,也遇到了finsh不知如何使用的困难。 首先官方关于rtthread nano的介绍中提到了mdk中有个rt-thread::shell的东西,但是实际上MDK中并不能找到。 然后,在rtconfig.h中启用了serial功能后,缺少相关的头文件,似乎该设备并未实现。(需要自己实现吗?) 另外,官方的关于rtthread nano的介绍中,提到了rtthread nano版本在内核API上是与rtthread版本完全一致的。我初来咋到,之前没有接触过rtthread,不知道它们在设备驱动框架及具体设备驱动实现之间是否通用?我能否将rtthread components下的设备驱动放入nano中运行呢?
bernard
2017-12-04
这家伙很懒,什么也没写!
这块可以做个简单的lwUART,来对接shell,后面做一个,并升级RTT nano吧
cnbeta2004
2017-12-04
这家伙很懒,什么也没写!
>这块可以做个简单的lwUART,来对接shell,后面做一个,并升级RTT nano吧 --- 好的,谢谢。按照你说的实现lwUART,已经可以使用了。 再追问一下,list_mem这个命令还没有,如果需要查看内存情况,应该如何做呢?
bernard
2017-12-04
这家伙很懒,什么也没写!
nano比较小,没开动态内存堆吧
cnbeta2004
2017-12-04
这家伙很懒,什么也没写!
>nano比较小,没开动态内存堆吧 --- 配置中开启了这两个: Dynamic Heap Management using small memory 主要用在 rt_xxx_create上,自己的代码没有用过malloc这类函数,分配的最大内存(600字节左右)是放在栈上的。 使用的芯片是STM32F103C8,20K RAM。
kklili
2017-12-05
这家伙很懒,什么也没写!
串口是实现控制台的主要途径,主要需要修改以下内容: ?在Cubemx里面打开串口中断。 ?打开设备的时候选择中断收发: ``` rt_device_open(shell->device, (RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_INT_RX)); ``` ?去掉CubeMX里面串口收发函数里面的lock,否则由于shell回显的原因,程序有概率锁死。 串口初始化原来是在usart.c里面实现的,之前主要有以下几个函数和相关宏定义。 ?开头的结构定义 ``` #define UART_BUF_LEN 256 struct drv_uart { UART_HandleTypeDef* UartHandle; //保存了HAL库里面串口的Handle uint8_t uartBuf[UART_BUF_LEN]; //中断接收的缓存,一个个接收 uint8_t uartLenWr; //当前未处理数据的长度 uint8_t uartLenRd; //当前未处理数据的长度 }; #ifdef RT_USING_UART1 extern UART_HandleTypeDef huart1; //自动生成的变量,在Main.c中 struct drv_uart uart1; //本模块注册用的变量,保存在serial的usdate中 struct rt_serial_device serial1; //RT用的变量 #endif ``` ?串口控制宏定义,在rtConfig.h中 ``` #define RT_USING_SERIAL #define RT_USING_UART1 #define RT_USING_UART2 //#define RT_USING_UART3 //#define RT_USING_UART4 //#define RT_USING_UART5 //#define RT_USING_UART6 ``` 注意,务必保证USING的串口和CubeMX里面定义的串口一致。 ?本地变量定义,这些变量用于和rtthread的接口函数交互 ``` /* STM32 uart driver */ struct drv_uart { UART_HandleTypeDef* UartHandle; //保存了HAL库里面串口的Handle uint8_t uartBuf[1]; //中断接收的缓存,一个个接收 int uartLen; //当前未处理数据的长度 }; #ifdef RT_USING_UART1 extern UART_HandleTypeDef huart1; //自动生成的变量,在Main.c中 static struct drv_uart uart1; //本模块注册用的变量 struct rt_serial_device serial1; //RT用的变量 #endif ``` ?和RT交互的函数指针 ``` static const struct rt_uart_ops drv_uart_ops = { drv_configure, drv_control, drv_putc, drv_getc, }; ``` 这个是一个函数指针,包括了串口的配置、控制、读取和写入的函数。 目前所有的配置都是由CubeMX自动生成的代码完成,所以对函数进行以下修改: drv_configure :直接为空函数。 drv_control :直接为空函数。 drv_putc :改为调用HAL_UART_Transmit函数,具体参见下面。 drv_getc :具体参见下面接收说明。 hw_usart_init :初始化函数,目前只需要根据宏定义注册对应的串口即可。 根据CubeMX的特点,对本程序进行一下修改: ?初始化函数stm32_hw_usart_init():这里配置什么的已经没用了,只是单纯的注册了一个uart1的设备,并启动接收。 ``` int stm32_hw_usart_init(void) { struct drv_uart *uart; struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; #ifdef RT_USING_UART1 uart = &uart1; uart->UartHandle = &huart1; serial1.ops = &drv_uart_ops; serial1.config = config; /* register UART1 device */ rt_hw_serial_register(&serial1, "uart1", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); HAL_UART_Receive_IT(uart->UartHandle, uart->uartBuf, sizeof(uart->uartBuf));//启动中断接收 #endif /* RT_USING_UART1 */ } ``` 中断接收回调函数HAL_UART_RxCpltCallback,目前HAL库的接收模式是首先在HAL_UART_Receive_IT函数中启动接收,收到后调用HAL_UART_RxCpltCallback函数进行处理,在本函数收将收到的数保持到对应的buf中,系统会自动调用getc函数进行接收处理,注意getc后需要继续调用HAL_UART_Receive_IT函数进行接收。 ``` //HAL库接收回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { struct rt_serial_device *serial = getSerialDevByHandle(huart);//根据Handle获得serial if (serial == NULL) return; struct drv_uart *uart = serial->parent.user_data; uart->uartLen++; rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } static int drv_getc(struct rt_serial_device *serial) { struct drv_uart *uart = serial->parent.user_data; if (uart->uartLen) { uart->uartLen--; HAL_UART_Receive_IT(uart->UartHandle, uart->uartBuf, sizeof(uart->uartBuf));//继续接收 return uart->uartBuf[0]; } return -1; } ``` //注意,这里发送必须使用中断发送 static int drv_putc(struct rt_serial_device *serial, char c) { struct drv_uart *uart = serial->parent.user_data; HAL_UART_Transmit_IT(uart->UartHandle, (uint8_t*)&c, 1); return 1; } //由于改为了中断发送,在open设备的时候必须加上RT_DEVICE_FLAG_INT_TX标志位(rt_console_set_device函数和finsh_set_device函数) rt_device_open(new, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_TX |RT_DEVICE_FLAG_STREAM); ?为了使用Finsh,需要在Linker加上 --keep __fsym_* --keep __vsym_* ?最后记得在main函数硬件初始化完成后调用shell和finsh的初始化函数。 #ifdef RT_USING_FINSH /* initialize finsh */ finsh_system_init(); finsh_set_device(RT_CONSOLE_DEVICE_NAME); #endif
yelong98
2018-01-15
这家伙很懒,什么也没写!
我也研究三天了没能实现nano版本的finsh
撰写答案
登录
注册新账号
关注者
0
被浏览
5.6k
关于作者
wbhb2016
这家伙很懒,什么也没写!
提问
1
回答
0
被采纳
0
关注TA
发私信
相关问题
1
RT-THREAD shell无反应呢?
2
RT-thread2.0beta下用类似linux风格MSH,参数如何输入和导出
3
rt-thread finsh windows下的那个终端软件叫什么来着
4
板子上只有485接口,能把FINSH改造成485的么?
5
finsh最大字符问题
6
finsh命令个数是不是有限制啊
7
finsh支持转义字符吗
8
不用finsh如何知道堆栈使用量
9
强烈建议 RT-Thread下finsh原理深入分析
10
finsh输入命令全部返回null node
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT-Thread Studio V2.2.9 Release Note
2
CherryUSB的bootuf2配置
3
在用clangd开发RTT吗,快来试试如何简单获得清晰干净的工作区
4
GD32F450 片内 flash驱动适配
5
STM32H7R7运行CherryUSB
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
12
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
7
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部