文章目錄
- 前言
- 一、硬體設計
- 二、軟體設計
-
- 1.基于庫函數代碼編寫
- 2.基于寄存器代碼編寫
前言
回顧之前的GPIO基礎知識,STM32F103一共有7組GPIO,每組GPIO含下面7個寄存器,也就是7個寄存器一共可以控制一組GPIO的16個IO口。
一、硬體設計
本章用到的硬體隻有 LED(DS0 和 DS1)。其電路在 ALIENTEK 精英 STM32F103 開發闆
上預設是已經連接配接好了的。 DS0 接 PB5, DS1 接 PE5。是不需要自己接任何電路的,是以我們隻需要編寫代碼即可。
設定推挽輸出原因:可以輸出強高低電平,控制LED燈亮滅。
二、軟體設計
1.基于庫函數代碼編寫
我們使用之前建立的STM32工程模闆, 在該檔案夾下面建立一個 HARDWARE 的文
件夾,用來存儲以後與硬體相關的代碼, 然後在 HARDWARE 檔案夾下建立一個 LED 檔案夾,
用來存放與 LED 相關的代碼。
今後在進行别的外設開發時,也是基于該模闆,在HARDWARE檔案夾下建立新的檔案夾,新增硬體相關代碼,然後編寫主函數,實作相關功能。
然後在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);
}
}
整個工程如下:
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燈的亮滅。