STM32G070RBT6基于STM32CubeMX创建定时器中断控制LED闪烁

STM32G070RBT6基于STM32CubeMX创建定时器中断控制LED闪烁


📚功能介绍

📑通过STM32CubeMX配置定时器1和定时器3分别作为两个led的定时闹钟。这里作为演示,当然使用一个定时器,通过轮询方式,实现多个led不定长时间闪烁也是可以的。

📗实现方法介绍

  • ✅定时时间计算公式:
    定时时间 = (Prescaler+1)× (Counter +1)/ 定时器时钟频率
    例如,这里定时时间为 1ms,可设置Prescaler = 64-1;Counter = 1000 - 1;(TIM2时钟频率设置为64MHz)
    在这里插入图片描述
    1. 对应自动生成的代码部分
 htim1.Instance = TIM1;
  htim1.Init.Prescaler = 64-1;//预分频
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 1000-1;//1ms = 64/(64-1)/1000
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

🔖如果想直接定时1S,那么配置参数代码如下:

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 6399;//预分频
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 9999;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    1. 🔨使能定时器中断
      在这里插入图片描述
  • ✅中断向量表这里勾选也一样
    在这里插入图片描述

📝重写定时器中断回调函数内容

🍁在main.c中,相应位置添加如下代码:

#include <stdio.h>//用于调用printf函数打印,需要在target选项中勾选‘Use MicroLib’
#define led_shine_time 1000 //定时时长
#define led_shine_time2 1000
uint16_t cnt1,cnt2;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM1)                  //处理TIM1间隔定时中断
    {
				cnt1++;
				if(cnt1 == led_shine_time)
				{
					cnt1 = 0;
					printf("cnt1 \n");//1s打印一次
        HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
				}
    }
    if(htim->Instance == TIM3)                 //处理TIM3间隔定时中断
    {
			cnt2++;//1s打印一次
			if(cnt2 == led_shine_time2)
			{
				cnt2 = 0;
        HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
				printf("cnt2 \n");
			}
    }
}
  • 🚩在usart.c文件中添加如下内容:
#include "stdio.h"
/*可调用printf*/
int fputc(int ch,FILE *f)
{
    /*&huart1指的是串口1,如果用别的串口就修改数字*/
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch , 1 , 0xffff);
    return ch;
}
  • 🌿串口调试信息打印
    在这里插入图片描述

⛳程序源码

链接:https://pan.baidu.com/s/1UTPwtcE5xfC4EbIya-DRDA 
提取码:e5ez
STM32G431RBT6是一款基于ARM Cortex-M4F内核的微控制器,它属于STM32Cube系列的一部分,提供了丰富的GPIO、ADC等外设资源。SG90舵机是一种常见的微型伺服电机,常用于各种机器人项目。 要在STM32CubeMX控制SG90舵机转动,你需要完成以下几个步骤: 1. **配置GPIO**:首先,在STM32CubeMX中,选择你的STM32G431RBT6板子并配置GPIOA或GPIOB作为舵机的输出口,通常舵机信号线连接到PWM(脉冲宽度调制)引脚。 2. **设置PWM模式**:将选定的GPIO配置为PWM输出模式,设置合适的频率(例如50Hz),这对于精确控制舵机的速度至关重要。 3. **编写代码**:使用Keil MDK或STMCubeIDE等集成开发环境编写C代码,通过调整PWM周期和占空比来改变舵机的角度。对于SG90,一般半波(50% duty cycle)对应90度,全波(100% duty cycle)对应180度。 ```c #include "stm32f4xx_hal.h" // ...其他头文件 void setup() { GPIO_InitTypeDef GPIO_InitStruct; // 初始化GPIO GPIO_InitStruct.Pin = GPIO_PIN_1; // 替换为你配置的GPIO引脚 GPIO_InitStruct.Mode = GPIO_MODE_AF_HYSTERESIS; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; // 如果使用TIM2进行PWM HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化TIM2 TIM_HandleTypeDef htim2; TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; htim2.Instance = TIM2; htim2.Init.Prescaler = (uint16_t) (SystemCoreClock / (1000 * 50) - 1); // 设置频率为50Hz htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 2000; // 2000us周期,这取决于你的实际频率和需要的最大角度 if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { // 处理错误... } // 配置PWM通道1 HAL_TIM_PWM_ConfigChannel(&htim2, &htim2.Init.PulseWidthCycle, TIM_CHANNEL_1); // 设置TIM2为master模式 sMasterConfig.MasterOutputTrigger = TIM_TRGOarrivaltigger; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfiguration(&htim2, &sMasterConfig); // 开启定时器 HAL_TIM_Base_Start_IT(&htim2); } void loop() { float angle = map(analogRead(PIN_X), 0, 1023, 0, 180); // 替换PIN_X为你的ADC输入引脚 uint16_t pulse_width = map(angle, 0, 180, 0, 2000); // 转换为PWM周期 TIM_OC1_SetCompare(&htim2, pulse_width); // 更新比较值,控制舵机的角度 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值