直接使用寄存器地址來進行STM32開發要對每一個寄存器的地址通過查找芯片手冊,對每一個寄存器的各個位的含義也要查清楚,然后決定對那個地址的哪些位進行怎樣的設置。這種編程效率低,程序的可移植性差,程序的可讀性差。
STM32提供了對外設寄存器操作的功能函數,對寄存器操作只需要調用相應的庫函數就可以,一般函數名單詞組合與功能密切相關,增強了程序的可讀性。
1、以CMSIS固件庫項目為基礎,在項目文件夾下新增"Lib"文件夾,在"Lib"文件夾下新增"inc"和"src"文件夾,在"inc"文件夾中復制"stm32f10x_gpio.h"和"stm32f10x_rcc.h"兩個頭文件,在"src"文件夾中復制"stm32f10x_gpio.c"和"stm32f10x_rcc.c"兩個庫函數程序文件,分別包含RCC和GPIO操作相關的庫函數。
2、在“項目條目管理”對話框中添加"Lib"組,并向組中添加兩個庫函數程序文件。
3、修改"Include Paths",添加".Libinc"路徑
4、重寫main.c中的main函數
① 包含需要的頭文件:"stm32f10x_gpio.h"和"stm32f10x_rcc.h"
② 使能GPIOC時鐘
在RCC庫函數中定義了RCC_APB2PeriphClockCmd函數,函數原型為:
void RCC_APB2PeriphClockCmd ( uint32_t RCC_APB2Periph, FunctionalState NewState )
其中參數RCC_APB2Periph取值為在"stm32f10x_rcc.h"中預定義的值,這里對GPIOC的操作為RCC_APB2Periph_GPIOC,定義如下:
這個值與前面程序中的表達式"0x1<<4"得到的值是一致的。
函數的第二個參數NewState取值為FunctionState類型,FunctionState類型是在"stm32f10x_rcc.c"文件中定義的一個枚舉類型,有DISABLE和ENABLE兩個取值,定義如下:
現在要使能GPIOC,則調用函數如下:
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
③ 配置GPIOC_0為推挽式輸出,50MHz速度。
對GPIO引腳的配置調用"stm32f10x_gpio.c"中的庫函數GPIO_Init實現,函數原型為:
void GPIO_Init ( GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_InitStruct )
其中第一個參數GPIOx的取值在"stm32f10x.h"中定義,這里用GPIOC;第二個參數GPIO_InitStruct為GPIO_InitTypeDef指針類型,GPIO_InitTypeDef類型在"stm32f10x_gpio.h"文件中定義:
這個結構體中的GPIO_Pin為IO口的引腳編號,這里為第一個LED燈,則取0;
GPIO_Speed為GPIOSpeed_TypeDef類型,GPIOSpeed_TypeDef類型在"stm32f10x_gpio.h"文件中定義:
為枚舉類型,有三個枚舉值。這里取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 復用開漏輸出
(8)GPIO_Mode_AF_PP 復用推挽輸出
這里選擇GPIO_Mode_Out_PP。
要配置GPIOC_0的工作模式,首先用GPIO_InitTypeDef類型定義一個變量,然后給這個結構體變量的成員賦值,最后調用GPIO_Init函數完成配置:
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函數來控制LED1的復位和置位,函數原型如下:
void GPIO_ResetBits ( GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin ) //復位函數
void GPIO_SetBits ( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin ) //置位函數
函數的參數分別為哪個GPIO口和哪個引腳。
如果對GPIOC_0復位,則:GPIO_ResetBits( GPIOC, GPIO_Pin_0) ;
如果對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時鐘
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復位
delay(1000);
GPIO_SetBits( GPIOC, GPIO_Pin_0); //將GPIOC_0置位
delay(1000);
}
}
5、連接錯誤及其解決方法。
在上述項目中,最后完成項目配置和編程后,編譯連接時出現如下錯誤:
出現這個錯誤是由于STM32外設庫函數的開發中用到了斷言機制。正常使用庫函數時,需要包含"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宏,根據項目配置,如果設置了"USE_FULL_ASSERT"參數,則對函數參數進行檢查,檢查不成功轉到"assert_failed"函數處理;如果沒有設置使用斷言,則相當于不對參數進行檢測。
解決方法:將這一段宏定義直接復制到"stm32f10x.h"文件中,因為所有的外設庫函數文件都直接或間接地包含了該頭文件。
6、編譯連接項目,下載程序,開發板的LED1閃爍。
上一篇:通過位帶地址操作GPIO在數碼管顯示數字(STM32_05)
下一篇:使用STM32固件庫操作控制LED燈(CMSIS)(STM32_03)
推薦閱讀
史海拾趣
面對日益激烈的市場競爭和不斷變化的市場需求,Fairchild Imaging制定了面向未來的戰略布局。公司將繼續加大在成像技術領域的研發投入,推動技術創新和產品升級。同時,Fairchild Imaging還將積極拓展國際市場,加強與全球客戶的合作與交流。此外,公司還將注重人才培養和團隊建設,為公司的長期發展提供有力保障。
隨著業務的迅速增長,Astema意識到供應鏈管理的重要性。公司開始優化供應鏈管理流程,提高生產效率和產品質量。同時,Astema還與供應商建立了緊密的合作關系,確保原材料供應的穩定性和可靠性。這些舉措使得Astema在激烈的市場競爭中保持了穩定的運營。
隨著全球電子市場的不斷發展,BCD Semi(Diodes)積極尋求國際化拓展的機會。公司通過與國外知名企業的合作,成功進入了多個海外市場。在國際市場上,BCD Semi憑借其高品質的產品和專業的服務,贏得了客戶的信賴和支持。同時,公司還積極參加國際電子展會和交流活動,與全球同行進行深入的交流與合作,不斷提升自身的國際影響力。
隨著全球電子市場的不斷發展,BCD Semi(Diodes)積極尋求國際化拓展的機會。公司通過與國外知名企業的合作,成功進入了多個海外市場。在國際市場上,BCD Semi憑借其高品質的產品和專業的服務,贏得了客戶的信賴和支持。同時,公司還積極參加國際電子展會和交流活動,與全球同行進行深入的交流與合作,不斷提升自身的國際影響力。
隨著產品線的不斷完善,AITSEMI公司開始積極尋求市場機會,并逐步在全球范圍內建立銷售網絡。通過與各大消費電子品牌的緊密合作,AITSEMI的芯片產品成功應用于音頻功放和電源管理等領域,為全球消費者提供了更優質的產品體驗。同時,公司還積極拓展醫療、工業控制、照明等新興市場,為公司的持續增長提供了強大的動力。
技術創新是AITSEMI公司保持競爭力的關鍵。多年來,公司始終堅持將大量資源投入研發領域,不斷推出具有創新性的產品和技術。通過自主研發和與高校、研究機構的合作,AITSEMI在集成電路設計、制造工藝等方面取得了多項突破,為公司的持續發展提供了源源不斷的動力。
在\\WINCE500\\PUBLIC\\COMMON\\OAK\\DRIVERS\\BLUETOOTH\\SAMPLE文件夾里有好多例程,但是在catalog里沒有找到相對應的加載項 請問怎么才能用上它們?… 查看全部問答∨ |
|
我的板子上現在有NOR Flash和NAND Flash兩個FLASH ,NOR用來燒nk,現在剩下一個NAND Flash 用來做存儲用..由于既要存儲用戶數據(例如用戶自己寫的一個文件),又要保存系統數據(例如注冊表文件或者是程序的配置或者日志文件),因為系統數據不想讓用戶操 ...… 查看全部問答∨ |
ST的器件引腳圖為什么不搞像PIC那樣呢?ST的:http://bbs.eeworld.com.cn/upfiles/img/200712/20071228215253153.gif畫原理圖的時候很麻煩,都不知道腳在哪里這是Microchip的:http://bbs.eeworld.com.cn/upfiles/img/200712/2007122821546571. ...… 查看全部問答∨ |
2812的采樣值與實際模擬電壓輸入差零點幾伏,1.1伏的輸入,采樣得到值大概1.2、1.3伏左右。而且同一路輸入重復采樣值之間也差好多。 請各位指點!謝謝。… 查看全部問答∨ |
|
我在p2.5外部加了個100K電阻 然后程序這樣寫 void clockset() // { //1M DCO DCOCTL=0;//DCO0+DCO1; BCSCTL1 |=RSEL2;//+RSEL0//+RSEL1; BCSCTL2 |=DCOR;//外部DCO電阻 } 怎么運行到 BCSCTL2 |=DCOR;//外部DCO電阻 就像死機了 ...… 查看全部問答∨ |
|
最近研究特權同學的sdram代碼,有個疑問,請高手解答: 問題是:在讀寫工作狀態時,如果自動刷新時間到了(15us時間到),而此時工作狀態 非 `W_IDLE,也就是有sdram_ref_req(有自動刷新請求),但是到不了 `W_AR(自動刷新狀態); 那豈不是錯 ...… 查看全部問答∨ |
看Core1081,沒有外部晶振接口,只有一個32K的晶振。 難道Core1081只能使用STM32F205的內部晶振?內部晶振精度好像不高吧 … 查看全部問答∨ |