c語言stm32串口控制單片機,實用STM32的串口控制平臺的實現

假設我要編寫一個自己的指令腳本, 來讀取MCU的關鍵信息,關鍵字為mcu, 文件命名為shell_mcu.c; 當輸入“mcu rd 0”時顯示MCU的FLASH大小,輸入“mcu rd 1”時讀取MCU的唯一ID信息。

shell_mcu.c源代碼:

/*********************************Copyright (c)*********************************

**

**? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?FIVE工作組

**

**---------------------------------File Info------------------------------------

** File Name:? ? ? ? ? ? ? ?shell_mcu.c

** Last modified Date:? ? ? 2017/9/17 15:13:57

** Last Version:? ? ? ? ? ? V1.0

** Description:? ? ? ? ? ? ?shell測試

**

**------------------------------------------------------------------------------

** Created By:? ? ? ? ? ? ? wanxuncpx

** Created date:? ? ? ? ? ? 2017/9/17 15:14:08

** Version:? ? ? ? ? ? ? ? ?V1.0

** Descriptions:? ? ? ? ? ? none

**------------------------------------------------------------------------------

** HW_CMU:? ? ? ? ? ? ? ? ? STM32F103

** Libraries:? ? ? ? ? ? ? ?STM32F10x_StdPeriph_Lib_V3.5.0

** version? ? ? ? ? ? ? ? ? V3.5

*******************************************************************************/

/******************************************************************************

更新說明:

******************************************************************************/

/******************************************************************************

*********************************? 編 譯 控 制 ********************************

******************************************************************************/

#define MCU_SHELL? ? ? ? ? ? ? ?//注釋掉時屏蔽iap shell功能

#include "xc_shell.h"? ? ? ?//Shell支持文件,含bool,uint8_t..以及串口數據收發操作

/******************************************************************************

********************************* 文件引用部分 ********************************

******************************************************************************/

/*---------------------*

*? ? ?模塊驅動引用

*----------------------*/

//#include "net_w5500.h"

#ifdef MCU_SHELL

/******************************************************************************

********************************** Shell實例 **********************************

******************************************************************************/

/*---------------------*

*? ? ? CLI指令服務

*----------------------*/

extern bool Shell_MCU_Service(void * pcBuff, uint16_t len );

/*---------------------*

*? ? ? ?CLI 結構

*----------------------*/

const Cmd_Typedef_t CLI_McuMsg=

{

//識別關鍵字

"mcu",

//幫助內容

"[mcu contorls]\r\n"

" mcu rd \t\t- Read FLASH information.\r\n"

"\r\n",

//處理函數

&Shell_MCU_Service,

//附帶數據

0,

#ifdef SHELL_USE_YMODEM

//存儲介質

NULL,

#endif

};

/*---------------------*

*? ? ?CLI鏈表節(輸出)

*----------------------*/

Cmd_List_t? McuList? = {&CLI_McuMsg? ? ? ,NULL}; //IAP指令鏈表

/******************************************************************************

********************************* 函 數 聲 明 *********************************

******************************************************************************/

/******************************************************************************

/ 函數功能:STM32F103控制函數

/ 修改日期:2015/7/14 20:22:02

/ 輸入參數:none

/ 輸出參數:none

/ 使用說明:需要執行約10s

******************************************************************************/

static bool FLASH_ioctl(uint8_t cmd,void * param)

