一:点灯初始化用到的库函数
1. /*开启LED相关的GPIO外设时钟*/
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
参数 1 RCC_APB2Periph /* GPIO端口时钟 */
参数2 NewState /* ENABLE:1 时钟端口使能 DISENABLE:0 时钟端口不使能 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); // GPIOE时钟使能
RCC_APB2Periph_GPIOE /*GPIO端口时钟*/
ENABLE /*端口时钟使能 1*/
2. /*调用库函数,初始化GPIO*/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) //
参数1 “GPIOx” //GPIO管脚 例如 GPIOE
参数2 GPIO_InitStruct // 自定义 GPIO_InitTypeDef 类型结构体
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitTypeDef 结构体
typedef struct
{
uint16_t GPIO_Pin; //GPIO位置管脚 例如GPIO_Pin_0 /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */GPIOSpeed_TypeDef GPIO_Speed; // I/O速度有2M 10M 50M /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */GPIOMode_TypeDef GPIO_Mode; // I/O模式类型八种 /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
三种速度的枚举类型
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
八种模式,具体什么时候用不太清楚以后懂了补上。点灯用的推挽输出。
不过这个博主写的挺好的推荐一下 https://blog.csdn.net/it1988888/article/details/7944314
typedef enum
{ GPIO_Mode_AIN = 0x0, //模拟输入
GPIO_Mode_IN_FLOATING = 0x04,//浮空输入
GPIO_Mode_IPD = 0x28,//下拉输入
GPIO_Mode_IPU = 0x48,//上拉输入
GPIO_Mode_Out_OD = 0x14,//开漏输出
GPIO_Mode_Out_PP = 0x10,//推挽输出
GPIO_Mode_AF_OD = 0x1C, //复用开漏输入
GPIO_Mode_AF_PP = 0x18 //复用推挽输入
}GPIOMode_TypeDef;
二. 点亮LED灯的函数
1. 调用库函数点亮
GPIO_ResetBits(GPIOE , GPIO_Pin_0); //拉低GPIOE.0 I/O
GPIO_SetBits(GPIOE , GPIO_Pin_0); //拉高 GPIOE.0 I/O
参数1 “GPIOE” GPIO管脚
参数2 ”GPIO_Pin_0“ LED灯的管脚在对应GPIO上的位置
2. PEout(n); (不太清楚什么原理)(IO映射 )
#include "sys.h" //在这个头文件里面
#define LED0 PEout(0) // PE0
#define LED1 PEout(1) // PE1
// GPIOE_ODR_Addr 是地址 n 是GPIO位置例如 PE5 GPIOE_ODR_Addr == PE n == 5
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) // 输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
GPIOA_ODR_Addr 在下面
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
3. 直接寄存器操作
GPIOE->BRR=GPIO_Pin_0; //拉低GPIOE电平
GPIOE->BSRR=GPIO_Pin_1; //拉高GPIOE电平
和第一个差不多,就是把第一个库函数里面的对 I/O 的操作提取出来
三. 主要代码
1 LED.c
#include "led.h"
#include "stm32f10x.h"void led_init()
{
/*定义一个 GPIO_InitTypeDef 类型结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*对应GPIO时钟使能*/
RCC_APB2PeriphClockCmd(LED1_GPIO_CLK|LED2_GPIO_CLK|LED3_GPIO_CLK|LED4_GPIO_CLK,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // LED1-->PE.0 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //I/O口速度设置为50MHZ
GPIO_Init(LED1_GPIO_PORT,&GPIO_InitStructure); //按照参数设置初始化时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // LED2-->PE.1 端口配置
GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStructure); //按照参数设置初始化时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // LED2-->PE.2 端口配置
GPIO_Init(LED3_GPIO_PORT,&GPIO_InitStructure); //按照参数设置初始化时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // LED2-->PE.2 端口配置
GPIO_Init(LED4_GPIO_PORT,&GPIO_InitStructure); //按照参数设置初始化时钟/* 关闭所有led灯 */
GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_ResetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_ResetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_ResetBits(LED4_GPIO_PORT, LED4_GPIO_PIN);
}
2. led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h" //PEout需要的
#define LED1 PEout(0) // PE0
#define LED2 PEout(1) // PE1#define LED3 PEout(2) // PE2
#define LED4 PEout(3) // PE3void led_init(void);//初始化
#endif
3. main.h
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
LED0=0;
LED1=1;
delay_ms(300); //延时300ms
LED0=1;
LED1=0;
delay_ms(300); //延时300ms
}
}
/**
*****************下面注视的代码是通过调用库函数来实现IO控制的方法*****************************************
int main(void)
{
delay_init(); //初始化延时函数
LED_Init(); //初始化LED端口
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //LED0对应引脚GPIOB.5拉低,亮 等同LED0=0;
GPIO_SetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉高,灭 等同LED1=1;
delay_ms(300); //延时300ms
GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED0对应引脚GPIOB.5拉高,灭 等同LED0=1;
GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉低,亮 等同LED1=0;
delay_ms(300); //延时300ms
}
}
****************************************************************************************************
***/
/**
*******************下面注释掉的代码是通过 直接操作寄存器 方式实现IO口控制**************************************
int main(void)
{
delay_init(); //初始化延时函数
LED_Init(); //初始化LED端口
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);}
}