当前位置:首页 > 单片机 > 单片机
[导读] 在设计软件的时候,有的对时序要求比较严格,但是简单的延时函数又不能准确延时---STM32中有一个系统滴答时钟是不错的配置-------第一部分是---向滴答时钟寄存器写初值,也就是要根据系统频率来递减---

在设计软件的时候,有的对时序要求比较严格,但是简单的延时函数又不能准确延时---STM32中有一个系统滴答时钟是不错的配置---

----第一部分是---向滴答时钟寄存器写初值,也就是要根据系统频率来递减----然后为0 则产生中断

void SysTick_Init(uint32_t a) //a-us
{
/* SystemFrequency / 1000 1ms中断一次
* SystemFrequency / 100000 10us中断一次
* SystemFrequency / 1000000 1us中断一次
*/


// if (SysTick_Config(SystemCoreClock / 1000000*a)//写初值----ST3.0.0库版本
if (SysTick_Config(SystemCoreClock / 1000000)*a) //写初值----ST3.5.0库版本
{
while (1); //写初值成功---则进入while死循环-等待滴答时钟的中断到来
}
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk; //如果向滴答时钟写初值失败---则关闭系统滴答时钟
}
----第二部分是---延时函数----
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;//多少个基础节拍
SysTick_Init(1); //1us
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能系统滴答时钟---开始计时

while(TimingDelay!= 0); //定时节拍结束
}

void Delay_ms(__IO u32 nTime)
{
TimingDelay = nTime;//多少个基础节拍
SysTick_Init(1000); //1ms
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能系统滴答时钟---开始计时

while(TimingDelay!= 0); //定时节拍结束
}

---第三部分是---滴答时钟的中断函数---

voidTimingDelay_Decrement(void) //节拍递减---在中断中使用
{
if (TimingDelay != 0x00)
TimingDelay--;
}

void SysTick_Handler(void) //---中断---
{
TimingDelay_Decrement();//进一次中断递减一次
}

---第四部分---主函数---

int main(void)
{
SysTick_Init(); //初始化
Delay_us(10000); // 10000 * 10us = 100ms

}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