{

#define UID_ADDR? ? ? ? ? ? 0x1FFFF7E0? //閃存容量寄存器,值對應KB單位

#define MAC_ADDR? ? ? ? ? ? 0x1FFFF7E8? //MCU的唯一ID號,共12個字節

#define UID_SIZE? ? ? ? ? ? 2? ? ? ? ? ?//UID的字節數

#define MAC_SIZE? ? ? ? ? ? 12? ? ? ? ? //MAC的字節數

//step1: 檢查參數

if(!param)return false;

//step2: 處理數據

switch(cmd){

case 0 : {? ? ? ?//獲取FLASH的的UID

uint16_t * ptDst = (uint16_t *)((uint32_t)param+1);

*ptDst = *(uint16_t *)UID_ADDR;

*(uint8_t? *)param =? UID_SIZE;

return true;

}

case 1 : {? ? ? ?//獲取芯片的MAC地址

uint32_t * ptDst = (uint32_t *)((uint32_t)param+1);

uint32_t * ptSrc = (uint32_t *)MAC_ADDR;

*ptDst++ = *ptSrc++;

*ptDst++ = *ptSrc++;

*ptDst++ = *ptSrc++;

*(uint8_t? *)param = MAC_SIZE;

return true;

}

default:return false;

}

}

/******************************************************************************

/ 函數功能:文件系統Shel指令處理

/ 修改日期:2013/9/10 19:04:15

/ 輸入參數:輸入當前的程序版本

/ 輸出參數:none

/ 使用說明:none

******************************************************************************/

bool Shell_MCU_Service(void * pcBuff, uint16_t len )

{

uint8_t? ? *ptRxd;? ? ? ? ? //用于接收指令處理

int? ? ? ? ?i;

uint16_t? ? retval;

uint8_t? ? ?buff[32];

//處理指令

//--------------------------------------------------------------------------

ptRxd = (uint8_t *)pcBuff;

if(StrComp(ptRxd,"rd ")) //讀取FLASH信息

{

int wval;

if(1 != sscanf((void *)ptRxd,"%*s%d",&wval) )return false;

if( wval>2 )return false;

if(0==wval) {

FLASH_ioctl(0,buff);

retval = *(uint16_t *)(buff+1) ;

printf("->Flash:\t%dKB\r\n",retval);

return true;

}

else if(1==wval) {

FLASH_ioctl(1,buff);

printf("->MAC:\t ");

for(i=0; iprintf("%02X\r\n",buff[i+1]);

return true;

}

else return false;

}

else if(StrComp(ptRxd,"help\r\n"))? ? ? //指令幫助

{

shell_SendStr((void *)CLI_McuMsg.pcHelpStr);

return true;

}

else return false;

}

/******************************************************************************

***********************************? ?END? ************************************

******************************************************************************/

#endif

5.2 實現步驟

1) 將該文件添加到工程下。

2) 在main.c中用extern 引用McuList,源代碼為:

/*---------------------*

*? ? ?Shell指令鏈表

*----------------------*/

extern Cmd_List_t? McuList;

3)在main.c初始化時添加:

//----------------------------------------------------------

//step1: shell初始化

shell_Init(115200,ledx_cfg);? ? ? ? //初始化shell接口

CLI_AddCmd(&McuList);? ? ?//添加模塊指令到鏈表

4)編譯工程文件。

5)下載到開發板運行即可在終端下看到新支持的CLI指令:

9de552adeef792672e8936db7c780188.png

<1> 大家可根據此模板和方法,添加許多自己的指令和功能

<2> 限于篇幅,Ymodem文件傳輸,IAP升級、RTOS支持等將在下一期為大家講解

c2c9ed493cd281aa86d8a6f5178c4c01.gif [1] [2] 610626052e95c7fbe3d254abc769d9ad.gif

本網站轉載的所有的文章、圖片、音頻視頻文件等資料的版權歸版權所有人所有,本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如果本網所選內容的文章作者及編輯認為其作品不宜公開自由傳播,或不應無償使用,請及時通過電子郵件或電話通知我們,以迅速采取適當措施,避免給雙方造成不必要的經濟損失。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529801.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529801.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529801.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

time_t c語言 2038,什么是2038問題?

什么是2038問題不知道你有沒有聽過2038問題?無論你是否聽過&#xff0c;本文將帶你認識什么是2038問題。Unix時間戳定義為從格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。而在C語言中&#xff0c;常用time_t來表示。舉個例子…

C語言精度控制整形,C語言 湊算式 控制精度問題

