使用蓝桥杯CT117E板子
库函数版本
一.硬件连接
1.LED灯电路图
2.基本知识
— GPIO输出方式:推挽输出
— IO口输出高电平,LED灭,输出低电平,LED点亮。
— 锁存器高电平打开,低电平关闭
二.配置步骤
电路图对应
锁存口:LE —— N LE —— M PD2
LED灯 :D1~D8—— H D0~H D7—— M PC8~M PC15
三.代码
1.IO口操作,只对单一的IO口
#define LED0 PCout(8)
#define LED1 PCout(9)
#define LED2 PCout(10)
#define LED3 PCout(11)
#define LED4 PCout(12)
#define LED5 PCout(13)
#define LED6 PCout(14)
#define LED7 PCout(15)
2.控制端口输出高低电平控制LED亮灭
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//输出高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//输出低电平
3.GPIO_Init输入参数详解
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef*GPIO_InitStruct)
功能描述: 根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器
输入参数1: GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设
输入参数2: GPIO_InitStruct:指向结构GPIO_InitTypeDef的指针,包含了外设GPIO的配置信息
由此我们知道第二个参数“&GPIO_InitStructure”包含的是外设GPIO的配置信息,主函数开头我们进行了这样一个私有数据声明:
GPIO_InitTypeDef GPIO_InitStructure;
顺藤摸瓜,我们在头文件“stm32f10x_gpio.h”看到对GPIO_InitTypeDef 的定义:
typedef struct
{
uint32_t GPIO_Pin;
GPIOMode_TypeDef GPIO_Mode;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOOType_TypeDef GPIO_OType;
GPIOPuPd_TypeDef GPIO_PuPd;
}GPIO_InitTypeDef;
在这个之前,我已经对GPIO_InitTypeDef中的各个参数进行了定义,对应的正是void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)输入参数2的描述“指向结构GPIO_InitTypeDef的指针,包含了外设GPIO的配置信息”。
4.源文件
—— led.c文件
/*********************************
1.锁存口:LE —— N LE —— M PD2
LED灯 :D1~D8—— H D0~H D7—— M PC8~M PC15
2.IS_FUNCTION_STATE(STATE)是用于状态参数判断的 在函数中会调用它来判断你输入的状态参数
是不是ENABLE DISABLE之一 如果你输入的参数是他俩其中的一个 那么参数是合法的 运算结果就是1
如果参数不合法那运算结果就为0了
*********************************/
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//LED
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能GPIOC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12
|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //模式设置为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//锁存器
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); //使能GPIOD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_All); //将LED端口都设为高电平,熄灭LED
}
—— led.h文件
/************************************
头文件中使用#ifndef #define #endif条件编译,避免头文件内容重复定义
/
#ifndef 字符串
#define 上述字符串
#endif
/
一般放在头文件里面,作用就是以防你在.c文件里面不小心重复包含头文件的时候不会报错
*************************************/
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
void LED_Init(void); //函数声明
#endif
—— 主函数main.c
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
int main(void)
{
LED_Init();
while(1)
{
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
}