PIC32延时程序

[复制链接]
gongche 发表于 2020-9-3 22:53 | 显示全部楼层

你可以试试如下方法:
void sys40m_delay_1us(void)
{
    unsigned long t0 = _CP0_GET_COUNT();
    {
        while (_CP0_GET_COUNT() - t0 < (40/2)); // 为了补偿函数进出指令耗费的时间,这里数字需要微调一下去测量是否精确1us
    }   
}
huwr 发表于 2020-9-3 23:01 | 显示全部楼层
如果是确定的2微秒,不需要调整时间,可以用固定个数的_nop
 楼主| ousj 发表于 2020-9-3 23:05 | 显示全部楼层
但在我现在配置的情况下,用这个函数,目前只能停留在5us,其中,我把 “40/2”这个直接改为1。
bqyj 发表于 2020-9-3 23:11 | 显示全部楼层
拟示波器测得的波形是多少
 楼主| ousj 发表于 2020-9-3 23:14 | 显示全部楼层
5us。
 楼主| ousj 发表于 2020-9-3 23:17 | 显示全部楼层
   while (_CP0_GET_COUNT()-t0 < 1);
renyaq 发表于 2020-9-3 23:21 | 显示全部楼层
是不是要把晶振更换一下
 楼主| ousj 发表于 2020-9-3 23:25 | 显示全部楼层
我的晶振用的是8M的。晶振两脚上的电容用的是22pf。
 楼主| ousj 发表于 2020-9-3 23:32 | 显示全部楼层
这个us级别延时,需要随时更改延时时间
xxrs 发表于 2020-9-3 23:37 | 显示全部楼层
先关全局中断,在插入nop空操作,再开全局中断,微调里L面nop个数,应该可以完成实现,还有不要用函数,用宏实现,因为函数调用时间并不可控,每次可能有些差别。
 楼主| ousj 发表于 2020-9-3 23:40 | 显示全部楼层
谢谢大神的指点,但我这个,延时时间是可变的,也许这次是2us,下次就是20us,延时时间不定。
huwr 发表于 2020-9-3 23:44 | 显示全部楼层
频率提高到80MHz去调整
songqian17 发表于 2020-9-3 23:48 | 显示全部楼层
编译优化级别提高一下去测试;
 楼主| ousj 发表于 2020-9-3 23:52 | 显示全部楼层

嗯,那我按大家的说法挨个排查一下,谢谢哈
勇敢的大白菜 发表于 2020-9-7 13:27 | 显示全部楼层
感谢大家的分享,受益匪浅,学习到很多东西,感谢。
嵌入小菜菜 发表于 2020-9-7 13:33 | 显示全部楼层
我想知道PIC32的单片机的主时钟能够跑到多少Mhz,一般你们使用多少的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部