历史上的今天
今天是:2024年09月11日(星期三)
2019年09月11日 | 一种STM32的串口控制台的实现
2019-09-11 来源:eefocus
一.背景
曾经玩Linux时非常喜欢这种基于出串口的控制台, 通过简单的串口TX和RX能实现嵌入式硬件的人机交互,非常实用, 那么STM32能否实现通过超级终端与用户互动的构想呢? 答案是肯定的,由于这个UART控制平台就像应用程序套上一层可访问的外科(Shell)故而我将这种基于UART的控制平台简称Shell,构架和效果如下图:


这张图箭头指向的是输入的指令,其余是STM32串口输出的信息,, 可以看到通过这些简单的指令输入我们通过Shell可以做很多事情:
1. 现场设备发生故障,可以通过Shell可以查看设备的故障状态统计信息
2. 能实现串口程序升级(需要Shell+IAP驱动程序支持)
3. 能读写访问参数区,实现对设备参数的本地配置
4. 配置多功能信号指示灯(LED灯可显示65535种信号,同一时刻只能显示一个.
5. 程序开发阶段基于Shell,可以极其方便的调试编写的驱动程序(开发极力推荐),非常好用.
二.Shell基础篇
Shell基础程序只有三个文件:
console.h:用于定义STM32用于Shell的实体串口
shell.cshell平台实现主体
shell.h头文件,任意的驱动文件可调用,就像 shell.c目前包含三个部件: shell模块(必选)Shell模块初始化时已初始化好Led模块 Led模块(必选)Ledx_on(x),Ledx_off(x),Ledx_div(x),函数是对编码信号进行控制,而不是直接对硬件实体控制,这样每个LED实体就像通道一样可以选择非常多的信号源显示. 精密延时模块(可选)启动需要对其初始化,此模块可用于记录时间点,并判断时间是否到(再也不用Delayms()这样的函数浪费效率实现时序了. 三. 程序文件: 1. console.h /*********************************Copyright (c)********************************* ** ** FIVE工作组 ** **---------------------------------File Info------------------------------------ ** File Name: shell_hal.h ** Last modified Date: 2014/5/26 14:22:35 ** Last Version: V1.0 ** Description: 本地Shell文件接口 ** **------------------------------------------------------------------------------ ** Created By: wanxuncpx ** Created date: 2014/5/26 14:22:34 ** Version: V2 ** Descriptions: 只适合STM32程序 **------------------------------------------------------------------------------ ** Libraries: STM32F10x_StdPeriph_Driver ** version V3.5 *******************************************************************************/ /****************************************************************************** 更新说明: ******************************************************************************/ /****************************************************************************** ********************************* 应 用 资 料 ******************************** ******************************************************************************/ #ifndef _SHELL_HAL_ #define _SHELL_HAL_ /****************************************************************************** ********************************* 文件引用部分 ******************************** ******************************************************************************/ //包含库文件 #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_tim.h" /****************************************************************************** ******************************** 可 配 置 参 数 ******************************* ******************************** MNCS_IMAGE图像板 ***************************** ******************************************************************************/ /*---------------------* * UART端口配置 *----------------------*/ //IO配置 #define CONSOLE USART3 #define CONSOLE_TX_PORT GPIOB #define CONSOLE_TX_PIN GPIO_Pin_10 #define CONSOLE_RX_PORT GPIOB #define CONSOLE_RX_PIN GPIO_Pin_11 //时钟配置 #define CONSOLE_GPIO_RCC_INIT() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE) #define CONSOLE_UART_RCC_INIT() RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE) //中断优先级 #define CONSOLE_UART_PRIO 7 //建议[0..15] //中断向量配置 #define CONSOLE_IRQn USART3_IRQn; #define CONSOLE_IRQHandler USART3_IRQHandler /*---------------------* * 四个LED定义 *----------------------*/ #define LED0_VALID 1 //非零表示使能对应的LED,0:无效 #define LED0_PORT GPIOB #define LED0_PIN GPIO_Pin_13 #define LED1_VALID 1 //非零表示使能对应的LED,0:无效 #define LED1_PORT GPIOB #define LED1_PIN GPIO_Pin_15 #define LED2_VALID 0 //非零表示使能对应的LED,0:无效 #define LED2_PORT GPIOA #define LED2_PIN GPIO_Pin_11 #define LED3_VALID 0 //非零表示使能对应的LED,0:无效 #define LED3_PORT GPIOA #define LED3_PIN GPIO_Pin_11 #define LED4_VALID 0 //非零表示使能对应的LED,0:无效 #define LED4_PORT GPIOA #define LED4_PIN GPIO_Pin_11 #define LED5_VALID 0 //非零表示使能对应的LED,0:无效 #define LED5_PORT GPIOA #define LED5_PIN GPIO_Pin_11 /*---------------------* * 时基BASE *----------------------*/ #define TIMEDly TIM4 #define TIMEDly_IRQn TIM4_IRQn #define TIMEDly_IRQHandler TIM4_IRQHandler //时钟配置 #define TIMEDly_RCC_INIT() RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //初始化LGPIO口 #define LEDx_GPIO_RCC_INIT() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE) //------------------------------------------------------------------------------ /****************************************************************************** ******************************* 以下参数无需更改 ****************************** ******************************************************************************/ /*---------------------* * 注意以下区域无需用户更改 *----------------------*/ #if LED0_VALID #define LED0_ON() (LED0_PORT->BRR = LED0_PIN) #define LED0_OFF() (LED0_PORT->BSRR = LED0_PIN) #define LED0_DIV() (LED0_PORT->ODR ^= LED0_PIN) #else #define LED0_ON() __NOP() #define LED0_OFF() __NOP() #define LED0_DIV() __NOP() #endif #if LED1_VALID #define LED1_ON() (LED1_PORT->BRR = LED1_PIN) #define LED1_OFF() (LED1_PORT->BSRR = LED1_PIN) #define LED1_DIV() (LED1_PORT->ODR ^= LED1_PIN) #else #define LED1_ON() __NOP() #define LED1_OFF() __NOP() #define LED1_DIV() __NOP() #endif #if LED2_VALID #define LED2_ON() (LED2_PORT->BRR = LED2_PIN) #define LED2_OFF() (LED2_PORT->BSRR = LED2_PIN) #define LED2_DIV() (LED2_PORT->ODR ^= LED2_PIN) #else #define LED2_ON() __NOP() #define LED2_OFF() __NOP() #define LED2_DIV() __NOP() #endif #if LED3_VALID #define LED3_ON() (LED3_PORT->BRR = LED3_PIN) #define LED3_OFF() (LED3_PORT->BSRR = LED3_PIN) #define LED3_DIV() (LED3_PORT->ODR ^= LED3_PIN) #else #define LED3_ON() __NOP() #define LED3_OFF() __NOP() #define LED3_DIV() __NOP() #endif #if LED4_VALID #define LED4_ON() (LED4_PORT->BSRR = LED4_PIN) #define LED4_OFF() (LED4_PORT->BRR = LED4_PIN) #define LED4_DIV() (LED4_PORT->ODR ^= LED4_PIN) #else #define LED4_ON() __NOP() #define LED4_OFF() __NOP() #define LED4_DIV() __NOP() #endif #if LED5_VALID #define LED5_ON() (LED5_PORT->BSRR = LED5_PIN) #define LED5_OFF() (LED5_PORT->BRR = LED5_PIN)
史海拾趣
|
电子竞赛中的30m的频率通讯电路图出来了 https://bbs.eeworld.com.cn/thread-85045-1-1.html 电子大赛之最大功率跟踪 https://bbs.eeworld.com.cn/thread-85046-1-1.html 大赛B题 自制声源 https://bbs.eeworld.com.cn/viewthread.php?tid=85080 ...… 查看全部问答> |
|
一、嵌入式系统的概念 着重理解“嵌入”的概念 主要从三个方面上来理解。 1、从硬件上,将基于CPU的处围器件,整合到CPU芯片内部,比如早期基于X86体系结构 ...… 查看全部问答> |
|
中*美*爱*梯*科*技, .NET外企软件工程师班将于2007年9月10日开课, 开课第一周免费试听, 欢迎大家踊跃报名参加! 中*美*爱*梯*科*技向学员郑重承诺: 百分之百保证就业, 月薪3000——8000, 就不了业者退还全部学费! ...… 查看全部问答> |
|
在淘宝上买的铁牛单片机,本来之前用还好好的,后来不知道烧了一个什么程序,导致每次通电之后继电器都会响一声,同时继电器下面那个绿灯也闪了一下,就一下。。。。烧录程序过程中,继电器就一直响,绿灯也一直闪烁。求高手们解答这是什么问题。? ...… 查看全部问答> |
|
最近由于在研究无线定位算法,所以上传一些资料和大伙共享下,这都是我从各个渠道汇集而来的,希望对大家有用,也希望下载过的朋友留下个脚印。 [ 本帖最后由 wateras1 于 2012-5-3 22:01 编辑 ]… 查看全部问答> |
|
第一个例程我昨天晚上就跑通了。今天看到网友说得好像很不容易,我把我的方法及遇到的问题说下。为以后扫清道路。 首先只要严格按照用户手册去做就应该没有问题。在这里再传下手册。同时自己也MARK一下。 我首先是下bootlaod: 手册上说很明确了 ...… 查看全部问答> |




