__HAL_TIM_CLEAR_FLAG(&htim8, TIM_IT_CC1);会复位TIM8计数值吗?
时间: 2023-08-02 10:09:39 浏览: 103
__HAL_TIM_CLEAR_FLAG(&htim8, TIM_IT_CC1)不会复位TIM8计数值,它只会清除TIM8的指定中断标志位(这里是TIM_IT_CC1)以允许下一个中断事件发生。如果想要复位TIM8的计数值,可以使用__HAL_TIM_SET_COUNTER(&htim8, 0)函数将其设置为0。
相关问题
用stm32cubeide写stm32f103c8t6用OLED显示的倒计时程序
好的,我可以为您提供一份 STM32CubeIDE 下的 STM32F103C8T6 倒计时程序。因为您需要使用 OLED 显示屏,我假设您已经有了一个能够驱动 OLED 显示屏的库文件,并且已经将其添加到了您的工程中。以下是倒计时程序的代码,请根据您的需要进行修改和调整:
```
#include "main.h"
#include "oled.h"
// 定义倒计时时间(单位:秒)
#define COUNTDOWN_TIME 10
// 定义计时器时基的频率(单位:Hz)
#define TIMER_FREQ 1000
// 定义计时器的预分频值
#define TIMER_PRESCALER ((uint16_t)((SystemCoreClock / 2) / TIMER_FREQ) - 1)
// 定义计时器的自动重载值
#define TIMER_AUTORELOAD ((uint16_t)(TIMER_FREQ - 1))
// 定义计时器的计数值
static volatile uint32_t timer_count = 0;
// 定义倒计时剩余时间
static volatile uint32_t countdown_time = COUNTDOWN_TIME;
// 定义倒计时是否完成的标志
static volatile uint8_t countdown_done = 0;
// 定义计时器中断处理函数
void TIM2_IRQHandler(void)
{
// 检查计时器更新中断是否发生
if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET)
{
// 清除计时器更新中断标志
__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);
// 增加计数值
timer_count++;
// 检查是否达到计时器的自动重载值
if (timer_count >= TIMER_AUTORELOAD)
{
// 重置计数值
timer_count = 0;
// 减少倒计时剩余时间
if (countdown_time > 0)
{
countdown_time--;
}
else
{
// 倒计时完成
countdown_done = 1;
}
}
}
}
int main(void)
{
// 初始化 HAL 库
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// 配置 GPIO
MX_GPIO_Init();
// 配置 OLED 显示屏
OLED_Init();
// 配置计时器
MX_TIM2_Init();
// 启动计时器
HAL_TIM_Base_Start_IT(&htim2);
// 显示倒计时
while (1)
{
// 检查倒计时是否完成
if (countdown_done)
{
// 显示倒计时完成的提示信息
OLED_Clear();
OLED_ShowString(0, 0, "Countdown Done!");
OLED_ShowString(0, 2, "Press Reset Button");
OLED_ShowString(0, 4, "To Restart");
}
else
{
// 显示倒计时剩余时间
OLED_Clear();
OLED_ShowNumber(0, 0, countdown_time, 2, 16);
OLED_ShowString(32, 0, "s");
}
}
}
// 配置 GPIO
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能 GPIOA 时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置 PA0 为输入模式(复位按键)
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// 配置计时器
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
// 使能 TIM2 时钟
__HAL_RCC_TIM2_CLK_ENABLE();
// 配置计时器时基的时钟源和预分频值
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
sClockSourceConfig.Prescaler = TIMER_PRESCALER;
HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);
// 配置计时器的自动重载值和计数模式
htim2.Instance = TIM2;
htim2.Init.Period = TIMER_AUTORELOAD;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
// 配置计时器的中断
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
}
```
这是一个简单的倒计时程序,使用了 STM32F103C8T6 的 TIM2 计时器来计时。在程序开始时,计时器被启动,并且 OLED 显示屏会显示倒计时剩余时间。每当计时器的计数值达到计时器的自动重载值时,计时器的中断处理函数会被调用,倒计时剩余时间会减少一秒。当倒计时剩余时间为零时,倒计时完成的标志会被设置,OLED 显示屏会显示倒计时完成的提示信息。程序会一直循环等待,直到复位按键被按下,然后程序会重新开始倒计时。
阅读全文