历史上的今天
返回首页

历史上的今天

今天是: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)

推荐阅读

史海拾趣

General Diode Corp公司的发展小趣事
焊接参数无法设置或无法保存。
Brand-Rex公司的发展小趣事

除了在欧洲和中国市场取得显著成就外,Brand-Rex还积极拓展全球市场。其亚太区总部设在澳大利亚墨尔本市,大中国区办事处分别设在北京、上海及香港,东南亚办事处设在新加坡。这些布局使得Brand-Rex能够更好地服务全球客户,满足不同地区的市场需求。同时,Brand-Rex还积极寻求与全球知名企业的合作机会,通过战略合作和技术交流不断提升自身的竞争力和创新能力。

综上所述,Brand-Rex在电子行业中的发展是一个充满挑战和机遇的过程。凭借其卓越的技术、优质的产品和全球市场的布局,Brand-Rex不断壮大并成为行业内的佼佼者。未来,随着全球电子行业的不断发展,Brand-Rex有望继续保持其领先地位,并为全球客户提供更加优质的产品和服务。

Diconex公司的发展小趣事

品质是电子行业的生命线。Diconex公司深知品质的重要性,因此从原材料采购到生产制造的每一个环节都严格把控品质。公司建立了完善的质量管理体系,对每一道生产工序都进行严格的检测和评估。这种对品质的执着追求使得Diconex的产品在市场上具有很高的口碑和竞争力。

D3 Semiconductor公司的发展小趣事

在不断发展壮大的过程中,D3 Semiconductor逐渐将业务拓展至电机控制领域。公司开发的功率MOSFET产品,在电机控制应用和电源中表现出色,提供了更高的效率、集成和性能。这一领域的拓展不仅丰富了D3 Semiconductor的产品线,也进一步巩固了公司在电子行业中的地位。

Emhiser Research Inc公司的发展小趣事

品质控制一直是Emhiser Research非常重视的方面。公司建立了严格的质量管理体系和检测流程,确保每一件产品都符合高标准的质量要求。同时,公司还注重品牌建设,通过不断提升产品品质和服务水平来树立品牌形象。这些努力使得Emhiser Research在客户中赢得了良好的口碑和信任。

Handok Co Ltd公司的发展小趣事

品质控制一直是Emhiser Research非常重视的方面。公司建立了严格的质量管理体系和检测流程,确保每一件产品都符合高标准的质量要求。同时,公司还注重品牌建设,通过不断提升产品品质和服务水平来树立品牌形象。这些努力使得Emhiser Research在客户中赢得了良好的口碑和信任。

问答坊 | AI 解惑

【2009年电子设计大赛题目分析三】——多图

电子竞赛中的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 ...…

查看全部问答>

教你如何学习嵌入式系统(基于ARM平台)(转)

一、嵌入式系统的概念          着重理解“嵌入”的概念    主要从三个方面上来理解。      1、从硬件上,将基于CPU的处围器件,整合到CPU芯片内部,比如早期基于X86体系结构 ...…

查看全部问答>

WIFI安全性问题

wifi在连接路由器时,wifi会搜索出周围存在无线路由器,对于其中一台无线路由器,如果我们不输入密码,能不能连上。我在做wifi测试的时候,只指定用户名,而没有输入密码或者输入错误的密码能连接上了无线路由器,请问产生这个现象的原因是不是wifi ...…

查看全部问答>

中*美*爱*梯*科*技, 9月10日新班开课, 免费试听!

中*美*爱*梯*科*技, .NET外企软件工程师班将于2007年9月10日开课, 开课第一周免费试听, 欢迎大家踊跃报名参加!   中*美*爱*梯*科*技向学员郑重承诺: 百分之百保证就业, 月薪3000——8000, 就不了业者退还全部学费!    ...…

查看全部问答>

Code Composer Studio v4.2 for MSP430(tm) User’s Guide

[ 本帖最后由 wstt 于 2011-9-14 13:34 编辑 ]…

查看全部问答>

单片机通电之后继电器就一直响。

在淘宝上买的铁牛单片机,本来之前用还好好的,后来不知道烧了一个什么程序,导致每次通电之后继电器都会响一声,同时继电器下面那个绿灯也闪了一下,就一下。。。。烧录程序过程中,继电器就一直响,绿灯也一直闪烁。求高手们解答这是什么问题。? ...…

查看全部问答>

基于无线的定位算法研究资料大全

最近由于在研究无线定位算法,所以上传一些资料和大伙共享下,这都是我从各个渠道汇集而来的,希望对大家有用,也希望下载过的朋友留下个脚印。 [ 本帖最后由 wateras1 于 2012-5-3 22:01 编辑 ]…

查看全部问答>

MXCHIP+跑第一个Wifi例程的注意事项

第一个例程我昨天晚上就跑通了。今天看到网友说得好像很不容易,我把我的方法及遇到的问题说下。为以后扫清道路。 首先只要严格按照用户手册去做就应该没有问题。在这里再传下手册。同时自己也MARK一下。 我首先是下bootlaod: 手册上说很明确了 ...…

查看全部问答>

求教用msp430g2553 做一个音乐流水灯

想用PWM做一个蜂鸣器播放音乐加流水灯一起,做一个音乐流水灯,那个大神有成熟的程序吗,帮忙分享一下…

查看全部问答>