|
void bsp_InitHardTimer(void)
{
TIM_HandleTypeDef TimHandle = {0};
uint32_t usPeriod;
uint16_t usPrescaler;
uint32_t uiTIMxCLK;
TIM_TypeDef* TIMx = TIM_HARD;
RCC_TIM_HARD_CLK_ENABLE(); /* 使能TIM时钟 */
/*-----------------------------------------------------------------------
bsp.c 文件中 void SystemClock_Config(void) 函数对时钟的配置如下:
System Clock source = PLL (HSE)
SYSCLK(Hz) = 400000000 (CPU Clock)
HCLK(Hz) = 200000000 (AXI and AHBs Clock)
AHB Prescaler = 2
D1 APB3 Prescaler = 2 (APB3 Clock 100MHz)
D2 APB1 Prescaler = 2 (APB1 Clock 100MHz)
D2 APB2 Prescaler = 2 (APB2 Clock 100MHz)
D3 APB4 Prescaler = 2 (APB4 Clock 100MHz)
因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = APB1 x 2 = 200MHz;
因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = APB2 x 2 = 200MHz;
APB4上面的TIMxCLK没有分频,所以就是100MHz;
APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14,LPTIM1
APB2 定时器有 TIM1, TIM8 , TIM15, TIM16,TIM17
APB4 定时器有 LPTIM2,LPTIM3,LPTIM4,LPTIM5
----------------------------------------------------------------------- */
if ((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM15) || (TIMx == TIM16) || (TIMx == TIM17))
{
/* APB2 定时器时钟 = 200M */
uiTIMxCLK = SystemCoreClock / 2;
}
else
{
/* APB1 定时器 = 200M */
uiTIMxCLK = SystemCoreClock / 2;
}
usPrescaler = uiTIMxCLK / 1000000 - 1; /* 分频比 = 1 */
if (TIMx == TIM2 || TIMx == TIM5)
{
usPeriod = 0xFFFFFFFF;
}
else
{
usPeriod = 0xFFFF;
}
/*
设置分频为usPrescaler后,那么定时器计数器计1次就是1us
而参数usPeriod的值是决定了最大计数:
usPeriod = 0xFFFF 表示最大0xFFFF微秒。
usPeriod = 0xFFFFFFFF 表示最大0xFFFFFFFF微秒。
*/
TimHandle.Instance = TIMx;
TimHandle.Init.Prescaler = usPrescaler;
TimHandle.Init.Period = usPeriod;
TimHandle.Init.ClockDivision = 0;
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
TimHandle.Init.RepetitionCounter = 0;
TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
{
Error_Handler(__FILE__, __LINE__);
}
/* 配置定时器中断,给CC捕获比较中断使用 */
{
HAL_NVIC_SetPriority(TIM_HARD_IRQn, 0, 2);
HAL_NVIC_EnableIRQ(TIM_HARD_IRQn);
}
/* 启动定时器 */
HAL_TIM_Base_Start(&TimHandle);
}
我最近在学习H7定时器的单词计时的内容,我看到 TimHandle.Init.Prescaler = usPrescaler; 这个分频系数是32,时钟频率应该是200MHz,记一次应该是0.16us。但注释上写的是1us,是我哪里没有注意到吗?
感谢你的帮助!
|
|