直接使用寄存器地址來進行STM32開發(fā)要對每一個寄存器的地址通過查找芯片手冊,對每一個寄存器的各個位的含義也要查清楚,然后決定對那個地址的哪些位進行怎樣的設置。這種編程效率低,程序的可移植性差,程序的可讀性差。
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",添加".\Lib\inc"路徑
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外設庫函數的開發(fā)中用到了斷言機制。正常使用庫函數時,需要包含"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、編譯連接項目,下載程序,開發(fā)板的LED1閃爍。
上一篇:STM32串口通信之超級終端控制LED燈
下一篇:STM32F407Z 模擬串口(115200波特率)
推薦閱讀
史海拾趣
在電子行業(yè)中,產品質量是企業(yè)生存和發(fā)展的關鍵。DDK公司深知這一點,因此始終將產品質量放在首位。公司建立了嚴格的質量管理體系,從原材料采購到產品生產、檢測的每一個環(huán)節(jié)都嚴格把控,確保每一件產品都符合高標準、嚴要求。這種對品質的執(zhí)著追求,讓DDK公司的產品在市場上贏得了良好的聲譽,贏得了消費者的信任和忠誠。
為了進一步擴大市場份額和拓展應用領域,Atmel(Microchip)積極與其他企業(yè)開展合作。公司與多家知名企業(yè)建立了戰(zhàn)略合作關系,共同推動微控制器及相關技術在各個領域的應用。通過與合作伙伴的緊密合作,Atmel的產品已經廣泛應用于工業(yè)、消費、安全、通信、計算和汽車等多個領域,為這些領域的發(fā)展提供了強有力的支持。
這五個故事旨在展現Atmel(Microchip)在電子行業(yè)中的發(fā)展歷程和成就,涵蓋了從創(chuàng)業(yè)初期到被收購后的不同階段。通過這些故事,我們可以看到Atmel(Microchip)如何憑借技術創(chuàng)新、市場拓展和合作發(fā)展,逐漸成為了微控制器領域的領軍企業(yè)。
為了進一步擴大市場份額和拓展應用領域,Atmel(Microchip)積極與其他企業(yè)開展合作。公司與多家知名企業(yè)建立了戰(zhàn)略合作關系,共同推動微控制器及相關技術在各個領域的應用。通過與合作伙伴的緊密合作,Atmel的產品已經廣泛應用于工業(yè)、消費、安全、通信、計算和汽車等多個領域,為這些領域的發(fā)展提供了強有力的支持。
這五個故事旨在展現Atmel(Microchip)在電子行業(yè)中的發(fā)展歷程和成就,涵蓋了從創(chuàng)業(yè)初期到被收購后的不同階段。通過這些故事,我們可以看到Atmel(Microchip)如何憑借技術創(chuàng)新、市場拓展和合作發(fā)展,逐漸成為了微控制器領域的領軍企業(yè)。
隨著電子行業(yè)的快速發(fā)展,Aborn Electronics意識到只有不斷創(chuàng)新才能在競爭中保持領先。公司加大了對研發(fā)的投入,引進了一批高素質的研發(fā)人才,并在多個技術領域取得了重要突破。其中,一項關于高效能電源管理技術的創(chuàng)新成果,不僅提高了產品的能效比,還為公司帶來了可觀的經濟效益。這一技術的成功應用,進一步提升了Aborn Electronics在行業(yè)內的影響力。
隨著公司規(guī)模的擴大和業(yè)績的增長,安國國際的產品線逐漸從計算機外設產品拓展至消費型電子產品和手持便攜裝置。為滿足市場需求,公司不斷推出創(chuàng)新產品,如輸出入裝置暨多媒體圖像處理裝置應用控制芯片、網橋控制芯片、網絡安全保護裝置等。同時,為提升運營效率和靈活性,安國在2015年進行了組織調整和專業(yè)分工,將不同業(yè)務線分割為多家子公司,使得各業(yè)務領域能夠更加專注和高效地發(fā)展。
在EasySys中,在內核用了一個MessageBox,系統(tǒng)藍屏了,哦也.. 在內核模式可以調用win32api嗎?為什么可以/不可以? 另外,有沒有關于內核函數的查閱文檔?最好是chinese..謝謝… 查看全部問答∨ |
|
改進的緩沖區(qū)管理模塊的作用在于加強VxWorks實時操作系統(tǒng)對內存的管理,并為上層應用程序提供所需內存申請和釋放工作。因此改進模塊位于VxWorks實時操作系統(tǒng)模塊和應用程序模塊之間。 CPU實際物理內存在bootRoom啟動 ...… 查看全部問答∨ |
我要用GDI中的PolyPolygon來填充一個區(qū)域 ,這個區(qū)域大小不定,如果這個區(qū)域不是很大的時候,還算正常,但是這個區(qū)域大了,填充時會很慢,這是為什么,大家有沒有好的解決辦法呢… 查看全部問答∨ |
最近有點閑,想找點事樂呵樂呵,做一個智能小車吧! 目標是:開始的時候實現通過上位機軟件遙控小車運動,等以后買了傳感器實現自適應蔽障或追蹤活動目標 可是小馬達驅動部分沒有專門的驅動芯片,BUT,我這里有很多75NF75和2907之類的MOS管(大家 ...… 查看全部問答∨ |
|
本帖最后由 paulhyde 于 2014-9-15 08:55 編輯 官網介紹:http://www.mornship.com/MSUODS/MSUODSInfo.htm曉舟通用在線調試系統(tǒng)(MSUODS)簡介 曉舟通用在線調試系統(tǒng)(MornShip Universal Online Debug System,簡稱MSUODS)是曉舟工作室 ...… 查看全部問答∨ |
|
目前A7153已經量產,已經COST down, 量產低于10元的ZIGBEE芯片; 除了A7153,低于10RMB其他芯片還有嗎? [ 本帖最后由 lmq329778570 于 2012-5-31 16:16 編輯 ]… 查看全部問答∨ |