在学习别的代码中发现,systick中断的SysTick_Handler被改写了,内部时钟源使用的是timer6,并且注释为了1ms,因为也在学习cube mx平台,所以打开了IOC文件进行了尝试怎么配置为TIM6。
根据 HAL库使用定时器作为Systick时钟的方法(67条消息) HAL库使用定时器作为Systick时钟的方法_不吃鱼的猫的博客-CSDN博客_hal systick 高级应用https://blog.csdn.net/laifengyuan1/article/details/107824132?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164447973716780264076028%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164447973716780264076028&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-107824132.first_rank_v2_pc_rank_v29&utm_term=HAL%E5%BA%93%E4%BD%BF%E7%94%A8%E5%AE%9A%E6%97%B6%E5%99%A8%E4%BD%9C%E4%B8%BASystick%E6%97%B6%E9%92%9F%E7%9A%84%E6%96%B9%E6%B3%95&spm=1018.2226.3001.4187 中的介绍,我找到了里面的代码部分,但是不同的固件库版本生成的代码还是有差异的。我用的库版本是STM32Cube_FW_F3_V1.11.2。
这个配置生成的代码部分是
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
RCC_ClkInitTypeDef clkconfig;
uint32_t uwTimclock = 0;
uint32_t uwPrescalerValue = 0;
uint32_t pFLatency;
/*Configure the TIM6 IRQ priority */
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority ,0);
/* Enable the TIM6 global Interrupt */
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
/* Enable TIM6 clock */
__HAL_RCC_TIM6_CLK_ENABLE();
/* Get clock configuration */
HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
/* Compute TIM6 clock */
uwTimclock = 2*HAL_RCC_GetPCLK1Freq();
/* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */
uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);
/* Initialize TIM6 */
htim6.Instance = TIM6;
/* Initialize TIMx peripheral as follow:
+ Period = [(TIM6CLK/1000) - 1]. to have a (1/1000) s time base.
+ Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
+ ClockDivision = 0
+ Counter direction = Up
*/
htim6.Init.Period = (1000000U / 1000U) - 1U;
htim6.Init.Prescaler = uwPrescalerValue;
htim6.Init.ClockDivision = 0;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
if(HAL_TIM_Base_Init(&htim6) == HAL_OK)
{
/* Start the TIM time Base generation in interrupt mode */
return HAL_TIM_Base_Start_IT(&htim6);
}
/* Return function status */
return HAL_ERROR;
}
这个版本下没有对时钟的分频数进行判断,所以还是和更高的版本差别较大。
系统自动设置为了1ms的周期,也是一个比较标准的基时,在中断中可以用做更多的用途。
有个疑问:这样配置systick和用timer6定时一个1ms的基准在使用上有何区别呢?
版权声明:本文为CSDN博主「yangzichen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangzichen/article/details/122861983
在学习别的代码中发现,systick中断的SysTick_Handler被改写了,内部时钟源使用的是timer6,并且注释为了1ms,因为也在学习cube mx平台,所以打开了IOC文件进行了尝试怎么配置为TIM6。
根据 HAL库使用定时器作为Systick时钟的方法(67条消息) HAL库使用定时器作为Systick时钟的方法_不吃鱼的猫的博客-CSDN博客_hal systick 高级应用https://blog.csdn.net/laifengyuan1/article/details/107824132?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164447973716780264076028%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164447973716780264076028&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-107824132.first_rank_v2_pc_rank_v29&utm_term=HAL%E5%BA%93%E4%BD%BF%E7%94%A8%E5%AE%9A%E6%97%B6%E5%99%A8%E4%BD%9C%E4%B8%BASystick%E6%97%B6%E9%92%9F%E7%9A%84%E6%96%B9%E6%B3%95&spm=1018.2226.3001.4187 中的介绍,我找到了里面的代码部分,但是不同的固件库版本生成的代码还是有差异的。我用的库版本是STM32Cube_FW_F3_V1.11.2。
这个配置生成的代码部分是
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
RCC_ClkInitTypeDef clkconfig;
uint32_t uwTimclock = 0;
uint32_t uwPrescalerValue = 0;
uint32_t pFLatency;
/*Configure the TIM6 IRQ priority */
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority ,0);
/* Enable the TIM6 global Interrupt */
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
/* Enable TIM6 clock */
__HAL_RCC_TIM6_CLK_ENABLE();
/* Get clock configuration */
HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
/* Compute TIM6 clock */
uwTimclock = 2*HAL_RCC_GetPCLK1Freq();
/* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */
uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);
/* Initialize TIM6 */
htim6.Instance = TIM6;
/* Initialize TIMx peripheral as follow:
+ Period = [(TIM6CLK/1000) - 1]. to have a (1/1000) s time base.
+ Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
+ ClockDivision = 0
+ Counter direction = Up
*/
htim6.Init.Period = (1000000U / 1000U) - 1U;
htim6.Init.Prescaler = uwPrescalerValue;
htim6.Init.ClockDivision = 0;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
if(HAL_TIM_Base_Init(&htim6) == HAL_OK)
{
/* Start the TIM time Base generation in interrupt mode */
return HAL_TIM_Base_Start_IT(&htim6);
}
/* Return function status */
return HAL_ERROR;
}
这个版本下没有对时钟的分频数进行判断,所以还是和更高的版本差别较大。
系统自动设置为了1ms的周期,也是一个比较标准的基时,在中断中可以用做更多的用途。
有个疑问:这样配置systick和用timer6定时一个1ms的基准在使用上有何区别呢?
版权声明:本文为CSDN博主「yangzichen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangzichen/article/details/122861983
暂无评论