ARM Cortex-M架构中有一个位于核内的标准系统节拍时钟(Systick)。系统节拍时钟的寄存器地址由ARM标准规定,在所有芯片中都是相同的。开发者可通过ARM CMISIS库标准函数进行配置。相对于芯片自身提供的计时器,使用系统节拍时钟的优势在于其初始化和中断函数程序可以运行在任何ARM Cortex-M核的芯片上。而芯片计时器的初始化和中断函数只适用于特定芯片,在进行程序移植时需要重新研读芯片数据手册编写程序。
系统节拍时钟配置
系统节拍时钟是一个倒数计时器。系统节拍时钟的SYST_RVR寄存器用来设置倒数计时器的初始值。硬件首先会将SYST_RVR中的初始值装载进SYST_CVR寄存器中。在每个时钟上升或者下降沿,SYST_CVR寄存器值会减1。倒数到0后芯片自动将SYST_RVR寄存器值重新装载到SYST_CVR寄存器中重新开始倒计时。在倒数到0时,系统节拍时钟还、会将SYST_CSR寄存器中的COUNTFLAG位置1。如果在SYST_CSR寄存器中设置了TICKINT位,同时还会触发SysTick中断。SysTick中断位于ARM Cortex-M定义的16个中断位中,在所有芯片上具有相同的中断号。
配置SysTick时钟比较直接,这是ARM架构通用的。
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
HAL_StatusTypeDef status = HAL_OK;
/* Check uwTickFreq for MisraC 2012 (even if uwTickFreq is a enum type that doesn't take the value zero)*/
if ((uint32_t)uwTickFreq != 0U)
{
/*Configure the SysTick to have interrupt in 1ms time basis*/
if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / (uint32_t)uwTickFreq)) == 0U)
{
/* Configure the SysTick IRQ priority */
if (TickPriority < (1UL << __NVIC_PRIO_BITS))
{
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
uwTickPrio = TickPriority;
}
else
{
status = HAL_ERROR;
}
}
else
{
status = HAL_ERROR;
}
}
else
{
status = HAL_ERROR;
}
/* Return function status */
return status;
}
初始化LED9与LED10
int32_t BSP_LED_Init(Led_TypeDef Led)
{
int32_t status = BSP_ERROR_NONE;
GPIO_InitTypeDef GPIO_Init;
/* Enable the GPIO_LED Clock */
if (Led == LED9)
{
LED9_GPIO_CLK_ENABLE();
}
else /* Led = LED10 */
{
/* Enable VddIO2 for GPIOG */
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWREx_EnableVddIO2();
LED10_GPIO_CLK_ENABLE();
}
/* configure the GPIO_LED pin */
GPIO_Init.Pin = LED_PIN[Led];
GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init.Pull = GPIO_PULLUP;
GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(LED_PORT[Led], &GPIO_Init);
HAL_GPIO_WritePin(LED_PORT[Led], LED_PIN[Led], GPIO_PIN_SET);
return status;
}
修改循环间隔500ms,小灯交替闪烁。
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/* Toggle LED9 */
BSP_LED_Toggle(LED9);
/* Insert 50 ms delay */
HAL_Delay(500);
/* Toggle LED10 */
BSP_LED_Toggle(LED10);
/* Insert 100 ms delay */
HAL_Delay(500);
}
下载验证:
|