其他分享
首页 > 其他分享> > STM32复习笔记(四) —— 按键翻转LED

STM32复习笔记(四) —— 按键翻转LED

作者:互联网

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.编译及仿真

点击编译,如无错误可进入仿真界面
SSS4.001
打开 GPIOB (按键 IO 口为 GPIOB GPIO_Pin_0)
SSS4.002
打开逻辑分析仪并添加 LED 的 IO 口,即GPIOA GPIO_Pin_0 (可参考STM32复习笔记(二))
SSS4.003
点击运行,并点击 GPIOB_ODR 第0位模拟按键按下与松开,观察 LED GPIO 电平状态
SSS4.004
可以观察到按键每次按下时 LED GPIO 会出现电平翻转,结果与预想一致

标签:GPIOB,LED,复习,ODR,STM32,GPIO,---------,uint32
来源: https://blog.csdn.net/qq_45691873/article/details/120591631