1. 程式人生 > 實用技巧 >【1】STM32:跑馬燈配置

【1】STM32:跑馬燈配置

一、庫函式版本

1.新建一個 led.h 檔案

#ifndef _LED_H
#define _LED_H
#include "sys.h"

#define LED0 PBout(5) // DS0
#define LED1 PEout(5) // DS1

void LED_Init(void); // LED介面初始化

#endif

  這段程式碼裡面最關鍵就是 2 個巨集定義,通過位帶操作 PB5 輸出高低電平從而控制 LED0 。

LED0=1; //通過位帶操作控制 LED0 的引腳 PB5 輸出高電平
LED0=0; //通過位帶操作控制 LED0 的引腳 PB5 輸出低電平

  同樣也可以使用韌體庫操作和暫存器操作,來實現 IO 口操作。

GPIO_SetBits(GPIOB, GPIO_Pin_5); //設定 GPIOB.5 輸出 1,等同 LED0=1;
GPIO_ResetBits (GPIOB, GPIO_Pin_5); //設定 GPIOB.5 輸出 0,等同 LED0=0;

  還可以通過直接操作暫存器,BRR 和 BSRR 的方式來操作 IO 口輸出高低電平。

GPIOB->BRR=GPIO_Pin_5; //設定 GPIOB.5 輸出 1,等同 LED0=1;
GPIOB->BSRR=GPIO_Pin_5; //設定 GPIOB.5 輸出 0,等同 LED0=0;

2.新建一個 led.c檔案

#include "led.h"

void LED_Init(void)
{
	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	// 使能GPIOB、GPIOE埠時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); 
	
	// 配置GPIOB.5 推輓輸出
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_SetBits(GPIOB, GPIO_Pin_5);
	
	// 配置GPIOE.5 推輓輸出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	GPIO_SetBits(GPIOE, GPIO_Pin_5);
}

  該函式的功能就是用來實現配置 PB5和 PE5 為推輓輸出。這裡需要注意的是:在配置 STM32 外設的時候,任何時候都要先使能該外設的時鐘。GPIO 是掛載在 APB2 總線上的外設,在韌體庫中對掛載在 APB2 總線上的外設時鐘使能是通過函式 RCC_APB2PeriphClockCmd()來實現的。

  需要說明的是,因為 GPIOB 和 GPIOE 的 IO 口的初始化引數都是設定在結構體變數GPIO_InitStructure 中,因為兩個 IO 口的模式和速度都一樣,所以我們只用初始化一次,在GPIOE.5 的初始化的時候就不需再重複初始化速度和模式了。

3.編寫main.c檔案

 1 #include "led.h"
 2 #include "delay.h"
 3 
 4 int main(void)
 5 {
 6     delay_init(); // 延時函式初始化
 7     LED_Init(); // LED介面初始化
 8     while(1)
 9     {
10         LED0 = 1;
11         LED1 = 0;
12         delay_ms(1000);
13         LED0 = 0;
14         LED1 = 1;
15         delay_ms(1000);
16     }
17 }

  在韌體庫 V3.5 中,系統在啟動的時候會呼叫 system_stm32f10x.c 中的函式 SystemInit()對系統時鐘進行初始化,在時鐘初始化完畢之後會呼叫 main()函式。 所以我們不需要再在 main()函式中呼叫 SystemInit()函式。