cubemx设置
参考文章
时钟设置
将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门:
优点:
- 输出电平可调;
- 带负载能力强;
- 输出端可以并联使用。