历史上的今天
今天是:2024年08月26日(星期一)
2021年08月26日 | STM32 SysTick 精准延时 简单分析
2021-08-26 来源:eefocus
在设计软件的时候,有的对时序要求比较严格,但是简单的延时函数又不能准确延时---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); //定时节拍结束
}
---第三部分是---滴答时钟的中断函数---
void TimingDelay_Decrement(void) //节拍递减---在中断中使用
{
if (TimingDelay != 0x00)
TimingDelay--;
}
void SysTick_Handler(void) //---中断---
{
TimingDelay_Decrement(); //进一次中断递减一次
}
---第四部分---主函数---
int main(void)
{
SysTick_Init(); //初始化
Delay_us(10000); // 10000 * 10us = 100ms
}
史海拾趣
|
我现在做.net开发,如果从事单片机或嵌入式开发,学哪个有比较好点?需要多长时间可以上手!用什么平台最好! 各位朋友,本人计算机应届生.我现在做.net开发, 不过我想问下如果从事单片机,需要多长时间可以上手?… 查看全部问答> |
|
小弟初用STM32F103 64管脚的ADC功能 参考Example1中 使用DMA传输转换后的数据 通过PC.01(Channel11)进行采集来自外部AD键盘的电压 键盘的电压在未接PC.01时,一切正常!但是一旦接了PC.01后 就不正常了,变得非线性;但是ADC仍然可以采样电 ...… 查看全部问答> |
|
【团购】ALIENTEK 战舰STM32F103ZET6开发板+2.8液晶 团购价格:前10名购买者418元。 第11至20名购买者428元。 第21之后购买者448元。 注:本款开发板的淘 ...… 查看全部问答> |
|
这个帖子仅仅是一个idea,不代表逻辑分析仪最终的实现思路。希望大家提出宝贵建议。 既然要做逻辑分析仪,就会涉及到硬件设计,在坛子里大多数坛友都是都是抱着学习,分享的心态的。 做一个假设,我们逻辑分析仪直接设计成一块板子。 大家在上面 ...… 查看全部问答> |




