天天看點

STM32—跑馬燈庫函數實驗前言一、硬體設計二、軟體設計

文章目錄

  • 前言
  • 一、硬體設計
  • 二、軟體設計
    • 1.基于庫函數代碼編寫
    • 2.基于寄存器代碼編寫

前言

回顧之前的GPIO基礎知識,STM32F103一共有7組GPIO,每組GPIO含下面7個寄存器,也就是7個寄存器一共可以控制一組GPIO的16個IO口。

STM32—跑馬燈庫函數實驗前言一、硬體設計二、軟體設計

一、硬體設計

本章用到的硬體隻有 LED(DS0 和 DS1)。其電路在 ALIENTEK 精英 STM32F103 開發闆

上預設是已經連接配接好了的。 DS0 接 PB5, DS1 接 PE5。是不需要自己接任何電路的,是以我們隻需要編寫代碼即可。

STM32—跑馬燈庫函數實驗前言一、硬體設計二、軟體設計
STM32—跑馬燈庫函數實驗前言一、硬體設計二、軟體設計

設定推挽輸出原因:可以輸出強高低電平,控制LED燈亮滅。

二、軟體設計

1.基于庫函數代碼編寫

我們使用之前建立的STM32工程模闆, 在該檔案夾下面建立一個 HARDWARE 的文

件夾,用來存儲以後與硬體相關的代碼, 然後在 HARDWARE 檔案夾下建立一個 LED 檔案夾,

用來存放與 LED 相關的代碼。

今後在進行别的外設開發時,也是基于該模闆,在HARDWARE檔案夾下建立新的檔案夾,新增硬體相關代碼,然後編寫主函數,實作相關功能。

STM32—跑馬燈庫函數實驗前言一、硬體設計二、軟體設計

然後在LED檔案夾下建立led.c、led.h檔案。将其添加到工程之中,并且将頭檔案路徑也添加到MDK。

led.c

#include "led.h"

void LED_Init(void)
{

	GPIO_InitTypeDef  GPIO_InitStructure;

 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 //使能PB、PE端口時鐘
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5,端口配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度為50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);					 //初始化GPIOB.5
	GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5輸出高電平

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5,端口配置
	GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //初始化GPIOE.5
	GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5輸出高電平
}
           

這裡需要說明的是,因為 GPIOB 和 GPIOE 的 IO 口的初始化參數都是設定在結構體變量

GPIO_InitStructure 中,因為兩個 IO 口的模式和速度都一樣,是以我們隻用初始化一次,在

GPIOE.5 的初始化的時候就不需要再重複初始化速度和模式了。

led.h

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

void LED_Init(void);	//初始化

#endif
           

main.c

#include "led.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"

int main(void)
{ 
 
	delay_init();		  //初始化延時函數
	LED_Init();		        //初始化LED端口
	while(1)
	{
			GPIO_ResetBits(GPIOB,GPIO_Pin_5);
			GPIO_SetBits(GPIOE,GPIO_Pin_5);
			delay_ms(300);
			GPIO_SetBits(GPIOB,GPIO_Pin_5);
			GPIO_ResetBits(GPIOE,GPIO_Pin_5);
			delay_ms(300); 
	}
} 
           

整個工程如下:

STM32—跑馬燈庫函數實驗前言一、硬體設計二、軟體設計

2.基于寄存器代碼編寫

前面學習GPIO的基本知識的時候已經知道,每一組GPIO的引腳控制都是通過7個寄存器進行的,是以,通過配置這7個寄存器就可以實作IO口的操作。

led.c

#include "led.h"

void LED_Init(void)
{
	RCC->APB2ENR|=1<<3;    // 使能GPIOB時鐘
	RCC->APB2ENR|=1<<6;    //使能GPIOE時鐘
	   	 
	GPIOB->CRL&=0XFF0FFFFF; 
	GPIOB->CRL|=0X00300000;//PB.5推挽輸出、IO口速度50MHz
    GPIOB->ODR|=1<<5;      //PB.5輸出高,燈滅
											  
	GPIOE->CRL&=0XFF0FFFFF;
	GPIOE->CRL|=0X00300000;//PE.5推挽輸出、IO口速度50MHZ
	GPIOE->ODR|=1<<5;      //PE.5輸出高,燈滅
}
           

led.h

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

void LED_Init(void);	//初始化

#endif
           

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"

int main(void)
{ 
 
	delay_init();
	LED_Init();	
	while(1)
	{
		GPIOB->BRR=GPIO_Pin_5;//LED0亮
	 	GPIOE->BSRR=GPIO_Pin_5;//LED1滅
		delay_ms(300);
    	GPIOB->BSRR=GPIO_Pin_5;//LED0滅
		GPIOE->BRR=GPIO_Pin_5;//LED1亮
		delay_ms(300);
	}
}
           

當然這裡你也可以通過設定ODR寄存器來實作IO輸出電平的控制,進而實作LED燈的亮滅。

繼續閱讀