在CUBEMX中对于定时器TIM5,勾选使用内部时钟源,生成的代码中有如下标红 {MOD}的一段代码,致使H7的该捕获实验无法成功。但是屏蔽这段标红的实验正常,请问这是什么情况????非常不理解。按理说使用到TIM5时候就应该选择该定时器的时钟源啊?为什么配置了,多了这段代码反而串口打印不出来了呢?
// if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
// {
// _Error_Handler(__FILE__, __LINE__);
// }
// sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
// if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK)
// {
// _Error_Handler(__FILE__, __LINE__);
// }
//定时器5通道1输入捕获配置
//arr:自动重装值(TIM2,TIM5是32位的!!)
//psc:时钟预分频数
void TIM5_CH1_Cap_Init(u32 arr,u16 psc)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
TIM_IC_InitTypeDef sConfigIC;
htim5.Instance = TIM5;
htim5.Init.Prescaler = psc;
htim5.Init.CounterMode = TIM_COUNTERMODE_UP;
htim5.Init.Period = arr;
htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
// if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
// {
// _Error_Handler(__FILE__, __LINE__);
// }
// sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
// if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK)
// {
// _Error_Handler(__FILE__, __LINE__);
// }
if (HAL_TIM_IC_Init(&htim5) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
if (HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1); //开始捕获TIM5的通道1
__HAL_TIM_ENABLE_IT(&htim5,TIM_IT_UPDATE); //使能更新中断
}
1、3#楼所说的问题,寄存器为0是因为该函数void TIM5_CH1_Cap_Init(u32 arr,u16 psc)末尾没有调用IO口配置函数HAL_TIM_IC_MspInit(&htim5); 加上后寄存器debug中就不会全部是0了。
2、5#、6#楼所说的神奇的现象 我只要把这个判断语句屏蔽掉 就能正常捕获 if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}是因为使能TIM5时钟和配置优先级配置在了HAL_TIM_IC_MspInit(&htim5);位于 if (HAL_TIM_Base_Init(&htim5) != HAL_OK)之后,造成if (HAL_TIM_Base_Init(&htim5) != HAL_OK)调用的HAL_TIM_Base_Init(&htim5)调用的void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)为空。如图1
图1 tim5和中断设置太靠后
解决方式是在if (HAL_TIM_Base_Init(&htim5) != HAL_OK)调用的void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)中加入使能TIM5时钟和配置优先级,这样不屏蔽if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}也能正常工作了,如图2。修正后源码见附件。
修正后源码
图2
捕获模式不能使能tim的内部时钟吗?图形配置中,使能了TIM5的内部时钟 就会多生成我屏蔽部分的代码,然后程序就无法运行了
神奇的现象 我只要把这个判断语句屏蔽掉 就能正常捕获 if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}这个应该有无对程序是没有影响的啊 为什么出现这么神奇的现象???
求原子一定看看这个神奇的现象啊
一周热门 更多>