STM32复习笔记(四) —— 按键翻转LED
1.本例程软件设计思路
1)选定 GPIOA GPIO_Pin_0 控制 LED ;选定 GPIOB GPIO_Pin_0 作为按键输入
2)配置 LED GPIO 为推挽输出,速率10MHz
3)配置 KEY GPIO 为浮空输入,本例因使用软件仿真,无法使用输入功能 (或未得知如何使用),则将 KEY GPIO 亦配置为推挽输出,速率10MHz
4)向 GPIOB->ODR 寄存器第0位 (即 KEY GPIO) 写入0 or 1模拟按键输入,通过读取 GPIOB->ODR 寄存器第0位值控制 LED GPIO 输出高/低电平
实际下载验证时,可将 KEY GPIO 配置为浮空输入模式,读取 GPIOB->IDR 寄存器值判断按键是否被按下
2.代码编写
于 main.c 中编写代码
#include "stm32f10x.h"
typedef enum
{
S_GPIO_Mode_OUT = 0x01, //输出, 速率 10MHz
S_GPIO_OType_PP = 0x00, //通用推挽输出
S_GPIO_Mode_IN = 0x00, //输入
S_GPIO_IN_FLOATING = 0x01 //浮空输入
}GPIOA_Config_TypeDef;
//粗略延时
void delay_(uint32_t count);
int main(void)
{
//GPIO_Pin_0 配置
uint32_t spinposl = 0x00;
/* --------- LED IO 口 配置 --------- --------- --------- ------ */
//开启 GPIOA 时钟
RCC->APB2ENR |= ((uint32_t)1 << 2);
//输出模式, 速率 10MHz
GPIOA->CRL &= ~((uint32_t)0x03 << (spinposl * 4));
GPIOA->CRL |= ((uint32_t)S_GPIO_Mode_OUT << (spinposl * 4));
//通用推挽输出模式
GPIOA->CRL &= ~((uint32_t)0x03 << ((spinposl * 4) + 2));
GPIOA->CRL |= ((uint32_t)S_GPIO_OType_PP << ((spinposl * 4) + 2));
//引脚输出低电平
GPIOA->BRR |= (uint16_t)0x01;
/* --------- KEY IO 口 配置 --------- --------- --------- ------ */
//开启 GPIOB 时钟
RCC->APB2ENR |= ((uint32_t)1 << 3);
//输入模式
GPIOB->CRL &= ~((uint32_t)0x03 << (spinposl * 4));
GPIOB->CRL |= ((uint32_t)S_GPIO_Mode_OUT << (spinposl * 4)); //S_GPIO_Mode_OUT -> S_GPIO_Mode_IN
//浮空输入模式
GPIOB->CRL &= ~((uint32_t)0x03 << ((spinposl * 4) + 2));
GPIOB->CRL |= ((uint32_t)S_GPIO_OType_PP << ((spinposl * 4) + 2)); //S_GPIO_OType_PP -> S_GPIO_IN_FLOATING
while(1)
{
//有按键按下
if(0x00 != (GPIOB->ODR & (uint16_t)0x01)) //GPIOB->ODR -> GPIOB->IDR
{
//消抖
delay_(10);
if(0x00 != (GPIOB->ODR & (uint16_t)0x01)) //GPIOB->ODR -> GPIOB->IDR
{
//GPIO_Pin_0 输出
GPIOA->ODR ^= (uint16_t)0x01;
//等待释放
while(0x00 != (GPIOB->ODR & (uint16_t)0x01)); //GPIOB->ODR -> GPIOB->IDR
}
}
}
}
void delay_(uint32_t count)
{
__IO uint32_t delay_count = (12000 * count);
while(delay_count--);
}
3.编译及仿真
点击编译,如无错误可进入仿真界面
打开 GPIOB (按键 IO 口为 GPIOB GPIO_Pin_0)
打开逻辑分析仪并添加 LED 的 IO 口,即GPIOA GPIO_Pin_0 (可参考STM32复习笔记(二))
点击运行,并点击 GPIOB_ODR 第0位模拟按键按下与松开,观察 LED GPIO 电平状态
可以观察到按键每次按下时 LED GPIO 会出现电平翻转,结果与预想一致