【ARM课】2-按键控制LED

本文详细介绍了在STM32中如何使用HAL库进行GPIO配置,包括按键引脚的输入模式设置、LED的推挽输出控制,以及按键消抖处理函数的编写。还讨论了推挽输出电路的特点和应用。
摘要由CSDN通过智能技术生成

cubemx设置

参考文章

【STM32】HAL库——按键原理及消抖

时钟设置

在这里插入图片描述

将HCLK设置为最大频率72MHz

在这里插入图片描述

GPIO设置

按键引脚

输入模式

上拉——上拉常态为高电平,按键按下为低电平,利于识别。

在这里插入图片描述

LED引脚

输出电平——PA8 高 PA9 低 PA10 高 PA11低 PA12高

输出模式——推挽输出

既不上拉也不下拉(emmm图截错了)

在这里插入图片描述

使用函数

电平翻转
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

电平读取
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

延时
__weak void HAL_Delay(uint32_t Delay)

HAL_Delay是阻塞函数,有坑,具体外部中断的时候再写。写了微秒计时的函数。

void delay_us(int32_t nus)
{
    int32_t temp;
    // 假设系统时钟为72MHz,SysTick计时器每1/8微秒递减一次
    SysTick->LOAD = 72 * nus; // LOAD的值等于需要的微秒数乘以8
    SysTick->VAL = 0x00; // 清空计数器
    SysTick->CTRL = 0x01; // 使能SysTick,采用内核时钟源

    do
    {
        temp = SysTick->CTRL; // 读取当前倒计数值
    }
    while((temp & 0x01) && (!(temp & (1 << 16)))); // 等待时间到达

    SysTick->CTRL = 0x00; // 关闭计数器
    SysTick->VAL = 0x00; // 清空计数器
}

代码

按键判断函数

void KEY_Judge(void)
{
	if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_GPIO_PIN) == GPIO_PIN_SET)
		return;
		HAL_Delay(50);
	if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_GPIO_PIN) == GPIO_PIN_SET)
		return;
		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_GPIO_PIN);
		HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_GPIO_PIN);
}	

宏定义

#define LED1_GPIO_Port	GPIOA
#define LED2_GPIO_Port	GPIOA
#define LED3_GPIO_Port	GPIOA
#define LED4_GPIO_Port	GPIOA
#define LED5_GPIO_Port	GPIOA

#define LED1_GPIO_PIN	GPIO_PIN_8
#define LED2_GPIO_PIN	GPIO_PIN_9
#define LED3_GPIO_PIN	GPIO_PIN_10
#define LED4_GPIO_PIN	GPIO_PIN_11
#define LED5_GPIO_PIN	GPIO_PIN_12

#define KEY_GPIO_Port	GPIOA
#define KEY_GPIO_PIN	GPIO_PIN_8

效果展示

按键控制LED

数电知识小结——推挽输出

上周数电课学习了开漏输出电路,这周课上补充了推挽输出电路。

V D D V_{DD} VDD对于drain,所以是高电平;
V S S V_{SS} VSS对于source,所以是低电平;
V C C V_{CC} VCC对于collector,所以是高电平。

下图是手册的推挽电路部分。

在这里插入图片描述
数电书上的CMOS推挽电路(OD门)

在这里插入图片描述

TTL普通推挽电路

在这里插入图片描述
OC门

请添加图片描述
优点:

  1. 输出电平可调;
  2. 带负载能力强;
  3. 输出端可以并联使用。
  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值