ARM Cortex-M架构中有一个位于核内的标准系统节拍时钟(Systick)。系统节拍时钟的寄存器地址由ARM标准规定,在所有芯片中都是相同的。开发者可通过ARM CMISIS库标准函数进行配置。相对于芯片自身提供的计时器,使用系统节拍时钟的优势在于其初始化和中断函数程序可以运行在任何ARM Cortex-M核的芯片上。而芯片计时器的初始化和中断函数只适用于特定芯片,在进行程序移植时需要重新研读芯片数据手册编写程序。
MAX-N947为cortex-m33内核,在core_cm33.h中,有systick_config的初始化代码:
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); /* Reload value impossible */ } SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0UL); /* Function successful */ }
【MAXN947的systick配置】
N947的systick的时钟为12M,配置如下:
SysTick_Config(12000000UL);
【使用systick中断实现闪灯】
结合【NXP-MCXN947】1、体验点亮LED灯-电子产品世界论坛 (eepw.com.cn)
在systick中断中实现对RGB灯的闪灯:
void SysTick_Handler(void) { /* Toggle pin connected to LED */ //GPIO_PortToggle(BOARD_LED_GPIO, 1u << BOARD_LED_GPIO_PIN); GPIO_PortToggle(BOARD_LED_RED_GPIO, 1u << BOARD_LED_RED_GPIO_PIN); GPIO_PortToggle(BOARD_LED_BLUE_GPIO, 1u << BOARD_LED_BLUE_GPIO_PIN); GPIO_PortToggle(BOARD_LED_GREEN_GPIO, 1u << BOARD_LED_GREEN_GPIO_PIN); }
【实验效果】
systick配置好后,可以实现简单的定时功能,用处非常多。