新手上路
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2017-3-25
- 在线时间
- 35 小时
|
9金钱
我在405的一个板子上用了TIM4,然后希望能用串口去控制TIM4的定时时间,也就是希望可以按需要更改TIM4中的htim4.Init.Period。可是我发现我在中断里如果用了两次定时器的初始化的话,好像会出现冲突,定时器的时钟频率为72MHz,预分频为7199:void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim4)
{
// HAL_TIM_Base_Stop_IT(&htim4);
// HAL_TIM_Base_Stop_IT(&htim4);
// HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_5);
// HAL_TIM_Base_Start_IT(&htim4);
if(flag_time==1)
{
flag_time=2;
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);
MX_timer4_Init(29999);
HAL_TIM_Base_Start_IT(&htim4);
}
else if(flag_time==2)
{
flag_time=1;
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET);
MX_timer4_Init(59999);
HAL_TIM_Base_Start_IT(&htim4);
}
}
}
MX_timer4_Init(59999);这个是我改的初始化TIM4的一个函数,想用这个来改变Period的值:
void MX_timer4_Init(uint32_t x)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim4.Instance = TIM4;
htim4.Init.Prescaler = 7199;
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = x;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
这样的程序下,定时器并不能按我想的进入3000ms和6000ms的中断。Debug看了下,好像一直在进中断,并没有按3000ms,6000ms这样定时,然后进中断。就像图2、3,设置断点后,程序跑完第一个if里的 MX_timer4_Init(29999);直接就蹦到第二个if里的 MX_timer4_Init(59999);了。这是为什么?
这是一个问题,另一个问题是,Period寄存器是不是16位的,那就是只能计数到65535?,如果不改变prescaler的值和CKD的值,是不是就只能定时到6553ms这么长时间?如图1.
|
|