直接使用寄存器地址來進(jìn)行STM32開發(fā)要對(duì)每一個(gè)寄存器的地址通過查找芯片手冊(cè),對(duì)每一個(gè)寄存器的各個(gè)位的含義也要查清楚,然后決定對(duì)那個(gè)地址的哪些位進(jìn)行怎樣的設(shè)置。這種編程效率低,程序的可移植性差,程序的可讀性差。
STM32提供了對(duì)外設(shè)寄存器操作的功能函數(shù),對(duì)寄存器操作只需要調(diào)用相應(yīng)的庫函數(shù)就可以,一般函數(shù)名單詞組合與功能密切相關(guān),增強(qiáng)了程序的可讀性。
1、以CMSIS固件庫項(xiàng)目為基礎(chǔ),在項(xiàng)目文件夾下新增"Lib"文件夾,在"Lib"文件夾下新增"inc"和"src"文件夾,在"inc"文件夾中復(fù)制"stm32f10x_gpio.h"和"stm32f10x_rcc.h"兩個(gè)頭文件,在"src"文件夾中復(fù)制"stm32f10x_gpio.c"和"stm32f10x_rcc.c"兩個(gè)庫函數(shù)程序文件,分別包含RCC和GPIO操作相關(guān)的庫函數(shù)。
2、在“項(xiàng)目條目管理”對(duì)話框中添加"Lib"組,并向組中添加兩個(gè)庫函數(shù)程序文件。
3、修改"Include Paths",添加".Libinc"路徑
4、重寫main.c中的main函數(shù)
① 包含需要的頭文件:"stm32f10x_gpio.h"和"stm32f10x_rcc.h"
② 使能GPIOC時(shí)鐘
在RCC庫函數(shù)中定義了RCC_APB2PeriphClockCmd函數(shù),函數(shù)原型為:
void RCC_APB2PeriphClockCmd ( uint32_t RCC_APB2Periph, FunctionalState NewState )
其中參數(shù)RCC_APB2Periph取值為在"stm32f10x_rcc.h"中預(yù)定義的值,這里對(duì)GPIOC的操作為RCC_APB2Periph_GPIOC,定義如下:
這個(gè)值與前面程序中的表達(dá)式"0x1<<4"得到的值是一致的。
函數(shù)的第二個(gè)參數(shù)NewState取值為FunctionState類型,F(xiàn)unctionState類型是在"stm32f10x_rcc.c"文件中定義的一個(gè)枚舉類型,有DISABLE和ENABLE兩個(gè)取值,定義如下:
現(xiàn)在要使能GPIOC,則調(diào)用函數(shù)如下:
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
③ 配置GPIOC_0為推挽式輸出,50MHz速度。
對(duì)GPIO引腳的配置調(diào)用"stm32f10x_gpio.c"中的庫函數(shù)GPIO_Init實(shí)現(xiàn),函數(shù)原型為:
void GPIO_Init ( GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_InitStruct )
其中第一個(gè)參數(shù)GPIOx的取值在"stm32f10x.h"中定義,這里用GPIOC;第二個(gè)參數(shù)GPIO_InitStruct為GPIO_InitTypeDef指針類型,GPIO_InitTypeDef類型在"stm32f10x_gpio.h"文件中定義:
這個(gè)結(jié)構(gòu)體中的GPIO_Pin為IO口的引腳編號(hào),這里為第一個(gè)LED燈,則取0;
GPIO_Speed為GPIOSpeed_TypeDef類型,GPIOSpeed_TypeDef類型在"stm32f10x_gpio.h"文件中定義:
為枚舉類型,有三個(gè)枚舉值。這里取GPIO_Speed_50MHz;
GPIO_Mode為GPIOMode_TypeDef類型,GPIOMode_TypeDef類型在"stm32f10x_gpio.h"文件中定義:
這些枚舉值分別為:
(1)GPIO_Mode_AIN 模擬輸入
(2)GPIO_Mode_IN_FLOATING 浮空輸入
(3)GPIO_Mode_IPD 下拉輸入
(4)GPIO_Mode_IPU 上拉輸入
(5)GPIO_Mode_Out_OD 開漏輸出
(6)GPIO_Mode_Out_PP 推挽輸出
(7)GPIO_Mode_AF_OD 復(fù)用開漏輸出
(8)GPIO_Mode_AF_PP 復(fù)用推挽輸出
這里選擇GPIO_Mode_Out_PP。
要配置GPIOC_0的工作模式,首先用GPIO_InitTypeDef類型定義一個(gè)變量,然后給這個(gè)結(jié)構(gòu)體變量的成員賦值,最后調(diào)用GPIO_Init函數(shù)完成配置:
GPIO_InitTypeDef GPIOC_0_mode;
GPIOC_0_mode.GPIO_Pin = GPIO_Pin_0;
GPIOC_0_mode.GPIO_Speed = GPIO_Speed_50MHz;
GPIOC_0_mode.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIOC_0_mode);
④ 通過GPIO_ResetBits和GPIO_SetBits函數(shù)來控制LED1的復(fù)位和置位,函數(shù)原型如下:
void GPIO_ResetBits ( GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin ) //復(fù)位函數(shù)
void GPIO_SetBits ( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin ) //置位函數(shù)
函數(shù)的參數(shù)分別為哪個(gè)GPIO口和哪個(gè)引腳。
如果對(duì)GPIOC_0復(fù)位,則:GPIO_ResetBits( GPIOC, GPIO_Pin_0) ;
如果對(duì)GPIOC_0置位,則:GPIO_SetBits( GPIOC, GPIO_Pin_0) ;
最后的main.c程序如下:
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
void delay(int t)
{
int i;
for( ;t>0; t--)
for(i=0;i<1000;i++);
}
int main()
{
GPIO_InitTypeDef GPIOC_0_mode;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE ); //使能GPIOC時(shí)鐘
GPIOC_0_mode.GPIO_Pin = GPIO_Pin_0;
GPIOC_0_mode.GPIO_Speed = GPIO_Speed_50MHz;
GPIOC_0_mode.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIOC_0_mode); //配置GPIOC_0引腳為推挽輸出,50MHz速度
while(1)
{
GPIO_ResetBits( GPIOC, GPIO_Pin_0); //將GPIOC_0復(fù)位
delay(1000);
GPIO_SetBits( GPIOC, GPIO_Pin_0); //將GPIOC_0置位
delay(1000);
}
}
5、連接錯(cuò)誤及其解決方法。
在上述項(xiàng)目中,最后完成項(xiàng)目配置和編程后,編譯連接時(shí)出現(xiàn)如下錯(cuò)誤:
出現(xiàn)這個(gè)錯(cuò)誤是由于STM32外設(shè)庫函數(shù)的開發(fā)中用到了斷言機(jī)制。正常使用庫函數(shù)時(shí),需要包含"stm32f10x_conf.h"頭文件,在該文件中有如下定義
/* Exported macro ------------------------------------------------------------*/
#ifdef USE_FULL_ASSERT
/**
* @brief The assert_param macro is used for function's parameters check.
* @param expr: If expr is false, it calls assert_failed function which reports
* the name of the source file and the source line number of the call
* that failed. If expr is true, it returns no value.
* @retval None
*/
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif /* USE_FULL_ASSERT */
在該頭文件中定義了assert_param宏,根據(jù)項(xiàng)目配置,如果設(shè)置了"USE_FULL_ASSERT"參數(shù),則對(duì)函數(shù)參數(shù)進(jìn)行檢查,檢查不成功轉(zhuǎn)到"assert_failed"函數(shù)處理;如果沒有設(shè)置使用斷言,則相當(dāng)于不對(duì)參數(shù)進(jìn)行檢測(cè)。
解決方法:將這一段宏定義直接復(fù)制到"stm32f10x.h"文件中,因?yàn)樗械耐庠O(shè)庫函數(shù)文件都直接或間接地包含了該頭文件。
6、編譯連接項(xiàng)目,下載程序,開發(fā)板的LED1閃爍。
上一篇:通過位帶地址操作GPIO在數(shù)碼管顯示數(shù)字(STM32_05)
下一篇:使用STM32固件庫操作控制LED燈(CMSIS)(STM32_03)
推薦閱讀
史海拾趣
面對(duì)日益激烈的市場(chǎng)競(jìng)爭和不斷變化的市場(chǎng)需求,F(xiàn)airchild Imaging制定了面向未來的戰(zhàn)略布局。公司將繼續(xù)加大在成像技術(shù)領(lǐng)域的研發(fā)投入,推動(dòng)技術(shù)創(chuàng)新和產(chǎn)品升級(jí)。同時(shí),F(xiàn)airchild Imaging還將積極拓展國際市場(chǎng),加強(qiáng)與全球客戶的合作與交流。此外,公司還將注重人才培養(yǎng)和團(tuán)隊(duì)建設(shè),為公司的長期發(fā)展提供有力保障。
隨著業(yè)務(wù)的迅速增長,Astema意識(shí)到供應(yīng)鏈管理的重要性。公司開始優(yōu)化供應(yīng)鏈管理流程,提高生產(chǎn)效率和產(chǎn)品質(zhì)量。同時(shí),Astema還與供應(yīng)商建立了緊密的合作關(guān)系,確保原材料供應(yīng)的穩(wěn)定性和可靠性。這些舉措使得Astema在激烈的市場(chǎng)競(jìng)爭中保持了穩(wěn)定的運(yùn)營。
隨著全球電子市場(chǎng)的不斷發(fā)展,BCD Semi(Diodes)積極尋求國際化拓展的機(jī)會(huì)。公司通過與國外知名企業(yè)的合作,成功進(jìn)入了多個(gè)海外市場(chǎng)。在國際市場(chǎng)上,BCD Semi憑借其高品質(zhì)的產(chǎn)品和專業(yè)的服務(wù),贏得了客戶的信賴和支持。同時(shí),公司還積極參加國際電子展會(huì)和交流活動(dòng),與全球同行進(jìn)行深入的交流與合作,不斷提升自身的國際影響力。
隨著全球電子市場(chǎng)的不斷發(fā)展,BCD Semi(Diodes)積極尋求國際化拓展的機(jī)會(huì)。公司通過與國外知名企業(yè)的合作,成功進(jìn)入了多個(gè)海外市場(chǎng)。在國際市場(chǎng)上,BCD Semi憑借其高品質(zhì)的產(chǎn)品和專業(yè)的服務(wù),贏得了客戶的信賴和支持。同時(shí),公司還積極參加國際電子展會(huì)和交流活動(dòng),與全球同行進(jìn)行深入的交流與合作,不斷提升自身的國際影響力。
隨著產(chǎn)品線的不斷完善,AITSEMI公司開始積極尋求市場(chǎng)機(jī)會(huì),并逐步在全球范圍內(nèi)建立銷售網(wǎng)絡(luò)。通過與各大消費(fèi)電子品牌的緊密合作,AITSEMI的芯片產(chǎn)品成功應(yīng)用于音頻功放和電源管理等領(lǐng)域,為全球消費(fèi)者提供了更優(yōu)質(zhì)的產(chǎn)品體驗(yàn)。同時(shí),公司還積極拓展醫(yī)療、工業(yè)控制、照明等新興市場(chǎng),為公司的持續(xù)增長提供了強(qiáng)大的動(dòng)力。
技術(shù)創(chuàng)新是AITSEMI公司保持競(jìng)爭力的關(guān)鍵。多年來,公司始終堅(jiān)持將大量資源投入研發(fā)領(lǐng)域,不斷推出具有創(chuàng)新性的產(chǎn)品和技術(shù)。通過自主研發(fā)和與高校、研究機(jī)構(gòu)的合作,AITSEMI在集成電路設(shè)計(jì)、制造工藝等方面取得了多項(xiàng)突破,為公司的持續(xù)發(fā)展提供了源源不斷的動(dòng)力。
在\\WINCE500\\PUBLIC\\COMMON\\OAK\\DRIVERS\\BLUETOOTH\\SAMPLE文件夾里有好多例程,但是在catalog里沒有找到相對(duì)應(yīng)的加載項(xiàng) 請(qǐng)問怎么才能用上它們?… 查看全部問答∨ |
|
我的板子上現(xiàn)在有NOR Flash和NAND Flash兩個(gè)FLASH ,NOR用來燒nk,現(xiàn)在剩下一個(gè)NAND Flash 用來做存儲(chǔ)用..由于既要存儲(chǔ)用戶數(shù)據(jù)(例如用戶自己寫的一個(gè)文件),又要保存系統(tǒng)數(shù)據(jù)(例如注冊(cè)表文件或者是程序的配置或者日志文件),因?yàn)橄到y(tǒng)數(shù)據(jù)不想讓用戶操 ...… 查看全部問答∨ |
ST的器件引腳圖為什么不搞像PIC那樣呢?ST的:http://bbs.eeworld.com.cn/upfiles/img/200712/20071228215253153.gif畫原理圖的時(shí)候很麻煩,都不知道腳在哪里這是Microchip的:http://bbs.eeworld.com.cn/upfiles/img/200712/2007122821546571. ...… 查看全部問答∨ |
2812的采樣值與實(shí)際模擬電壓輸入差零點(diǎn)幾伏,1.1伏的輸入,采樣得到值大概1.2、1.3伏左右。而且同一路輸入重復(fù)采樣值之間也差好多。 請(qǐng)各位指點(diǎn)!謝謝?!? 查看全部問答∨ |
|
我在p2.5外部加了個(gè)100K電阻 然后程序這樣寫 void clockset() // { //1M DCO DCOCTL=0;//DCO0+DCO1; BCSCTL1 |=RSEL2;//+RSEL0//+RSEL1; BCSCTL2 |=DCOR;//外部DCO電阻 } 怎么運(yùn)行到 BCSCTL2 |=DCOR;//外部DCO電阻 就像死機(jī)了 ...… 查看全部問答∨ |
|
特權(quán)同學(xué)的那個(gè)SDRAM程序,有疑問,求高手解答 最近研究特權(quán)同學(xué)的sdram代碼,有個(gè)疑問,請(qǐng)高手解答: 問題是:在讀寫工作狀態(tài)時(shí),如果自動(dòng)刷新時(shí)間到了(15us時(shí)間到),而此時(shí)工作狀態(tài) 非 `W_IDLE,也就是有sdram_ref_req(有自動(dòng)刷新請(qǐng)求),但是到不了 `W_AR(自動(dòng)刷新狀態(tài)); 那豈不是錯(cuò) ...… 查看全部問答∨ |
open1081采用STM32F205的內(nèi)部晶振? 看Core1081,沒有外部晶振接口,只有一個(gè)32K的晶振。 難道Core1081只能使用STM32F205的內(nèi)部晶振?內(nèi)部晶振精度好像不高吧 … 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- ARXML 規(guī)則下 ECU 總線通訊與 ADTF 測(cè)試方案
- 日產(chǎn)在歐洲推出第三代e-POWER技術(shù)
- 福特CEO更看好Waymo激光雷達(dá)方案:比特斯拉純視覺自動(dòng)駕駛路線可靠
- 智元機(jī)器人兩大核心產(chǎn)品啟動(dòng)規(guī)?;a(chǎn)
- 固態(tài)電池2026量產(chǎn)豪賭,真相還是泡沫?
- 100億元!湖北“下注”人形機(jī)器人產(chǎn)業(yè)
- 海外磷酸鐵鋰電池產(chǎn)能從0到1
- 基于多傳感器數(shù)據(jù)的自動(dòng)駕駛仿真確定性驗(yàn)證
- 國芯科技發(fā)布全球首款48V安全氣囊芯片,引領(lǐng)智能汽車新紀(jì)元
- 亞馬遜全球部署100萬臺(tái)機(jī)器人
- 英特爾FPGA可編程加速平臺(tái)介紹,走近AI、數(shù)據(jù)中心、基因工程等大咖工程
- “搜器件”小程序又添新功能!
- 直播|基于英特爾® Agilex™ FPGA F-Tile的以太網(wǎng)硬核IP詳解及如何使用oneAPI對(duì)FPGA編程
- 報(bào)名抽取京東卡|2021慕尼黑華南電子展觀眾注冊(cè)進(jìn)行中
- 下載有禮|終于找到秘籍,示波器探頭的選擇和使用就靠它了!
- 愛“拼”才會(huì)贏 英飛凌柵極驅(qū)動(dòng)IC拼圖闖關(guān) 活動(dòng)開始啦!
- Littelfuse 新品賦能電子產(chǎn)品安全可靠并高效, 10+挑戰(zhàn)等你探索!
- 速度與激情,為你私人訂制。R&S攜多功能基礎(chǔ)示波器帶你身臨其境!
- 樂享愜意春天,TI A8開源硬件平臺(tái)體驗(yàn)季!
- 外媒:中美貿(mào)易戰(zhàn)休兵 未必能給經(jīng)濟(jì)前景帶來光明
- 劉揚(yáng)偉上任!鴻海啟動(dòng)了轉(zhuǎn)型半導(dǎo)體新的時(shí)代?
- 外媒:中美重新回到協(xié)商桌,仍有漫長談判路
- 粵芯:首批樣出貨,良率達(dá)到預(yù)期目標(biāo)
- 白宮:和國家安全相關(guān)的產(chǎn)品仍對(duì)華為出口管制
- FTC對(duì)臉書隱私調(diào)查進(jìn)入了最終階段
- WWDC 2019:蘋果AR眼鏡將徹底改變游戲規(guī)則
- vivo新機(jī):后置雙攝+64GB閃存
- 政府干預(yù),致荷蘭電信KPN表示不會(huì)使用華為5G設(shè)備
- 讓華為參與5G建設(shè),解密誰贊成?誰反對(duì)?