STM32F4xx系列微處理器比市場上同類產品先進得多。除了是快速的32位MCU,STM32F4還具有豐富的硬件外設支持以及DSP引擎優勢。就功能和價格而言,STM32F4是全勝者。最近,STM32用戶社區激增。 STM32 Discovery開發板正在以前所未有的速度增長。最近,我幾次收到讀者關于STM32F4xx標準外設庫(SPL)與MikroC Pro for ARM集成的切實詢問,因此,盡管這不是我關于STM32 ARM的主流文章之一,但我還是覺得我應該解決這個話題。之前,我展示了如何通過MikroC移植STM32F1xx系列設備的STM32F1xx SPL。這篇文章與以前的文章沒有什么不同-只是微小的變化。我建議讀者在閱讀這篇文章之前先閱讀較早的帖子。
目前MikroC編譯器是為數不多的尚未正式為SPL集成提供任何支持的編譯器之一。希望他們將來會添加此支持,但是MikroC解決方案的方式與其他編譯器不同。 MikroC擁有非常強大的IDE和豐富的庫基礎支持,而SPL為用戶提供了對芯片硬件的更多控制權。就像我之前說過的一樣,它們變成了一把雙刃劍。
所需的工具
首先,您需要MikroC Pro for ARM。該編譯器的演示版本提供8k代碼限制,足以滿足第一手ARM經驗。您需要一塊STM32F4xx板。我使用了STM32F407VG發現。 ST Microelectronics的該板 某種程度上是STM32F4系列的旗艦Discovery板,并且非常受歡迎。最后,您將需要我包含在示例中的STM32F4xxx SPL。修改其中的文件以使其與MikroC環境兼容。
要做的事情
首先,我們需要準備用于ARM編譯器的MikroC PRO,以鏈接SPL。我假設編譯器已預先安裝。首先轉到編譯器的安裝文件夾,然后找到 include 文件夾。就我而言,它是: C: Users Public Documents Mikroelektronika mikroC PRO for ARM Include 。
在此文件夾中,有一個名為 stdint.h的文件。將其重命名為 stdint(備份).h 并從提供的文件夾中復制新的 stdint.h 文件到這個位置。如果您在上一篇文章中已經這樣做,或者已升級到MikroC Pro for ARM版本4.15(在撰寫本文時為最新版本),請跳過此部分。
接下來,我們必須更改編譯器的某些選項。啟動編譯器,并如下所示:
工具》》選項》》輸出設置
檢查 區分大小寫 。應用并關閉此窗口。如果您之前已經做過,請再次跳過此部分。
從現在開始要謹慎命名和字母大小寫,因為編譯器現在對此很敏感,否則您將注定要陷入編程不幸的深淵。只是一個簡單但有用的提示-在進行一些編輯或修改后,很少會編譯您的代碼。這將極大地幫助您調試一小段編碼窗口中的微小錯誤。
最后將SPL保持在安全的位置。每當您使用SPL編碼新項目時,都應從該位置復制該新項目并與該項目一起使用。這樣可以確保原始的SPL副本不會被意外修改。
使用SPL編碼
示例代碼只是另一個閃爍的代碼示例,可以滿足要求。我不會告訴您如何在MikroC中創建新項目。我想這是眾所周知的。創建一個新項目,并使用 項目管理器 添加SPL文件夾中的所有源文件和頭文件。您可以僅添加所需外圍設備的頭文件和源文件,也可以添加所有文件(如果不確定哪個代表哪個)。前一種方法比后者花費更少的編譯時間。另外,添加 defines.pld 項目級別定義文件。現在您可以使用SPL進行編碼了。
請注意,由于MikroElektronika尚未正式集成SPL,因此您會注意到紅色帶有SPL的代碼各部分下的錯誤標記。這并不罕見,也不是錯誤。所以不用擔心。
代碼:
#include “stm32f4xx_gpio.h” #include “stm32f4xx_usart.h” #include “stm32f4xx_rcc.h” void setup_GPIOs(); void check_LEDs(); void main() { unsigned char s = 0; setup_GPIOs(); check_LEDs(); while(1) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1); s++; } if(s 》= 6) { s = 0; } switch(s) { case 1: { GPIO_SetBits(GPIOD, GPIO_Pin_12); break; } case 2: { GPIO_SetBits(GPIOD, GPIO_Pin_13); break; } case 3: { GPIO_SetBits(GPIOD, GPIO_Pin_14); break; } case 4: { GPIO_SetBits(GPIOD, GPIO_Pin_15); break; } case 5: { GPIO_SetBits(GPIOD, GPIO_Pin_12); GPIO_SetBits(GPIOD, GPIO_Pin_13); GPIO_SetBits(GPIOD, GPIO_Pin_14); GPIO_SetBits(GPIOD, GPIO_Pin_15); break; } default: { break; } } Delay_ms(90); GPIO_ResetBits(GPIOD, GPIO_Pin_12); GPIO_ResetBits(GPIOD, GPIO_Pin_13); GPIO_ResetBits(GPIOD, GPIO_Pin_14); GPIO_ResetBits(GPIOD, GPIO_Pin_15); Delay_ms(90); } } void setup_GPIOs() { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); } void check_LEDs() { GPIO_SetBits(GPIOD, (GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)); Delay_ms(900); GPIO_ResetBits(GPIOD, (GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)); }
演示視頻鏈接:https://www.youtube.com/watch?v=ngk-4Lm11yU。
我個人還沒有到目前為止,我一直依賴SPL,而且我相信原始級別的編碼學習。 SPL允許在STM32領域中輸入教科書。難怪它使編碼變得容易,但是在我看來,它的不利影響是它的用戶花在參考手冊和數據表上的時間更少。反過來,這將影響他們獲得對內部硬件外圍設備及其工作原理的扎實學習。如果SPL通過這種方式使生活變得輕松,那為什么不使用MikroC庫。這些甚至更易于使用。有時圖書館是救星,而有時它們是詛咒。有時您不想重新發明“輪子”,但您當然想用它制造汽車,而我的朋友比什么都值錢。在這一點上,我不想就此事進一步辯論。我將這個選擇留給用戶。
文件:將STM32F4xx標準外圍設備庫與MikroC Pro for ARM集成。
責任編輯:wv
-
編譯器
+關注
關注
1文章
1634瀏覽量
49152 -
STM32F4xx
+關注
關注
0文章
15瀏覽量
12795
發布評論請先 登錄
相關推薦
評論