基于正点原子miniSTM32开发板,STM32RCT6,库函数。
LED0连接STM32的PA8引脚,LED1连接STM32的PD2引脚;当STM32引脚为低电平时LED灯被点亮。
1、时钟使能函数
函数原型:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
调用时钟使能函数,使能IO口对应的时钟,例如:
//使能PA,PD端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);
2、IO口初始化函数
函数原型:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
作用:初始化GPIO的模式和速度,也就是设置相应的GPIO寄存器的CRH和CRL值。
⚫ 第一个入口参数是GPIO_TypeDef类型指针变量,确定是哪个GPIO;
⚫ 第二个入口参数是GPIO_InitTypeDef类型指针变量,确定GPIOx的对应的引脚以及引脚的模式和输出最大速度。
第二个指针变量结构体如下:
typedef struct
{
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
}
GPIO_InitTypeDef;
1)第一个参数GPIO_Pin确定初始化那些管脚,取值范围为:GPIO_Pin_0~GPIO_Pin_15以及GPIO_Pin_All
2)第二个参数GPIO_Speed确定初始化的IO的最大输出速度,其取值范围为枚举类型GPIOSpeed_TypeDef 的枚举值:
3)第三个参数GPIO_Mode;确定初始化的IO的输入输出模式,其取值范围为枚举类型,GPIOMode_TypeDef的枚举值:
3、2个读取输入电平函数
要想知道某个IO口输入的电平状态,只要读IDR寄存器,再看某个位的状态就可以了。
(1)GPIO_ReadInputDataBit():
函数原型:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:读取某个GPIO的输入电平。也就是读取IDR寄存器的某个值。
示例:
//读取GPIOE.5管脚的输入值
GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5);
(2) GPIO_ReadInputData():
函数原型:
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
作用:读取IDR寄存器的值。函数GPIO_ReadInputData()和GPIO_ReadInputDataBit()作用类似,不同的是GPIO_ReadInputData()用来读取一组(GPIOA~GPIOG)所有IO口(16个)的输入值。
示例:
//读取GPIOE所有IO输入值
GPIO_ReadInputData(GPIOE);
4、2个读取输出电平函数:
要想知道某个IO口输出的电平状态,只要读ODR寄存器,再看某个位的状态就可以了。
(1)GPIO_ReadOutputDataBit
函数原型;
uint8_t GPIO_ReadOutputDataBit (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:读取某个GPIO的输出电平。实际操作的是GPIO_ODR寄存器.
示例:
//读取GPIOA.5的输出电平
GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);
(2)GPIO_ReadOutputData
函数原型:
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
作用:读取某组GPIO的输出电平。实际操作的是GPIO_ODR寄存器。
示例:
//读取GPIOA组中所有io口输出电平
GPIO_ReadOutputData(GPIOA);
5、4个设置输出电平函数
(1) GPIO_SetBits
函数原型:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:设置某个IO口输出为高电平(1)。实际操作BSRR寄存器
(2)GPIO_ResetBits
函数原型:
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:设置某个IO口输出为低电平(0)。实际操作的BRR寄存器。
(3)GPIO_WriteBit
函数原型:
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
作用与上两个函数相同,实际操作BSRR/BRR寄存器用于控制某个I/O的输出状态。(4) GPIO_Write
函数原型:
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
实际操作ODR寄存器,通过设置ODR寄存器的值控制I/O口的输出状态,一般用来一次性往一组GPIO下的多个I/O口设值。
1、LED.H
定义LED初始化函数。
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
2、LED.C
LED初始化函数。使能LED引脚对应的时钟,定义引脚输出模式,速度,将LED对应引脚置位,使LED灯默认熄灭。
#include
#include
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
3、main.c
初始化LED和延时函数,while循环实现两个LED灯的循环点亮。
#include
#include
#include
int main()
{
LED_Init();
delay_init();
while(1)
{
GPIO_ResetBits(GPIOD,GPIO_Pin_2);//复位LED1引脚,点亮LED1
delay_ms(500);//延时
GPIO_SetBits(GPIOD,GPIO_Pin_2); //复位LED0引脚,点亮LED0
delay_ms(500);
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
delay_ms(500);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
delay_ms(500);
}
return 0;
}
程序编译下载后可观察到LED0和LED1交替闪烁。