关于PIC32延时程序的问题

2019-03-25 18:47发布

各位大神老师好:
请教一个问题。据说PIC32单片机的延时,据说可以用内核定时器进行延时。延时1ms,可以,但是,如果我延时2us,示波器显示是40us。示波器用的是虚拟示波器。系统时钟是40Mhz
下面的程序,在网上下的,但是不是很理解。哪位大神,帮忙讲解下。我想延时2us,我应该做,才能达到呢?试了半天,都停留在40us上。



  1. #define SYSCLK_FREQUENCY       40000000     //* 200MHz,修改成你自己的系统时钟
  2. #define PBCLK7_FREQUENCY        SYSCLK_FREQUENCY
  3. #define CORE_TIMER_FREQUENCY        (PBCLK7_FREQUENCY / 2)
  4. #define CORE_TIMER_MILLISECONDS     (CORE_TIMER_FREQUENCY / 100)
  5. #define CORE_TIMER_MICROSECONDS     (CORE_TIMER_FREQUENCY / 10000)

  6. unsigned int __attribute__((nomips16)) ReadCoreTimer(void)
  7. {
  8.     unsigned int timer;

  9.     asm volatile("mfc0   %0, $9" : "=r"(timer));

  10.     return timer;
  11. }

  12. void delay_us(unsigned int delayUs)
  13. {
  14.     unsigned int delayStart;

  15.     delayStart = ReadCoreTimer();
  16.     while ((ReadCoreTimer() - delayStart) < (delayUs * CORE_TIMER_MICROSECONDS));
  17. }

  18. void delay_ms(unsigned int delayUs)
  19. {
  20.     unsigned int delayStart;

  21.     delayStart = ReadCoreTimer();
  22.     while ((ReadCoreTimer() - delayStart) < (delayUs * CORE_TIMER_MILLISECONDS));
  23. }
复制代码

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
cawyai23
1楼-- · 2019-03-27 00:34
 精彩回答 2  元偷偷看……
cawyai23
2楼-- · 2019-03-27 05:05
电子微创意 发表于 2017-10-7 16:07
40MHz需要你自己配置pll。

谢谢指教
配置方面,我自己已经配置好了。
我延时1ms的话,示波器显示在1.02ms,那么,在这个基础上,我在除以1000,理应是1us,结果是40us
ienglgge
3楼-- · 2019-03-27 06:56
cawyai23 发表于 2017-10-8 19:18
谢谢指教
配置方面,我自己已经配置好了。
我延时1ms的话,示波器显示在1.02ms,那么,在这个基础上, ...

你看看手册有没有相关参数设置的说明,你要知道当前配置下,极限是多少。超过极限,就设不出来。
mzb2012
4楼-- · 2019-03-27 08:18
试试一个NOP指令延时多少,如果都比你这个时间大,那就没得玩了,努力倍频,之后还不行的话,那就说明达不到你这个小小延时
电子微创意
5楼-- · 2019-03-27 13:40
cawyai23 发表于 2017-10-8 19:18
谢谢指教
配置方面,我自己已经配置好了。
我延时1ms的话,示波器显示在1.02ms,那么,在这个基础上, ...

四楼正解,内核定时器一个周期增1,40M的话40个指令周期就是1us,但是你的代码可能超出了80个指令,因此计时已经超出了。
电子微创意
6楼-- · 2019-03-27 18:56
这段代码的原理就是读MIPS的协处理器的Count寄存器,然后根据主频来计算延时。

一周热门 更多>