一.背景
曾經(jīng)玩Linux時(shí)非常喜歡這種基于出串口的控制臺(tái), 通過簡(jiǎn)單的串口TX和RX能實(shí)現(xiàn)嵌入式硬件的人機(jī)交互,非常實(shí)用, 那么STM32能否實(shí)現(xiàn)通過超級(jí)終端與用戶互動(dòng)的構(gòu)想呢? 答案是肯定的,由于這個(gè)UART控制平臺(tái)就像應(yīng)用程序套上一層可訪問的外科(Shell)故而我將這種基于UART的控制平臺(tái)簡(jiǎn)稱Shell,構(gòu)架和效果如下圖:
這張圖箭頭指向的是輸入的指令,其余是STM32串口輸出的信息,, 可以看到通過這些簡(jiǎn)單的指令輸入我們通過Shell可以做很多事情:
1. 現(xiàn)場(chǎng)設(shè)備發(fā)生故障,可以通過Shell可以查看設(shè)備的故障狀態(tài)統(tǒng)計(jì)信息
2. 能實(shí)現(xiàn)串口程序升級(jí)(需要Shell+IAP驅(qū)動(dòng)程序支持)
3. 能讀寫訪問參數(shù)區(qū),實(shí)現(xiàn)對(duì)設(shè)備參數(shù)的本地配置
4. 配置多功能信號(hào)指示燈(LED燈可顯示65535種信號(hào),同一時(shí)刻只能顯示一個(gè).
5. 程序開發(fā)階段基于Shell,可以極其方便的調(diào)試編寫的驅(qū)動(dòng)程序(開發(fā)極力推薦),非常好用.
二.Shell基礎(chǔ)篇
Shell基礎(chǔ)程序只有三個(gè)文件:
console.h:用于定義STM32用于Shell的實(shí)體串口
shell.cshell平臺(tái)實(shí)現(xiàn)主體
shell.h頭文件,任意的驅(qū)動(dòng)文件可調(diào)用,就像 shell.c目前包含三個(gè)部件: shell模塊(必選)Shell模塊初始化時(shí)已初始化好Led模塊 Led模塊(必選)Ledx_on(x),Ledx_off(x),Ledx_div(x),函數(shù)是對(duì)編碼信號(hào)進(jìn)行控制,而不是直接對(duì)硬件實(shí)體控制,這樣每個(gè)LED實(shí)體就像通道一樣可以選擇非常多的信號(hào)源顯示. 精密延時(shí)模塊(可選)啟動(dòng)需要對(duì)其初始化,此模塊可用于記錄時(shí)間點(diǎn),并判斷時(shí)間是否到(再也不用Delayms()這樣的函數(shù)浪費(fèi)效率實(shí)現(xiàn)時(shí)序了. 三. 程序文件: 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 *******************************************************************************/ /****************************************************************************** 更新說明: ******************************************************************************/ /****************************************************************************** ********************************* 應(yīng) 用 資 料 ******************************** ******************************************************************************/ #ifndef _SHELL_HAL_ #define _SHELL_HAL_ /****************************************************************************** ********************************* 文件引用部分 ******************************** ******************************************************************************/ //包含庫文件 #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_tim.h" /****************************************************************************** ******************************** 可 配 置 參 數(shù) ******************************* ******************************** 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 //時(shí)鐘配置 #define CONSOLE_GPIO_RCC_INIT() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE) #define CONSOLE_UART_RCC_INIT() RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE) //中斷優(yōu)先級(jí) #define CONSOLE_UART_PRIO 7 //建議[0..15] //中斷向量配置 #define CONSOLE_IRQn USART3_IRQn; #define CONSOLE_IRQHandler USART3_IRQHandler /*---------------------* * 四個(gè)LED定義 *----------------------*/ #define LED0_VALID 1 //非零表示使能對(duì)應(yīng)的LED,0:無效 #define LED0_PORT GPIOB #define LED0_PIN GPIO_Pin_13 #define LED1_VALID 1 //非零表示使能對(duì)應(yīng)的LED,0:無效 #define LED1_PORT GPIOB #define LED1_PIN GPIO_Pin_15 #define LED2_VALID 0 //非零表示使能對(duì)應(yīng)的LED,0:無效 #define LED2_PORT GPIOA #define LED2_PIN GPIO_Pin_11 #define LED3_VALID 0 //非零表示使能對(duì)應(yīng)的LED,0:無效 #define LED3_PORT GPIOA #define LED3_PIN GPIO_Pin_11 #define LED4_VALID 0 //非零表示使能對(duì)應(yīng)的LED,0:無效 #define LED4_PORT GPIOA #define LED4_PIN GPIO_Pin_11 #define LED5_VALID 0 //非零表示使能對(duì)應(yīng)的LED,0:無效 #define LED5_PORT GPIOA #define LED5_PIN GPIO_Pin_11 /*---------------------* * 時(shí)基BASE *----------------------*/ #define TIMEDly TIM4 #define TIMEDly_IRQn TIM4_IRQn #define TIMEDly_IRQHandler TIM4_IRQHandler //時(shí)鐘配置 #define TIMEDly_RCC_INIT() RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //初始化LGPIO口 #define LEDx_GPIO_RCC_INIT() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE) //------------------------------------------------------------------------------ /****************************************************************************** ******************************* 以下參數(shù)無需更改 ****************************** ******************************************************************************/ /*---------------------* * 注意以下區(qū)域無需用戶更改 *----------------------*/ #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)
上一篇:STM32的結(jié)構(gòu)和啟動(dòng)模式
下一篇:STM32F103C8T6 Standby低功耗模式
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 光電融合突破算力邊界:曦智科技2025 WAIC發(fā)布多維度創(chuàng)新成果
- 阿里黑科技落地!夸克AI眼鏡全球首發(fā),高德、淘寶、支付寶都能用
- 化繁為簡(jiǎn), 適配復(fù)雜磁場(chǎng)環(huán)境,MT73xx 3D雙路輸出霍爾鎖存器賦能車規(guī)電機(jī)精準(zhǔn)控制
- 9.5億美元收購恩智浦MEMS傳感器業(yè)務(wù),意法半導(dǎo)體 在傳感器領(lǐng)域的地位再升級(jí)
- 高性能電動(dòng)滑板車 BLDC 電機(jī)驅(qū)動(dòng)器:技術(shù)解析與應(yīng)用展望
- 5G工業(yè)網(wǎng)關(guān)的“邊緣計(jì)算+AI推理”一體化設(shè)計(jì),PLC協(xié)議解析與缺陷檢測(cè)的實(shí)時(shí)聯(lián)動(dòng)
- AR眼鏡的“工業(yè)指令投射”系統(tǒng),SLAM的空間定位、PLC數(shù)據(jù)實(shí)時(shí)疊加顯示
- 多光譜氣體傳感器的抗交叉干擾設(shè)計(jì)
- 多模態(tài)融合感知的“語義-幾何”聯(lián)合建模
- 工業(yè)觸摸屏的“壓感-手勢(shì)”多模態(tài)交互設(shè)計(jì)
- 解鎖 TE 掌上信息智庫,獲取一站式資源!
- 有獎(jiǎng)直播|魏德米勒 OMNIMATE® 聯(lián)接技術(shù)的創(chuàng)新發(fā)展
- TI CC1310網(wǎng)絡(luò)研討會(huì)誠邀您預(yù)報(bào)名參加,驚喜獎(jiǎng)不停!
- PSoC4 Cortex-M0開發(fā)板免費(fèi)申請(qǐng),分享心得贏驚喜大禮!
- NXP微控制器電路板,針對(duì)USB Type C接口設(shè)計(jì),評(píng)測(cè)創(chuàng)意有獎(jiǎng)?wù)骷?,曬心得更有多重好禮!
- TI汽車方案拼圖,你敢挑戰(zhàn)嗎?
- 下載有禮|《ADI 流式細(xì)胞分析儀解決方案》
- 【在線研討會(huì)】ADI RadioVerse™技術(shù)與集成DPD算法的RF收發(fā)器AD9375
- 保密行家也難防內(nèi)鬼,數(shù)據(jù)泄露對(duì)于蘋果是否還重要?
- 虛擬現(xiàn)實(shí)技術(shù)新發(fā)展,人類是否可以擁有動(dòng)物感覺?
- 人工智能崛起,是否會(huì)有新的危機(jī)出現(xiàn)?
- 從NEC開始,介紹史上多款具有里程碑意義的圖形處理芯片
- 高通5G技術(shù)推動(dòng)工業(yè)物聯(lián)等行業(yè)發(fā)展應(yīng)用 不局限于手機(jī)終端
- 華為將在印度有大動(dòng)作!
- 美國FCC提議擬禁用華為等5家中企設(shè)備
- 瑞聲科技投資固態(tài)激光雷達(dá)領(lǐng)導(dǎo)者Ibeo,提升LiDAR制造能力
- 四川時(shí)代動(dòng)力電池項(xiàng)目一期正式投運(yùn)
- Waymo成功融資25億美元,谷歌的硬件之路要崛起了?