iT邦幫忙

2021 iThome 鐵人賽

DAY 8
1
Arm Platforms

基於ARM-M0架構MCU之落摔檢測韌體開發系列 第 8

[DAY 8] _用標準庫開發,以STM32F030為例

我今天來講一下我用STM32F030這顆MCU標準庫開發的環境吧,首先要懂的建環境,需要複製那些標準庫裡的檔案才能正常使用,沒複製到的話也不用太擔心,編譯的時候會告訴你哪裡有問題再往那方向去找就好,其他顆MCU也可比較辦理差別並不大。
首先,先看看我的標準庫裡的檔案:
https://ithelp.ithome.com.tw/upload/images/20210921/201419797WqfpxShGo.png
首先會先創建1個資料夾,名稱叫:STM32F030CC_FWlib_Template,(韌體模板)
底下有這4個子資料夾:

1.Libraries

2.Output

3.Project

4.User


接下來我會一一介紹這些資料夾的作用跟需要複製甚麼檔案,當然不創建這幾個子資料夾也沒關係,這只是養成1個整理的好習慣,下面會介紹各個資料夾的作用,了解後就會知道這樣分的作用。

1.Libraries

這個文件底下是放官方寫好的庫函式還有啟動文件,首先點開資料夾,我還有創建兩個文件檔
https://ithelp.ithome.com.tw/upload/images/20210921/20141979QknwuIg1ra.png

1-1.CMSIS (裡面放啟動的程式檔)

https://ithelp.ithome.com.tw/upload/images/20210921/20141979sVKGwEPunZ.png
這些都是MCU上店後先執行的程式檔,有.c跟.h還有.s檔,這三個檔的作用我在邊簡單的描述一下,.h檔式函數的定義和宣告,.c會include.h去實現函數的功能,.s則是啟動的檔案 MCU記憶體的最初燒錄檔案。

1-2.STM32F030_StdPeriph_Driver

這底下有inc跟src資料夾,這是官方寫好的外設功能函式庫.c和.h
https://ithelp.ithome.com.tw/upload/images/20210921/20141979W0lgDaLPCY.png


2.Output

新增這資料夾是為了放編譯完成的檔案,最常用的是拿編譯完成.HEX檔,這個檔也可以用來燒錄主要是寫進Flash裡
開啟專案後設定方法如下圖步驟:
https://ithelp.ithome.com.tw/upload/images/20210921/20141979yk6k2x9x3H.png
如上圖
1.點1個像魔術棒的東西
2.點選Output
3.選擇路徑的選項,在選擇自己所創建的Output
4.按OK~


3.Project

創建專案選擇的地方

4.User

自己寫的.c和.h存放的地方
https://ithelp.ithome.com.tw/upload/images/20210921/20141979YzE53VSQcv.png
我先來講解我led的範例吧,先來看我led底下的資料夾吧
https://ithelp.ithome.com.tw/upload/images/20210921/20141979tZj8zUL68i.png
再來看看我這兩個寫了什麼吧,首先是bsp_led.h

#ifndef __BSP_LED_H	   // 防止重複include編譯上的錯誤
#define __BSP_LED_H	   //

#include "stm32f0xx.h"		 //引入官方寫的標準庫	

void LED_GPIO_Config(void);  //GPIO口的初始化

#endif /*__BSP_LED_H*/

再來是bsp_led.c實現函式的部分

// bsp board support package
#include "./led/bsp_led.h"

void LED_GPIO_Config(void)
{
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);     //使用標準庫裡的RCC初始化函式
    
  GPIO_InitTypeDef GPIO_InitStruct;					     //初始化結構體名稱宣告
  GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;//要開啟的腳位             
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;            //配置成輸出模式             
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;  	     //IO口速度配置
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;  		     //IO口推挽模式
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP; 		     //IO口上拉模式
  GPIO_Init(GPIOB,&GPIO_InitStruct);				     //標準庫裡的GPIO初始化函式	
}

再來是main.c裡如何使用這個自己打好的庫函式
https://ithelp.ithome.com.tw/upload/images/20210921/20141979tMrSRCyGK8.png

打上我標記的這幾行

#include "bsp_led.h"

int main(void)
{
    LED_GPIO_Config();	
    GPIO_SetBits(GPIOB,GPIO_Pin_12);		//PB12,高電位
    GPIO_SetBits(GPIOB,GPIO_Pin_13);		//PB13,拉高電位
    GPIO_SetBits(GPIOB,GPIO_Pin_14);		//PB14,拉高電位
}

這樣就可以把這三個GPIO口拉high了~,103也可以照這方法編寫,GPIO_SetBits這個函式是官方寫好的,想要看寫甚麼很簡單,對著他按右鍵,選擇F12那個選項
https://ithelp.ithome.com.tw/upload/images/20210921/201419796X1COyBllI.png
按了之後就會跑進來這,如下圖
https://ithelp.ithome.com.tw/upload/images/20210921/201419798gfsvaYydN.png
可以看他會多跑出紅框的部分,再來看紫框是這個函式的說明,在看框部分裡面有個BSRR!!,官方寫好了,跟我們自己用暫存器開發是一樣的,其實我昨天講的暫存器開發跟官方寫的是一樣,講到這邊,我兩種都大概說明一下了,假如有遇到什麼問題再下面提出來,我會盡力回答
這兩種方法都懂是最好,很多剛學嵌入式的同學都很排斥前面的暫存器開發,想說我只要有功能就好快速開發就好,這樣想是沒甚麼錯,但之後持續走這行一定會碰壁,官方沒寫好的就會不知道該怎麼修改,或著是要開發更進階的功能。

接下來的好幾天我會講I2C的基本原理,我會把我所知道的知識用最白話最好懂的方式呈現上來!


上一篇
[DAY 7] _GPIO口的八種模式
下一篇
[DAY 9] _I²C協議介紹
系列文
基於ARM-M0架構MCU之落摔檢測韌體開發32

尚未有邦友留言

立即登入留言