stm32的时钟、占空比和按键制作

这是一个卑微电子信息学员的开始

这是学习stm32的第三天

寒假开始了,卑微电子信息学员开始了stm32的学习过程。

stm32的初始化注意事项

一. 时钟的灵活使用

  1. 在程序中使用delay函数会占用CPU,使在执行delay函数的时候CPU无法进行别的工作,令人感到不适;
  2. 这时候需要时钟来帮忙,在main函数中的时钟函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim),每过固定的时间它会被调用一次;
    3.只需要建立一个变量,在每次函数调用的时候进行加一操做,当达到需要的时间时提示main函数就可以了;

二. 如何制作一个较为完整的按键

  1. 一个较为完整的按键需要有防误触功能,可以识别过为细小的干扰;
  2. 它还需要有较好的灵活性,在按下按键后有响应;
  3. 当按键被按下后,不抬起的时间中要注意选择是一直当做按键被按下还是不在响应该按键直至抬起;
  4. 附不响应重复动作的按键代码:在这里插入图片描述在这里插入图片描述在这里插入图片描述

三.数据显示屏的使用

  1. 用库函数做相对简单;
  2. 注意事项:
    接线要接对;

四.时钟的使用—占空比专题

1.在高手的指点下,该函数进一步简化,只需要一个步骤就可以改变:
htim1.Instance->CCR1-=50;

本文仅供学习使用,禁止一切转载或调用,最终解释权由作者本人享有。

以下是一个基于STM32按键控制PWM占空比的示例代码,使用TIM2通道2和GPIOA的第0号引脚作为PWM输出引脚。其中,按键按下时占空比增加10%,松开时占空比归零。 ```c #include "stm32f10x.h" // 初始化TIM2通道2为PWM输出模式 void TIM2_PWM_Init(void) { // 使能TIM2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 定时器初始化结构体 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_Period = 999; // 设置周期为1000 TIM_TimeBaseInitStructure.TIM_Prescaler = 71; // 设置预分频为72 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频为1 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); // PWM模式初始化结构体 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能 TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比为0 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出电平为高 TIM_OC2Init(TIM2, &TIM_OCInitStructure); // 使能TIM2定时器 TIM_Cmd(TIM2, ENABLE); } // 初始化GPIOA的第0号引脚为复用推挽输出 void GPIOA_Init(void) { // 使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIO初始化结构体 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 第0号引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大输出速率为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); } // 初始化按键为输入模式 void Button_Init(void) { // 使能GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIO初始化结构体 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 第0号引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大输入速率为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); } int main(void) { // 初始化TIM2和GPIOA TIM2_PWM_Init(); GPIOA_Init(); // 初始化按键 Button_Init(); // 记录按键上一次状态 uint8_t last_state = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0); // 循环读取按键状态并更新占空比 while (1) { uint8_t state = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0); // 检测按键状态是否发生变化 if (state != last_state) { last_state = state; // 按键按下时增加占空比10% if (state == 0) { uint16_t pulse = TIM_GetCapture2(TIM2); pulse += 100; if (pulse > 999) pulse = 999; TIM_SetCompare2(TIM2, pulse); } // 按键松开时占空比归零 else { TIM_SetCompare2(TIM2, 0); } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值