想問一下&#xff0c;if語句中為什么寫上*1.0之后&#xff0c;輸出的就是對的個數29&#xff0c;但把*1.0刪掉后&#xff0c;輸出的個數就遠大于29了&#xff1f;還想討教一下各位高手&#xff0c;除了這種暴力求法&#xff0c;還有其他的比較好的方法嗎&#xff1f;非常感謝/*…

c語言 l l next,nexttowardl

在頭文件中定義float nextafterf( float from, float to );(1)(since C99)double nextafter( double from, double to );(2)(since C99)long double nextafterl( long double from, long double to );(3)(since C99)float nexttowardf( float from, long doub…

c 語言 readline,如何用C實現一個readLine()函數-?該函數每次讀入文本文件的一行并打印到屏幕...

如何用C實現一個readLine()函數- 該函數每次讀入文本文件的一行并打印到屏幕(2012-04-13 00:23:41)標簽&#xff1a;打印文本文件如何雜談如何用C實現一個readLine()函數? 該函數每次讀入文本文件的一行并打印到屏幕以前看到過這方面的討論http://bbs.chinaunix.net/viewthrea…

STC單片機C語言中的數據類型,stc單片機c語言程序設計 第9章 stc單片機c語言數據類型.pdf...

STC單片 機C語言變量和數據類型主講&#xff1a;何賓Email &#xff1a;hebinmail.buct.edu.cn2016.03C語言中的常量和變量對于基本數據類型&#xff0c;按其值是否可變又分為常量和變量兩種。在程序執行過程中&#xff0c;其值不發生改變的量稱為常量&#xff0c;其值可變的量…

c4droid語言游戲,c4droid手機編程軟件下載

c4droid可以說是手機端最好的編程軟件&#xff0c;沒有之一&#xff0c;軟件可以幫助大家在手機上進行編寫C代碼,讓各位程序員們隨時隨地都能編程。操縱簡單&#xff0c;功能強大。c4droid軟件介紹c4droid是款Android設備上的C/C程序編譯器&#xff0c;默認以tcc(tiny c compil…

c語言圖像函數怎么用,請教 怎么才能用C輸出一個函數的圖像?大俠 幫幫忙啊...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓發一下我當年的練習程序#include#include#include#includedouble exp(double x){double l,m;unsigned int n;l1; m1; n0;do {n;mx*m/n;llm; }while ((-1.0E-6<m)&&(m<1.0E-6));return l; }main(){int graphmode, gra…

創業沖突的五種解決方法是_不會說話,不懂處理人際沖突怎么辦?《溝通的藝術》5步教會你...

關注“夏娃藍空間”&#xff0c;陪你成長為更好的自己。想要良好地解決沖突&#xff0c;一定要有“這是我們兩個人共同的事”的態度。今年夏天最熱門的電視劇非《三十而已》莫屬了&#xff0c;而撐起了這部劇的流量的廣大觀眾&#xff0c;基本都是集中在逐步靠近中青年階段的90…

android gsensor 坐標,MTK Android G sensor 原理,配置,調試

原理圖&#xff1a;g_sensor的驅動目錄在mediatek/custom/common/kernel/accelerometer下。一、g_sensor 的移植步驟1、在ProjectConfig.mk中配置相關的g_sensor例如 CUSTOM_KERNEL_ACCELEROMETER kxtf92、在mediatek/custom/common/kernel/accelerometer目錄中添加 g_sensor的…

網貸大數據什么時候會好_如果人類把地球鉆穿了,會發生什么?大數據分析告訴你多可怕...

很多科研人員在做實驗的時候&#xff0c;少不了被旁人嘲笑或者蔑視的情況&#xff0c;因為常人往往是無法理解他們的想法的。例如曾經就有科研人員想要對地球進行鉆探&#xff0c;看看能夠在地表上鉆多深&#xff0c;是否能夠將地球給鉆穿了。很多人都會認為這種做法沒有意義而…

android h5 有廣告,那些H5在Android上顯示的喪心病狂的坑

首先得強調一下&#xff0c;H5和移動設備的交互遇到的問題真的是各種喪心病狂&#xff01;&#xff01;但是本主依然還是耐著極大的興致(無奈)的做了下去。H5頁面在Android或者IOS上運行出現問題(這里的運行指的是h5的頁面運行在App里的webview里)&#xff0c;測試人員或者上級…

python非貪婪匹配_Python中關于正則表達式非貪婪以及多行匹配功能詳解

這篇文章主要介紹了Python正則表達式非貪婪、多行匹配功能,結合實例形式分析了Python正則表達式中非貪婪及多行匹配功能的實現方法與相關注意事項,需要的朋友可以參考下本文實例講述了Python正則表達式非貪婪、多行匹配功能。分享給大家供大家參考&#xff0c;具體如下&#xf…

小米9android q測試版,基于Android Q的MIUI來了 小米9嘗鮮

01基于Android Q的MIUI來了中關村在線消息&#xff1a;谷歌在今年五月份發布了最新的Android Q系統&#xff0c;雖然很多國產手機還沒有升級到Android P&#xff0c;但是還是有不少廠家開始對旗下的手機升級到最新的Android Q系統&#xff0c;根據小米最新的官方的消息&#xf…

ios傳值給js_WKWebView JS與OC間相互傳值調用

寫在前面本文將介紹如何使用WKWebView進行JS與OC、OC與JS間的傳值和方法調用。前置條件1、導入WebKit.framework2、聲明WKWebViewJS調用OC原生方法1、前端在js文件中實現這里要注意messageHandlers后面跟著的deviceInfo要與原生的定義的一致。2、iOS 實現WKScriptMessageHandle…

android layerlist bitmap,android?shape類似的?另一個?高端用法:layer-list

android shape類似的 另一個 高端用法&#xff1a;layer-list&#xff1a;簡介&#xff1a;將多個圖片或上面兩種效果按照順序層疊起來” 《?xml version"1.0" encoding"utf-8"?>《layer-listxmlns:android"http://schemas.android.com/apk/res/…

跨域會報40幾_總結一下跨域的幾種情況

在網站開發中&#xff0c;經常會遇到跨域問題&#xff0c;下面總結一下集中常見的跨域問題。1. 不同域名屬于跨域&#xff0c;如&#xff1a;www.a.com 和www.b.com&#xff0c;另外www.a.com 和www.a.com.cn也屬于不同域名。2. 主域名和子域名(二級域名、三級域名等)跨域&…

android將拍攝的圖片存入sd卡中,Android將圖片保存至SD卡上

首先判斷SD卡是否插入-->public String getSDPath(){File SDdirnull;boolean sdCardExistEnvironment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);if(sdCardExist){SDdirEnvironment.getExternalStorageDirectory();}if(SDdir!null){return S…

nedc和epa續航里程什么意思_400公里已成續航新起點,純電動車的實用性到底怎樣...

對于購買純電動汽車的用戶來說&#xff0c;續航里程是非常重要的參考因素&#xff0c;畢竟如果續航里程太短&#xff0c;實用性將會大打折扣&#xff0c;跑個長途都心驚膽戰的&#xff0c;生怕路上遇到堵車了、沒電了、中途沒有加油站之類的。就算是不考慮長途&#xff0c;市區…

android廣播示例,android接受開機廣播事件

【實例簡介】【實例截圖】【核心代碼】package com.yin.servicetest;import com.yin.service.MyService;import android.app.ActivityManager;import android.app.ActivityManager.RunningServiceInfo;import android.content.BroadcastReceiver;import android.content.Contex…

java class類_關于創建java中的class類的對象的方法

1.由于Class類沒有公共構造方法&#xff0c;所有創建Class的對象的方法有以下幾種&#xff1a;①通過Class.forName()靜態方法返回Class類的一個實例Class cls Class.forName("test.dog - 這個網站可出售。 - 最佳的test 來源和相關信息。");②通過類名.class來獲取…