新手入门
- 积分
- 15
- 金钱
- 15
- 注册时间
- 2023-2-16
- 在线时间
- 5 小时
|
1金钱
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./SYSTEM/usart/usart.h"
TIM_HandleTypeDef tim_handle_test;
uint8_t flag = 0;
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
led_init();
usart_init(115200); /* 串口初始化为115200 */
/*定时器初始化*/
tim_handle_test.Instance = TIM7;
tim_handle_test.Init.Prescaler = 7200-1;
tim_handle_test.Init.Period = 5000-1;
tim_handle_test.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
HAL_TIM_Base_Init(&tim_handle_test);
//使能更新中断并启动计数器
HAL_TIM_Base_Start_IT(&tim_handle_test);
LED0(0);
TIM7->ARR = 20000-1;
//tim_handle_test.Init.Period = 40000-1;
while(1)
{
}
}
/*定时器基础MSP初始化函数*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
//因为所有的定时器初始化函数HAL_TIM_Base_Init()都会调用该函数,所以需要判断这是哪个定时器
if(htim->Instance == TIM7)
{
__HAL_RCC_TIM7_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM7_IRQn,2,2);
HAL_NVIC_EnableIRQ(TIM7_IRQn);
}
}
/*定时器7中断服务函数*/
void TIM7_IRQHandler()
{
HAL_TIM_IRQHandler(&tim_handle_test);//这是所有定时器的公共服务函数
}
/*定时器更新中断回调函数*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//因为定时器公共服务函数会调用该函数,所以需要判断这是哪个定时器
if(htim->Instance == TIM7)
{
LED0_TOGGLE();
if(flag == 0)
{
TIM7->ARR = 5000-1;
flag = 1;
}
else
{
TIM7->ARR = 20000-1;
flag = 0;
}
}
}
上面是源代码
理想现象是LED0亮0.5s灭2s如此循环,但结果是LED0先亮0.5s,再灭2s,再亮2s,在灭0.5s,再亮2s,在灭0.5s,循环。
请问是为什么,我设置了ARPE位为1(tim_handle_test.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;)。
|
|