打印
[STM32F0]

STM32f051R8滴答定时器systick不能定在1us么?

[复制链接]
4191|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Eurekaseven|  楼主 | 2014-3-30 15:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用滴答定时让灯隔1s闪烁,ms级可以实现 但是试了下us级 就没有现象了
定在us级后 主函数里先运行Systick_Init()再运行LED初始化(默认灯开)灯也不亮了 定在ms级别灯是可以亮的,也可是延时闪烁,百思不得其解啊。。。
初始化函数里,SystemCoreClock/1000可以定在ms级 但是改成SystemCoreClock/1000000就无法实现,请教一下是硬件原因达不到么?还是软件还要设置什么?最多可以实现SystemCoreClock/500000
void Systick_Init(void)
{
        if(SysTick_Config(SystemCoreClock/1000))
        {
                while(1);
                }
}

static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)   
{
  TimingDelay = nTime;
  while(TimingDelay != 0);
}


void TimingDelay_Decrement(void)
{
        if(TimingDelay!=0x00)
        {
                TimingDelay--;
        }
}
沙发
ar_m_cu| | 2014-3-30 18:49 | 只看该作者
你的系统时钟多大?要想实现微妙级的延时,你的系统时钟必须足够高,不然系统一直在执行SysTick的中断处理函数,根本退不出来

使用特权

评论回复
板凳
ar_m_cu| | 2014-3-30 18:51 | 只看该作者
本帖最后由 ar_m_cu 于 2014-3-30 19:03 编辑

如果你的系统时钟频率低于36MHz,最好不要让Systick 1us 中断一次,不然,系统的大部分时间都在执行中断程序。另外,如果中断间隔过短,SysTick中断处理函数中尽量避免函数嵌套。

使用特权

评论回复
地板
diweo| | 2014-3-30 20:12 | 只看该作者
本帖最后由 diweo 于 2014-3-30 20:54 编辑

最快也就48M,算上3级流水线,基本上是16M,也就是1us最多执行16条指令。你算算中断函数调用的开销是多少条指令。
其次,因为中断函数调用,流水经常被打断,效率会大大降低。
另外,常见的操作系统的时钟节拍都是10ms级别的。它们这么做都是有原因的。

使用特权

评论回复
5
airwill| | 2014-3-31 07:18 | 只看该作者
大家分析得有道理, 不过楼上的指令计算太极端了.
应该说大部分指令都是单周期完成的.
另外中断服务进入的时间也要 12 个周期, 还有退出时间呢, 这些都是基本的时间消耗.
由于 static __IO uint32_t TimingDelay;

中断服务里
if (TimingDelay !=0) TimingDelay--;  的效率并不高.

相反, 如果写成:
uint32_t tmr = TimingDelay;
if (tmr !=0)   TimingDelay = --tmr;
会少一次内存装载, 效率高一点

使用特权

评论回复
6
diweo| | 2014-3-31 11:29 | 只看该作者
仔细想想,确实极端了。:Q

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

15

帖子

0

粉丝