1. 編程規(guī)范
對(duì)于新手來(lái)講,編程規(guī)范以及代碼架構(gòu)也非常重要,有一個(gè)良好的編程規(guī)范和代碼架構(gòu),可以提高開(kāi)發(fā)效率,方便問(wèn)題排查以及后續(xù)的程序維護(hù)。這里介紹的編程規(guī)范很簡(jiǎn)單,要求不嚴(yán)格。主要有以下幾點(diǎn)
- ? 變量定義 變量定義時(shí)最好是能夠體現(xiàn)該變量所屬的外設(shè)模塊,該變量是否為全局變量,靜態(tài)變量或者指針變量。變量首字母小寫,后面的單詞首字母大寫。舉例如下
// 以ADC模塊為例,需要定義一個(gè)存儲(chǔ)AD值的變量,舉例說(shuō)明變量命名方式
// 局部變量
u32 adValue = 0;
// 全局變量
u32 gAdcAdValue = 0; // 加一個(gè)g表示是全局變量
// 全局靜態(tài)變量
static u32 gsAdcAdValue = 0; // 加一個(gè)s表示靜態(tài)變量
// 指針變量
u32 *gpAdcAdValue = (u32*)0x2000800; // 加一個(gè)p表示為指針變量
- ? 注釋 函數(shù)注釋舉例如下
/*
*==============================================================================
*函數(shù)名稱:
*函數(shù)功能:
*輸入參數(shù):
*返回值:無(wú)
*==============================================================================
*/
對(duì)于程序語(yǔ)句注釋,如果過(guò)長(zhǎng)可以在程序上方加注釋,如果不是很長(zhǎng)可以在程序語(yǔ)句后面空三格輸入注釋。
- ? 函數(shù)命名 函數(shù)命名要體現(xiàn)函數(shù)所屬的層級(jí)以及函數(shù)的功能,關(guān)于層級(jí)會(huì)在代碼架構(gòu)的部分詳細(xì)說(shuō)明,這里只說(shuō)一下函數(shù)命名方式。
// 這里以ADC模塊的讀取AD值函數(shù)為例,說(shuō)明函數(shù)命名方式
void Med_Adc_ReadAdValue (void)
{
// 函數(shù)內(nèi)容
}
這里med指示該函數(shù)位于功能層,屬于ADC模塊,作用是讀取AD值。
- ? if,while等語(yǔ)句的使用 使用if或者while等語(yǔ)句時(shí),需要在括號(hào)前面加一個(gè)空格,如下
if (gAdcAdValue == 0)
{
// 程序語(yǔ)句
}
- ? 四則運(yùn)算 四則運(yùn)算符號(hào)前后需要加空格,包括等于號(hào)等符號(hào)。如下
c = a * b;
2. 程序架構(gòu)
該程序架構(gòu)是本人在工作期間學(xué)習(xí)的,個(gè)人感覺(jué)還是有助于提高開(kāi)發(fā)效率,方便后續(xù)維護(hù)的。主要思想是將一個(gè)模塊的程序分成三部分,每一部分是一個(gè)新建的文件夾,下面都是其他模塊相同層級(jí)的文件。
? Drv 驅(qū)動(dòng)層 該層主要是寫一些模塊的初始化程序,例如GPIO的初始化,ADC的初始化等。
? Med 功能層 該層主要是完成一些功能性的操作,比如讀取AD值,點(diǎn)亮LED等。Med層的函數(shù)可以包含Drv層的函數(shù)。
? App 業(yè)務(wù)層 該層主要是完成一些業(yè)務(wù),比如在點(diǎn)亮LED的基礎(chǔ)上實(shí)現(xiàn)流水燈,比如顯示電壓值等。
四、STM32F103ZET6簡(jiǎn)介
STM32F103ZET6是由意法半導(dǎo)體(ST)生產(chǎn)的一款單片機(jī),32指32位。STM32也可以成為32位微處理器。STM32F103ZET6的主時(shí)鐘頻率為72MHz,512KB的FLASH,64KB的SRAM。常用到的有GPIO,中斷,ADC,TMR,UART,DMA等。
五、程序模板
在使用Keil5編程時(shí),針對(duì)一個(gè)外設(shè)需要新建對(duì)應(yīng)的.c和.h文件。這里以LED模塊為例,簡(jiǎn)單介紹一下本人的常用模板
.c文件
#include "LED.h" // LED頭文件
需要注意的是一定要空出來(lái)一格,否則編譯會(huì)報(bào)警告。
文件最后未空一行的警告
.h文件
#ifndef _LED_H
#define _LED_H
#include "sys.h" // STM32庫(kù)文件
#endif
.h文件最后也要空出一行,否則也會(huì)有警告。
新建完之后需要將這兩個(gè)文件添加到工程中。
對(duì)于.c文件,右鍵工程文件夾,選擇“Manage Project Items”打開(kāi)。
點(diǎn)擊“Add Files”將新建的.c文件加入到對(duì)應(yīng)的文件夾下。
添加.c文件
對(duì)于.h文件,點(diǎn)擊魔術(shù)棒,選擇“C/C++”,點(diǎn)擊三個(gè)小點(diǎn)選擇對(duì)應(yīng)文件夾即可。
添加.h文件
六、ST-Link調(diào)試
在開(kāi)發(fā)過(guò)程中學(xué)會(huì)使用Debug調(diào)試,能夠幫助我們更快地定位問(wèn)題。這里簡(jiǎn)單介紹一下利用ST-Link和普中核心板Debug調(diào)試方法。
6.1 硬件連接
首先將ST-Link與核心板連接起來(lái),ST-Link的引腳如下
ST-Link引腳
核心板上并沒(méi)有給ST-Link預(yù)留單獨(dú)的接口,而是跟JTAG一起。
其原理圖和硬件圖如下
JTAG原理圖
JTAG硬件圖
由原理圖可知,ST-Link的“SWCLK”連接核心板的“JTCK”,“SWDIO”連接核心板的“JTMS”,“RST”接“RESET”。
VCC不要接,接好ST-Link后再單獨(dú)給核心板供電。
6.2 Keil配置
硬件連接好后開(kāi)始配置Keil5,關(guān)于ST-Link驅(qū)動(dòng)的安裝這里就不再做介紹了。
? 首先確定ST-Link驅(qū)動(dòng)是否正常
確認(rèn)ST-Link驅(qū)動(dòng)是否安裝正常? 配置Debug 點(diǎn)擊魔術(shù)棒,選擇Debug,下圖處選擇“ST-Link Debugger”。
Debug配置
然后再點(diǎn)擊“Settings”,在“SWIO”右側(cè)不顯示“no target connected”就說(shuō)明ST-Link連接正常。點(diǎn)擊“Flash Download”
Flash Download
按照?qǐng)D示配置,“Programming Algorithm”只要選擇符合芯片型號(hào)的即可,需要注意的是,只能保留一個(gè)。
Flash Download配置
按照下圖配置“Utilities”。
配置Utilities
至此,Keil5關(guān)于ST-Link的內(nèi)容配置完成,如果小伙伴遇到其他問(wèn)題,可以多去看一些大佬們的博客。6.3 下載調(diào)試
配置完上面的內(nèi)容后就可以使用ST-Link進(jìn)行下載調(diào)試了。下載的話比較簡(jiǎn)單,編譯完成后直接點(diǎn)擊下圖標(biāo)注的圖標(biāo),等到下載完成即可。
下載程序
調(diào)試時(shí)點(diǎn)擊下圖所示按鈕,進(jìn)入Debug調(diào)試。
調(diào)試按鈕
下面簡(jiǎn)單介紹一下調(diào)試窗口中各個(gè)按鈕的作用,其他更加詳細(xì)的介紹需要小伙伴自行搜索,這里參考了這篇大佬的文章KEIL5中Debug調(diào)試。
調(diào)試窗口按鈕含義
第一部分從左到右
- ? 復(fù)位
- ? 全速運(yùn)行
- ? 停止
- ? 每點(diǎn)一次運(yùn)行一行,遇到函數(shù)體會(huì)進(jìn)入
- ? 每點(diǎn)一次運(yùn)行一行,遇到函數(shù)體不進(jìn)入,直接執(zhí)行完到下一行
- ? 快速執(zhí)行當(dāng)前函數(shù)剩余語(yǔ)句,然后跳出該函數(shù)體,準(zhǔn)備執(zhí)行下一條
- ? 直接運(yùn)行到光標(biāo)處
第二部分從左到右
- ? 設(shè)置當(dāng)前光標(biāo)處為斷點(diǎn)
- ? 失能當(dāng)前光標(biāo)處斷點(diǎn)
- ? 失能全部斷點(diǎn)
- ? 刪除全部斷點(diǎn)
打斷點(diǎn)的方法比較簡(jiǎn)單,直接在想要打斷點(diǎn)的一行左側(cè)點(diǎn)擊一下,出現(xiàn)一個(gè)紅點(diǎn)就表示已經(jīng)添加了斷點(diǎn)。斷點(diǎn)的作用是能夠讓程序運(yùn)行到斷點(diǎn)處停止,有助于我們分析函數(shù)運(yùn)行方式以及變量的變化。
斷點(diǎn)示意圖
調(diào)試時(shí)可以查看某一個(gè)變量的值。選中想要查看的變量,右鍵
查看變量值
此時(shí)就會(huì)出現(xiàn)一個(gè)窗口,能夠查看該變量的值。
查看變量值
-
微處理器
+關(guān)注
關(guān)注
11文章
2274瀏覽量
82773 -
GPIO
+關(guān)注
關(guān)注
16文章
1216瀏覽量
52377 -
LED模塊
+關(guān)注
關(guān)注
0文章
27瀏覽量
13139 -
ADC模塊
+關(guān)注
關(guān)注
1文章
19瀏覽量
11110 -
STM32F103ZET6
+關(guān)注
關(guān)注
9文章
67瀏覽量
21201
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
速成Cadence Allegro的方法概述
STM32電源監(jiān)控器概述原因
筆記本電腦選購(gòu)與使用常識(shí)(高手速成)
筆記本屏幕測(cè)試速成篇
STM32各模塊學(xué)習(xí)筆記
MCU學(xué)習(xí)筆記_STM32低功耗模式概述
![MCU學(xué)習(xí)<b class='flag-5'>筆記</b>_<b class='flag-5'>STM32</b>低功耗模式<b class='flag-5'>概述</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32學(xué)習(xí)筆記(1)——LED和蜂鳴器
![<b class='flag-5'>STM32</b>學(xué)習(xí)<b class='flag-5'>筆記</b>(<b class='flag-5'>1</b>)——LED和蜂鳴器](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32】?jī)奢喿云胶庑≤噷W(xué)習(xí)筆記1
![【<b class='flag-5'>STM32</b>】?jī)奢喿云胶庑≤噷W(xué)習(xí)<b class='flag-5'>筆記</b><b class='flag-5'>1</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
(STM32筆記)一、STM32特點(diǎn)
![(<b class='flag-5'>STM32</b><b class='flag-5'>筆記</b>)一、<b class='flag-5'>STM32</b>特點(diǎn)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32學(xué)習(xí)筆記1
![<b class='flag-5'>stm32</b>學(xué)習(xí)<b class='flag-5'>筆記</b><b class='flag-5'>1</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
AN5597_STM32WB3或5xxx和STM32WB1xxx應(yīng)用筆記
![AN5597_<b class='flag-5'>STM32</b>WB3或5xxx和<b class='flag-5'>STM32WB1</b>xxx應(yīng)用<b class='flag-5'>筆記</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32速成筆記(6)—定時(shí)器
![<b class='flag-5'>STM32</b><b class='flag-5'>速成</b><b class='flag-5'>筆記</b>(6)—定時(shí)器](https://file1.elecfans.com/web2/M00/AB/AA/wKgZomU3IEWAQmL9AAD5F3kHKNY669.jpg)
評(píng)論