目錄
相關芯片的背景:
選用學習模塊:
使用韌體庫點亮LED:
1.首先打開官方給的相關板子的原理圖,找到LED的電路原理圖
2.代碼設計
2.1編程要點
2.2 LED引腳宏定義
2.3 bsp板級支持包的撰寫
相關芯片的背景:
學習STM32F103之前,我們需要了解相關芯片的背景:
STM32F系列屬于中低端的32位ARM微控制器,該系列芯片是意法半導體(ST)公司出品,其內核是Cortex-M3
該系列芯片按片內Flash的大小可分為三大類:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)
芯片集成定時器Timer,CAN,ADC,SPI,I2C,USB,UART等多種外設功能
選用學習模塊:
1.使用市面上所有的學習板:例如野火STM32、正點原子STM32等
2.使用最小系統板,自主安裝外設
3.自主設計PCB,焊接STM32芯片再接外設
4.使用仿真軟體
在這里我選用野火官網STM32F103指南者(價格對比正點稍貴)以及正點原子STM32F103精英版,在學習中大多使用野火板
使用韌體庫點亮LED:
有了板子以后,就要開始撰寫相關代碼來實作目的,今天是學會用韌體庫點亮LED燈,這里的話我就不對暫存器和韌體庫有更多的解釋和記錄了,需要花不少時間,本身也是小白,之后若有時間和自己有需求記錄理解資料的話可能會再刷然后記錄,那我現在就直接開始,
1.首先打開官方給的相關板子的原理圖,找到LED的電路原理圖

這些 LED 燈的陰極都是連接到 STM32 的 GPIO 引腳,只要我們控制 GPIO 引腳的電平輸出狀態, 即可控制 LED 燈的亮滅,若您使用的實驗板 LED 燈的連接方式或引腳不一樣,只需根據我們的工程修改引腳即可,程式的控制原理相同,由此可以看到LED綠燈LEDG的引腳是PB0,我此次的目的就是簡單的用韌體庫點亮LEDG,
2.代碼設計
2.1編程要點
2.2 LED引腳宏定義
//LED_G_GPIO的引腳為PB0
#ifndef _BSP_LED_H
#define _BSP_LED_H
#include "stm32f10x.h"
/*以下定義是為了封裝,方便更改代碼,例如若是要更改PB0為PB5直接在此將GPIO_Pin_0改為GPIO_Pin_5
不用在以后函式中的所有關鍵字進行更改 */
#define LED_G_GPIO_PIN GPIO_Pin_0 //定義當前引腳為Pin0口
#define LED_G_GPIO_PORT GPIOB //定義當前的GPIO口為GPIOB
#define LED_G_GPIO_CLK RCC_APB2Periph_GPIOB //定義當前外設使能GPIO口為GPIOB
//函式宣告,此函式在bsp_led.c中定義
void LED_GPIO_Config(void);
#endif /* _BSP_LED_H */
2.3 bsp板級支持包的撰寫
首先是要包含頭檔案"bsp_led.h",其次需要定義一個LED點亮函式在此我定義的是LED_GPIO_Config,所以開頭是這樣的 :
bsp_led.c
//bsp:board support package 板級支持包
#include "bsp_led.h" //頭檔案
void LED_GPIO_Config(void) //LED點亮函式
{
}
在學習過庫函式以及韌體庫相關知識后,在庫中找到相關定義結構體,在工程檔案中打開FWLIB,點進stm32f10x_gpio.h中,找到配置GPIO的結構體GPIO_InitTypeDef,在此中有對GPIO的引腳控制、輸出輸入模式以及速度定義,
stm32f10x_gpio.h中的GPIO_InitTypeDef結構體定義
typedef struct
{
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
好的,讓我們回到bsp_led.c中繼續代碼,此刻我們需要LED點亮函式中用GPIO_InitTypeDef結構體定義一個變數名GPIO_InitStruct用來存放引腳定義,然后對其進行模式定義,點亮LED燈需定義LED_G_GPIO_PIN引腳、輸出輸入模式定義為推挽輸出也就是GPIO_Mode_Out_PP,速度定義為50MHz,GPIO_Speed_50MHz(該結構體所有范圍以及在stm32f10x_gpio.h中有列舉定義,可以對其按F12查看相關地方),所以代碼為
bsp_led.c
//bsp : board support package 板級支持包
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
}
然后,我們需要打開外設的使能時鐘,觀察官方給的參考資料
我們可以知道復位和時鐘控制RCC中,GPIOB的時鐘是掛在APB2上的,所以我們找到APB2的RCC時鐘去使能
通過手冊我們可以知道,APB2時鐘使能暫存器是RCC_APB2ENR,觀察前四位,我們需要將IOPBEN至1,使其使能,所以我們打開工程目錄中的FWLIB中找到stm3210x_rcc.h,然后在其庫中找到對應的APB2的外設時鐘使能函式是RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState),對其按F12,就知道其函式兩個變數名一個為外設定義引腳,在此是RCC_APB2Periph_GPIOB(這個在bsp_led.h中定義過),另一個就是引腳直接使能或失能ENABLE與DISABLE,所以在此的使能函式定義為RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK,ENABLE);所以現在的代碼為
bsp_led.c
//bsp : board support package 板級支持包
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK,DISABLE);
GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
}
使能完畢后,想想還需要什么才能是PB0定義出來,沒錯,現在就差一個定義GPIOB了,也就是bsp_led.h中定義的介面LED_G_GPIO_PORT,所以現在在stm3210x_gpio.h中找到GPIO引腳的定義也就是GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct),對其F12可知其函式的相關定義,通過相關代碼可知,第一個需定義為GPIOB也就是LED_G_GPIO_PORT,第二個變數是強轉結構體的指標而我們在bsp_led.c中已經定義了GPIO_InitTyDef的 GPIO_InitStruct了,所以直接對GPIO_InitStruct取地址,就可以定義相關引腳狀態了,在此也就是GPIO_Init(LED_G_GPIO_PORT,&GPIO_InitStruct),所以完整代碼為:
bsp_led.c
//bsp : board support package 板級支持包
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK,DISABLE);
GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);
}
撰寫好了板級支持包后,直接在main函式中呼叫函式就可以了
main.c
#include "stm32f10x.h" //相當于51單片機中的 #include<reg51.h>
#include "bsp_led.h"
int main(void)
{
LED_GPIO_Config();
}
編譯,然后燒入代碼,板子的綠色燈就亮起了,
本人還是初學者,寫這篇文章只是記錄自己的學習歷程,并且加入一些自己的見解,方便自己在復習的時候可以知道這時是怎么想的,很多地方講解不清還請見諒~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/337824.html
標籤:其他
