文章目录
前言
国民技术N32G45X库函数RTC例程提供了SysTick定时器做延迟,但是只提供了MS延迟,国民技术N32G45X例程之-SysTick定时器做延迟不仅有MS延迟,还有US延迟。10US以上比较精确,最大延迟100MS。
提示:以下是本篇文章正文内容,下面案例可供参考
一、国民技术N32G45X库函数RTC例程提供的SysTick定时器做延迟
/** @addtogroup RTC_Calendar
* @{
*/
/**
* @brief Configure the system tick clock.
*/
uint32_t DBG_SysTick_Config(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 */
}
/**
* @brief Use the system tick clock to delay.
*/
void SysTick_Delay_Ms(__IO uint32_t ms)
{
uint32_t i;
RCC_ClocksType RCC_Clocks;
RCC_GetClocksFreqValue(&RCC_Clocks);
DBG_SysTick_Config(RCC_Clocks.SysclkFreq / 1000);
for (i = 0; i < ms; i++)
{
/* When the value of the counter is reduced to 0, the bit 16 of the CRTL register is set to 1.
When set to 1, the bit will cleared to 0 with read
*/
while (!((SysTick->CTRL) & (1 << 16)));
}
// Disable SysTick timer
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
二、经过改进后的SysTick定时器做延迟
1.SysTick初始化
代码如下(示例):
static u32 fac_us=0;//us延时倍乘数
static u32 fac_ms=0;//ms延时倍乘数
//初始化延迟函数
void delay_init(u32 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8
fac_us=SYSCLK;
fac_ms=fac_us*1000;
}
2.SysTick定时器做延迟1MS,最大延迟100MS
代码如下(示例):
void delay_ms(u32 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL =0X00; //清空计数器
}
2.SysTick定时器做延迟1US
代码如下(示例):
//延时nus
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL =0X00; //清空计数器
}
3.SysTick定时器做延迟1S
代码如下(示例):
//延时s
void delay_s(u32 ns)
{
u32 i,j;
for(i=0;i<10;i++)
{
for(j =0;j<ns;j++)
{
delay_ms(100);
}
}
}
三、程序下载
2.国民技术N32G45X例程之-SysTick定时器做延迟
https://download.csdn.net/download/suqingxiao/69295245