此篇代码我主要沿用的是 bibilili UP主 江科大 的模式
此外,在此篇文章中我只是陈述代码,对基本理论不再做过多陈述,如果细节可以看
还有大家在调试过程中如果遇到了什么问题,可以在评论区@我,我也会尽我所能为大家解决问题
1、LED.h文件
为了方便移植,我首先在头文件内对相关函数进行了封装,大家在看的时候可以对照着源文件 .c 文件一块看
#ifndef __LED_H
#define __LED_H
///
//移植修改区
//按照实际端口修改
//较前版本更加容易移植(注意,端口仅仅适用于非JTAG/SWD引脚,如果是JTAG引脚,需要打开AFIO时钟,并失能JTAG)
#define RCC_ALL_LED ( LED0_GPIO_CLK | LED1_GPIO_CLK )
#define RCC_ALL_GPIO_PIN (LED0_GPIO_PIN | LED1_GPIO_PIN)
#define LED0_GPIO_PIN GPIO_Pin_2 //LED0引脚号
#define LED0_PIN_ID 2 //LED0引脚序号
#define LED0_GPIO_PORT GPIOA //LED0端口号
#define LED0_GPIO_CLK RCC_APB2Periph_GPIOA //LED0时钟
#define LED0_FUN_OUT PAout //LED0输出端口配置函数
//#define LED0_FUN_IN PBin //LED0输入端口配置函数
#define LED1_GPIO_PIN GPIO_Pin_4 //LED1引脚号
#define LED1_PIN_ID 4 //LED1引脚序号
#define LED1_GPIO_PORT GPIOA //LED1端口号
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOA //LED1时钟
#define LED1_FUN_OUT PAout //LED1输出端口配置函数
//#define LED1_FUN_IN PEin //LED1输入端口配置函数
/*供外部调用的函数声明*/
void LED_Init();
void Led_On(uint8_t _on);
void Led_Off(uint8_t _off);
void Led_Toggle(uint8_t _toggle);
#endif
2、LED.c文件
GPIO_SetBits(LED0_GPIO_PORT,LED0_GPIO_PIN); //这个函数作用是端口的输出置1
GPIO_ResetBits(LED0_GPIO_PORT,LED0_GPIO_PIN);//这个函数的作用是端口的输出置0
此文件中我封装了三个函数:开启、关闭、翻转
大家可以自行调用函数测试程序
#include "stm32f10x.h"
#include "LED.h"
/*
*********************************************************************************************************
* 函 数 名: LED_Init
* 功能说明: 配置LED指示灯相关的GPIO.
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void LED_Init()
{
//定义结构体
GPIO_InitTypeDef GPIO_InitStructure;
//打开时钟
RCC_APB2PeriphClockCmd(RCC_ALL_LED,ENABLE);
//结构体赋值
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = RCC_ALL_GPIO_PIN ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//调用GPIO_Init()函数进行初始化
GPIO_Init(LED0_GPIO_PORT,&GPIO_InitStructure);
}
/*
*********************************************************************************************************
* 函 数 名: Led_On
* 功能说明: LED点亮
* 形 参:uint8_t _on:1-2
* 返 回 值: 无
*********************************************************************************************************
*/
void Led_On(uint8_t _on)
{
if(_on == 1)
{
GPIO_SetBits(LED0_GPIO_PORT,LED0_GPIO_PIN);
}
if(_on == 2)
{
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
}
}
/*
*********************************************************************************************************
* 函 数 名: Led_Off
* 功能说明: LED关闭
* 形 参:uint8_t _on:1-2
* 返 回 值: 无
*********************************************************************************************************
*/
void Led_Off(uint8_t _off)
{
if(_off == 1)
{
GPIO_ResetBits(LED0_GPIO_PORT,LED0_GPIO_PIN);
}
if(_off == 2)
{
GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
}
}
/*
*********************************************************************************************************
* 函 数 名: Led_Toggle
* 功能说明: LED翻转
* 形 参:uint8_t _on:1-2
* 返 回 值: 无
*********************************************************************************************************
*/
void Led_Toggle(uint8_t _toggle)
{
if(_toggle == 1)
{
if(GPIO_ReadInputDataBit(LED0_GPIO_PORT, LED0_GPIO_PIN))
{
GPIO_ResetBits(LED0_GPIO_PORT,LED0_GPIO_PIN);
}
else
{
GPIO_SetBits(LED0_GPIO_PORT,LED0_GPIO_PIN);
}
}
if(_toggle == 2)
{
if(GPIO_ReadInputDataBit(LED1_GPIO_PORT, LED1_GPIO_PIN))
{
GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
}
else
{
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
}
}
}
3、main.c文件
#include "stm32f10x.h" // Device header
#include <stdio.h>
#include "LED.h"
#include "Delay.h"
int main(void)
{
LED_Init(); //引用初始化函数,初始化GPIO端口
while(1)
{
Led_On(1);
Led_On(2);
Delay_ms(100);
Led_Off(1);
Led_Off(2);
Delay_ms(100);
}
}