使用固件库点亮LED灯
- 在User文件夹下新建 Led的c和头文件
- 在Keil下添加Led的c文件
- Led的头文件要添加防止重定义的额语法
- 将Led的头文件路径包含进编译器的路径选择中
- 可以通过F12查看相关函数的原型
- 一种其他通过宏定义,用ON和OFF开关的方法
示例
头文件
#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "stm32f10x.h"
#define LED_G_GPIO_PIN GPIO_Pin_0
#define LED_G_GPIO_PORT GPIOB
#define LED_GPIO_CLK RCC_APB2Periph_GPIOB
void LED_GPIO_Config(void);
#endif
函数实现
// bsp:board support package 板级支持包
#include "bsp_LED.h"
void LED_GPIO_Config(void)
{
RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);
GPIO_InitTypeDef Gpio_InitStruct;
Gpio_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
Gpio_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
Gpio_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_G_GPIO_PORT, &Gpio_InitStruct);
}
使用固件库检测按键
端口输入数据寄存器 IDR,如果是0表示检测到低电平,如果是1表示检测到高电平。
按键采用查询的方法(不使用中断)
-
按键的初始化和配置函数
-
按键的松手检测
-
异或的运算方法 LED_TOGGLE
#define LED_R_TOGGLE {LED_R_GPIO_PORT->ODR ^= LED_R_GPIO_PIN;} //这一句的运算符 ^= 是异或 运算符, 是C语言里的一个二进制运算符,相异为1,相同为0。
示例:
Key的头文件
#ifndef __BSP_KEY_H
#define __BSP_KEY_H
#include "stm32f10x.h"
#define KEY1_GPIO_PIN GPIO_Pin_0
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY2_GPIO_PIN GPIO_Pin_13
#define KEY2_GPIO_PORT GPIOC
#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY_ON 1
#define KEY_OFF 0
void KEY_GPIO_Config(void);
uint8_t Key_Scan(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin);
#endif
Key的函数实现
#include "bsp_key.h"
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct1;
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);
RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);
GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStruct);
GPIO_InitStruct1.GPIO_Pin = KEY2_GPIO_PIN;
GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStruct1);
}
uint8_t Key_Scan(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON)
{
//松手检测,注意这里while的写法,直接是加了分号,说明这句松手的时候才会执行下一句
while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);
return KEY_ON;
}
else return KEY_OFF;
}
主函数
int main (void)
{
//来到这里的时候,系统的时钟已经被配置成72M
LED_GPIO_Config();
KEY_GPIO_Config();
LED_G_TOGGLE;
LED_R_TOGGLE;
while(1)
{
if(Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN)==KEY_ON)
LED_G_TOGGLE;
if(Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN)==KEY_ON)
LED_R_TOGGLE;
}
}