直接使用寄存器地址來進行STM32開發要對每一個寄存器的地址通過查找芯片手冊,對每一個寄存器的各個位的含義也要查清楚,然后決定對那個地址的哪些位進行怎樣的設置。這種編程效率低,程序的可移植性差,程序的可讀性差。
一、CMSIS
基于cortex系列的處理器內核都是一樣的,區別在于除內核以外的外設的差異,由于這些差異,導致不同處理器移植起來比較麻煩,所以ARM與芯片廠商建立了CMSIS標準。ARM Cortex? 微控制器軟件接口標準(CMSIS:Cortex Microcontroller SoftwareInterface Standard) 。 是 Cortex-M 處理器系列的與供應商無關的硬件抽象層,使用CMSIS,可以為處理器和外設實現一致且簡單的軟件接口,從而簡化軟件的重用、縮短微控制器新開發人員的學習過程,并縮短新設備的上市時間。通過在所有Cortex-M芯片供應商產品中標準化軟件接口,這一成本會明顯降低,尤其是在創建新項目或將現有軟件遷移到新設備時。
CMSIS架構
1、CMSIS軟件層次
CMSIS可以分為多個軟件層次,分別由ARM公司、芯片供應商提供。
其中ARM提供了下列部分,可用于多種編譯器:
● 內核設備訪問層:包含了用來訪問內核的寄存器設備的名稱定義,地址定義和助手函數。同時也為RTOS(實時操作系統)定義了獨立于微控制器的接口,該接口包括調試通道定義。
● 中間設備訪問層:為軟件提供了訪問外設的通用方法。芯片供應商應當修改中間設備訪問層,以適應中間設備組件用到的微控制器上的外設。
芯片供應商擴展下列軟件層:
● 微控制器外設訪問層:提供片上所有外設的定義。
● 外設的訪問函數(可選):為外設提供額外的助手函數。
CMSIS為Cortex-Mx微控制器系統定義了:
● 訪問外設寄存器的通用方法和定義異常向量的通用方法。
● 內核設備的寄存器名稱和內核異常向量的名稱。
● 獨立于微控制器的RTOS接口,帶調試通道。
● 中間設備組件接口(TCP/IP協議棧,閃存文件系統)。
2、CMSIS包含的組件
① 外圍寄存器和中斷定義: 適用于設備寄存器和中斷的一致接口
② 內核外設函數:特定處理器功能和內核外設的訪問函數
③ DSP 庫:優化的信號處理算法,并為 SIMD 指令提供Cortex-M4 支持
④ 系統視圖說明(SVD):描述設備外設和中斷的XML文件。
該標準完全可擴展,可確保其適合于所有 Cortex-M處理器系列微控制器,從最小的8 KB 設備到具有復雜通信外設(如以太網或USB)的設備。(內核外設函數的內存要求少于1 KB 代碼,少于10 字節RAM)。
二、基于CMSIS應用程序的基本結構
1、CMSIS-外設訪問層的文件
① 獨立于編譯器的文件:
● Cortex-M3內核及其設備文件(core_cm3.h + core_cm3.c)
─ 訪問Cortex-M3內核及其設備:NVIC,SysTick等
─ 訪問Cortex-M3的CPU寄存器和內核外設的函數
● 微控制器專用頭文件(device.h)
對STM32F10x的頭文件為"stm32f10x.h"
─ 指定中斷號碼(與啟動文件一致)
─ 外設寄存器定義(寄存器的基地址和布局)
─ 控制微控制器其他特有的功能的函數(可選)
● 微控制器專用系統文件(system_device.c)
對STM32F10x的程序文件為"system_stm32f10x.c",頭文件為"system_stm32f10x.h"
─ 函數SystemInit,用來初始化微控制器
─ 函數Sysem_ExtMemCtl,用來配置外部存儲器控制器。它位于文件startup_stm32f10x_xx.s /.c,在跳轉到main前調用
─SystemFrequncy,該值代表系統時鐘頻率
─ 微控制器的其他功能(可選)
② 編譯器供應商+微控制器專用啟動文件
● 編譯器啟動代碼(匯編或者C)(startup_device.s)
對STM32F10x的頭文件為"startup_stm32f10x_XX.s",對STM32F103ZET6使用"startup_stm32f10x_hd.s
─ 微控制器專用的中斷處理程序列表(與頭文件一致)
─ 弱定義(Weak)的中斷處理程序默認函數(可以被用戶代碼覆蓋)
2、庫文件簡介
① core_cm3.c文件
在CoreSupport文件夾中有core_cm3.c和頭文件core_cm3.h,它的作用是采用Cortex-M3內核設計的SoC芯片廠商設計的芯片提供了一個進入CM3內核的接口。core_cm3.c中還有一些與編譯器(MDK、IAR等)有關的代碼。較重要的是core_cm3.c中包含stdio.h頭文件,這是一個ANSI C文件,主要作用是提供一些新類型的定義。
② system_stm32f10x.c文件
DeviceSupport文件夾下是啟動文件、外設寄存器定義、中斷向量定義層的一些文件,這些文件由ST公司提供。system_stm32f10x.c的主要作用是設置系統時鐘和總線時鐘。
③ stm32f10x.h文件
這個文件非常重要,是非常底層的文件,包含了寄存器地址和結構體類型的定義,在使用到stm32固件庫的地方都要包含它。
④ stm32f10x_it.c和stm32f10x_conf.h文件
stm32f10x_it.c這個文件主要是編寫中斷程序的,stm32f10x_conf.h被包含在stm32f10x.h文件中主要是配置外設的頭文件,我們需要什么在這里打開。
⑤ startup_stm32f10x_hd.s文件
在這個文件中有一段啟動文件,啟動文件中先初始化系統時鐘,然后才執行主函數,因此我們要注意配置時鐘在這個文件里配置。
三、創建項目,加入必要文件和配置相關參數
1、在項目文件夾下新建一個"pCMSIS"文件夾,然后在該文件夾中創建"CMSIS"、"Device"、"Startup"和"User"四個文件夾,創建不同的文件夾主要是為了分類存放不同作用的文件,便于文件管理,當項目比較復雜時方便文件管理,不分文件夾也是可以的。在"CMSIS"文件夾中復制"core_cm3.c"和"core_cm3.h"文件;在"Device"文件夾復制"stm32f10x.h"、"system_stm32f10x.c"和"system_stm32f10x.h"文件;在"Startup"文件夾下復制"startup_stm32f10x_hd.s。
2、在Keil5中新建項目pCMSIS,存放在"pCMSIS"文件夾中,點擊按鈕或者通過菜單"Project"->"Manage"->"Components,Environment,Books…"打開進行"Manage Project Items"對話框,對項目文件管理。
在"Groups"中分別添加"CMSIS"、"Device"、"Startup"和"User"四個組,并為每一個組添加上述1中敘述的文件。
3、新建一個文件并保存為"main.c"(保存在"User"文件夾下),然后將該文件添加到"User"組中,在文件內添加如下內容:
#include "stm32f10x.h"
int main()
{
}
4、點擊工具按鈕,在對話框的"Output"選項卡中選中"Create HEX File",在"C/C++"選項卡中的"Include Paths"項目點擊按鈕,打開"Folder Setup"對話框,添加如下包含路徑:
這時,項目框架搭建完成,可以編譯生成hex文件。
5、實現LED燈控制。
實現過程同樣是使能GPIO時鐘、設置工作方式、點亮LED燈幾個步驟,因為前面為項目添加了幾個文件,在這些文件中包含了相關的預定義,所以編程只需要使用這些預定義即可。
① 使能GPIOC時鐘。
由于在"stm32f10x.h"文件中有上述預定義,標識符"RCC"為一個結構體類型的指針,只需要通過給RCC->APB2ENR的第4位賦值就能就能使能GPIOC的時鐘,所以使用:
RCC->APB2ENR |=0x1<<4; //開啟GPIOC時鐘
② 配置GPIOC_0為推挽輸出,50M速度。
同樣,由于在"stm32f10x.h"文件中有上述預定義,標識符"GPIOC"為一個結構體類型的指針,通過給GPIOC->CRL的3~0位設置為"0011"就可以配置GPIOC_0為推挽輸出,50M速度。即:
GPIOC->CRL &= ~(0x0F<<(4*0)); //對GPIOC_0設置為通用推挽輸出,最大速度50MHz
GPIOC->CRL |= (0x03<<(4*0));
③ 點亮LED燈。點亮LED1,需要給GPIOC_0輸出低電平,可以通過BSRR復位實現。
while(1)
{
GPIOC->BSRR |= 0x01<<(16+0); //對GPIOC_0復位
delay(1000);
GPIOC->BSRR |= 0x01<<(0+0); //對GPIOC_0置位
delay(1000);
}
main.c的完整程序如下:
#include "stm32f10x.h"
void delay(int t)
{
int i;
for( ;t>0; t--)
for(i=0;i<1000;i++);
}
int main()
{
RCC->APB2ENR |= 0x1<<4; //ê1?üGPIOCê±?ó
GPIOC->CRL &= ~(0x0F<<(4*0)); //??GPIOC_0éè???aí¨ó?í?íìê?3?£??ù?è50MHz
GPIOC->CRL |= (0x03<<(4*0));
while(1)
{
GPIOC->BSRR |= 0x01<<(16+0); //??GPIOC_0?′??
delay(1000);
GPIOC->BSRR |= 0x01<<(0+0); //??GPIOC_0????
delay(1000);
}
}
6、編譯,下載程序,LED1閃爍。
上一篇:使用STM32固件庫函數操作控制LED燈(STM32_04)
下一篇:直接通過寄存器地址操作控制LED燈(定義常量標示對應寄存器)
推薦閱讀
史海拾趣
在芯片短缺的大背景下,一家名為芯聯集成的公司憑借其敏銳的市場洞察力和快速響應能力,迅速調整戰略,專注于車規級IGBT芯片和模組的代工生產。公司憑借高效的生產能力和嚴格的質量控制,迅速獲得了多家頭部新能源車企的認可,成為他們的合作伙伴。這一舉措不僅幫助芯聯集成度過了行業低谷,還使其在短時間內實現了跨越式發展。
在環保意識日益增強的今天,Bomar公司積極響應全球環保號召,開始研發并應用環保材料。公司推出的生物基低聚物產品,完全或部分提取自植物或農作物等可再生原料,不僅降低了對石油產品的依賴,還具有低刺激性和低毒性的優勢。這一創新舉措不僅有助于提升Bomar公司產品的環保性能,也符合了市場對環保產品的需求趨勢,為公司的可持續發展注入了新的動力。
這五個故事只是Bomar公司在電子行業發展過程中的一部分,但它們卻展示了公司在技術創新、市場拓展、合作發展以及環保責任等方面的努力和成就。通過這些故事,我們可以看到Bomar公司如何緊跟時代步伐,不斷適應和引領電子行業的發展趨勢。
隨著電子行業的快速發展,Bomar公司逐漸意識到,僅僅依靠石英晶振產品已經無法滿足市場的多樣化需求。于是,在1988年,公司開始積極建立OEM客戶群,將業務范圍拓展至電信、計算機、醫療、安全、商業和工業等多個領域。通過與這些客戶的緊密合作,Bomar公司不僅成功推出了時鐘振蕩器、VCXOs和TCXOs等新產品,還根據客戶需求重新設計了制造流程,提升了產品性能和生產效率。
隨著技術的不斷成熟,DCX-CHOL Enterprises的產品逐漸在市場上樹立了良好的口碑。公司敏銳地捕捉到智能家居、物聯網等新興領域對電子產品的巨大需求,于是開始將產品線向這些領域拓展。通過與行業領軍企業的合作,DCX-CHOL Enterprises成功地將產品打入這些新興市場,市場份額逐年上升。同時,公司還積極開拓國際市場,將產品出口到多個國家和地區,進一步擴大了公司的知名度和影響力。
隨著公司規模的擴大和產品質量的提升,ASSMANN WSW components公司開始積極拓展全球市場。通過與全球知名企業的合作,公司成功打入國際市場,產品遠銷海外。同時,公司還積極參加國際電子展會和交流活動,與全球同行建立了廣泛的合作關系。這些舉措不僅提升了ASSMANN WSW的品牌知名度和影響力,還為公司帶來了更多的商業機會和發展空間。
ASSMANN WSW components公司一直致力于技術創新和產品研發。在某個關鍵時刻,公司研發團隊成功開發出了一種具有革命性的新型連接器,這種連接器不僅性能穩定、壽命長,而且具有極高的可靠性和安全性。這一技術突破使得ASSMANN WSW在電子元件市場上脫穎而出,迅速成為行業內的佼佼者。
請大家看下下面打問號幾行代碼,拋開其功能不說,真的是奇怪了,我都看了又看,頭都大了,就是不知道為什么,請朋友們指點下 #include<reg52.h> &nbs ...… 查看全部問答∨ |
|
STM32的驅動庫好用嗎?效率高嗎?優化的嗎?準備上STM32 N多年沒買過開發板了,也沒用過仿真器了。都是用軟件編譯調試好,直接ISP,然后通過串口命令開啟調試信息的輸出。 昨天買了塊STM32F103全功能型開發板,他們的辦事效率真低(深圳到廣州通常當 ...… 查看全部問答∨ |
|
求IAR Embedded Workbench for MCS-51 完整版 各位高手,小弟求IAR Embedded Workbench for MCS-51完整版,有哪位高人有,能否分享一下。我的郵箱jinghongchen@126.com… 查看全部問答∨ |
|
最近在看STM8L的spc發現中斷優先順序實在不太明白。中斷優先順序分為兩個暫存器,一個為CC暫存器的 I0 和 I1和ITC_SPRX暫存器,但我不明白的昰既然ITC_SPRX已經設定了個向量中斷的優先順序,那CC暫存器設定是為了甚麼呢,請哪位大大可以幫幫我,謝 ...… 查看全部問答∨ |