STM32 学习7 库函数点亮LED
一、功能说明
本文实现STM库函数点亮LED的功能。
库函数的工程模板来自普中官方教材。
工程模板类似下图:
二、实现
1. 定义 LED的引脚,我的开发板使用GPIOC
2. 定义所有引脚,使用或操作:
3. 关键函数说明
2.3.1 RCC_APB2PeriphClockCmd
打开或关闭APB2外设时钟。可选参数有:
- RCC_APB2Periph_AFIO 功能复用 I/O 时钟
- RCC_APB2Periph_GPIOA GPIOA 时钟
- RCC_APB2Periph_GPIOB GPIOB 时钟
- RCC_APB2Periph_GPIOC GPIOC 时钟
- RCC_APB2Periph_GPIOD GPIOD 时钟
- RCC_APB2Periph_GPIOE GPIOE 时钟
- RCC_APB2Periph_ADC1 ADC1 时钟
- RCC_APB2Periph_ADC2 ADC2 时钟
- RCC_APB2Periph_TIM1 TIM1 时钟
- RCC_APB2Periph_SPI1 SPI1 时钟
- RCC_APB2Periph_USART1 USART1 时钟
- RCC_APB2Periph_ALL 全部APB2外设时钟
打开GPIOC时钟示例:
RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE);
2.3.2 GPIO_Init
功能描述: 根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器。
初始化参数是个结构体,定义在stm32f10x_gpio.h里。
GPIO_InitTypeDefStructure
typedef struct
{
u16 GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
} GPIO_InitTypeDef;
GPIO_Pin
GPIO的引脚定义
- GPIO_Pin_None : 没有选中引脚
- GPIO_Pin_0 引脚0
- ……
- GPIO_Pin_All 选中全部引脚
GPIO_Speed
引脚的速率
- GPIO_Speed_10MHz 最高输出速率 10MHz
- GPIO_Speed_2MHz 最高输出速率 2MHz
- GPIO_Speed_50MHz 最高输出速率 50MHz
GPIO_Mode
用来设置引脚的工作状态
- GPIO_Mode_AIN 模拟输入
- GPIO_Mode_IN_FLOATING 浮空输入
- GPIO_Model_IPD 下拉输入
- GPIO_Mode_IPU 上拉输入
- GPIO_Mode_Out_OD 开漏输出
- GPIO_Mode_Out_PP 推挽输出
- GPIO_Mode_AF_OD 复用开漏输出
- GPIO_Mode_AF_PP 复用推挽输出
2.3.3 函数 GPIO_Write
向指定GPIO数据端口写入数据,输入参数GPIOx和PortVal待写入的数值。
我这里的开发板LED共阳接法,控制时把要点亮的位设置为低,其余设置高。如点亮L1:
GPIO_Write(GPIOC, 0xFE);
2.3.4 GPIO_SetBits
设置指定的数据端口位,示例:
GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);
2.3.5 GPIO_ResetBits
清除指定的端口位。
2.3.6 GPIO_WriteBit
设置或清除指定的数据端口位,示例:
GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET);
三、示例源代码
1. LED.h
/* LED时钟端口、引脚定义 */
void LED_Init(void);
2. LED.c
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE);
GPIO_InitStructure.GPIO_Pin=LED_PIN; //选择你要设置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(LED_PORT,&GPIO_InitStructure); /* 初始化GPIO */
GPIO_SetBits(LED_PORT,LED_PIN); //将LED端口拉高,熄灭所有LED
}
3. main.c
// 延时函数
void delay(u32 i){
while(i--);
}
int main()
{
LED_Init();
while(1)
{
GPIO_ResetBits(LED_PORT,GPIO_Pin_0);//点亮D1
delay(0xfffff);
GPIO_ResetBits(LED_PORT, GPIO_Pin_1);
delay(0xfffff);
GPIO_ResetBits(LED_PORT, GPIO_Pin_2);
delay(0xfffff);
GPIO_ResetBits(LED_PORT, GPIO_Pin_3);
delay(0xfffff);
GPIO_ResetBits(LED_PORT, GPIO_Pin_4);
delay(0xfffff);
GPIO_ResetBits(LED_PORT, GPIO_Pin_5);
delay(0xfffff);
GPIO_ResetBits(LED_PORT, GPIO_Pin_6);
delay(0xfffff);
GPIO_ResetBits(LED_PORT, GPIO_Pin_7);
delay(0xfffff);
GPIO_SetBits(LED_PORT,LED_PIN);
}
}
运行效果:连续点亮8个LED,然后全熄灭,再重复循环。