在线时间954 小时
UID336767
注册时间2011-12-29
NXP金币868
TA的每日心情 | 开心 2018-7-23 21:04 |
---|
签到天数: 103 天 连续签到: 1 天 [LV.6]常住居民II
金牌会员
 
- 积分
- 16849
- 最后登录
- 1970-1-1
|
本帖最后由 lkl0305 于 2017-4-8 12:51 编辑
在CM4内核的systick时钟源可以选择,而且可以设置分频,以降低systick的计数时钟,进而能够定时更长时间。
这一次做个练习,将systick时钟的分频系数改为48后完成之前的功能。
可参见上一帖子:LPC54110学习+Systick中断
在始终配置工具中可以选择时钟及配置分频。
如下图,设置成1MHz时钟,但系统时钟还是48MHz。
更改后的时钟。
可以看到工程生成的时钟配置文件的相关代码。
由于默认的systick配置函数时钟选择是不可分频的。
我们可以重写这个函数,当然也可已调用此函数后再修改。
关闭系统默认的systick函数。
自己重新编写函数,主要是修改时钟源。
调用自己的时钟配置函数。
systick中断函数,和之前的一致。
完整的代码:
- /**
- * This is template for main module created by MCUXpresso Project Generator. Enjoy!
- **/
- #include "board.h"
- #include "pin_mux.h"
- #include "clock_config.h"
- #include "fsl_gpio.h"
- __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 */
- }
- void SysTick_Handler(void) {
- static uint32_t count = 0;
- count++;
- if (count >= 100) {
- count = 0;
- GPIO_TogglePinsOutput(BOARD_INITPINS_LED0_GPIO, BOARD_INITPINS_LED0_PORT, 1U << BOARD_INITPINS_LED0_GPIO_PIN);
- }
- }
- /*!
- * @brief Application entry point.
- */
- int main(void) {
- /* Init board hardware. */
- BOARD_InitBootPins();
- BOARD_InitBootClocks();
- BOARD_InitDebugConsole();
- #ifdef SDK_PRIMARY_CORE
- BOARD_StartSecondaryCore();
- #endif
- /* Add your code here */
- CLOCK_EnableClock(kCLOCK_Gpio0);
-
- gpio_pin_config_t led0Config = {
- kGPIO_DigitalOutput,
- 0,
- };
-
- GPIO_PinInit(BOARD_INITPINS_LED0_GPIO, BOARD_INITPINS_LED0_PORT, BOARD_INITPINS_LED0_GPIO_PIN, &led0Config);
-
- SysTick_Config(MSEC_TO_COUNT(10, CLOCK_GetFreq(kCLOCK_CoreSysClk) / 48));
- for(;;) { /* Infinite loop to avoid leaving the main function */
- __asm("NOP"); /* something to use as a breakpoint stop while looping */
- }
- }
复制代码 再次编译下载,效果如前。
完整的工程文件:
LED0_Toggle_SysTick_Div48_MCUXpressoIDE_Project_cm4.rar
(4.71 MB, 下载次数: 6)
|
|