Nucleo-F411RE (STM32F411)LL库体验 3 - 滴嗒定时器的配置
1、LL库延时
LL库初始化时钟的时候调用了LL_Init1msTick(100000000)函数,这个函数其实就是初始化了系统的滴答定时器。
LL_InitTick原型如下:
load值 = sysclk/1000,即计时1ms需要100000个数。
CTRL clksource = 1,不分频,systick的频率为100M。
2、添加自己的延时函数
注释掉 LL_Init1msTick函数,初始化滴答定时器为中断模式,设置load = 100000,即1ms进入中断函数一次。
#include "systick.h"
#include "main.h"
volatile static uint32_t delay;
uint32_t BOARD_Systick_Init(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;
return (0); /* Function successful */
}
void BOARD_Delay1Ms(uint32_t count)
{
delay = count;
while(0U != delay){
}
}
void BOARD_Delay_Decrement(void)
{
if (0U != delay){
delay--;
}
}
中断处理函数:
在初始化时钟的地方初始化滴答定时器。
调用延时函数:
3、软件延时函数
比如时钟为100M,延时1us需要100个__NOP();
那么可以简单写延时函数如下:
/* Software delay millisecond. */
void APP_SoftwareDelay_Ms(uint32_t ms)
{
for (uint32_t i = 0u; i < ms; i++)
{
for (uint32_t j = 0u; j < (SystemCoreClock / 1000u); j++)
{
__NOP();
}
}
}
void APP_SoftwareDelay_Us(uint32_t us)
{
for (uint32_t j = 0u; j < (SystemCoreClock / 1000000u); j++)
{
__NOP();
}
}