wenyangzeng 发表于 2019-1-8 16:39
让CUBEMX自动生成即可:
CubeMX不会写US延时,一直不敢用
安 发表于 2019-1-8 17:22
楼主先确定一下SetSysClock配置是否成功。
这个要怎么确定呢??指点下
本帖最后由 wenyangzeng 于 2019-1-8 18:51 编辑
select326 发表于 2019-1-8 18:10
CubeMX不会写US延时,一直不敢用
1毫秒用HAL_Delay(1);
微秒级用__nop();
wenyangzeng 发表于 2019-1-8 18:50
1毫秒用HAL_Delay(1);
微秒级用__nop();
用了CubeMX后,确实能解决时钟配置的问题。一个NOP 延时是多少US呀?
另外,如果 想要超频,这在CubeMX是无法实现的吧?
就按1个机器周期算就行。先算机器周期时间,延时需要多少个机器周期。
本帖最后由 select326 于 2019-1-9 09:40 编辑
安 发表于 2019-1-9 08:12
就按1个机器周期算就行。先算机器周期时间,延时需要多少个机器周期。
我查了下资料,说是一个nop 的时间就是: 1/系统时钟
照这样计算,STM32F030K6 配置时钟48M,一个nop 就是1/48000000
1秒=1000MS = 1000000 us
想要延时1US,就需要执行 48次 nop
这样计算对吗?
但是,nop 本身也是函数调用,会不会占用系统周期?或者说,这个在编译时就解决了,?
在比较大的计时中可以忽略,但是越小越需要考虑代码所执行的周期。比如FOR循环执行需要多少个机器周期。
FOR和NOP延时用在要求不高的地方还可以,如果要求高一点还是用SYSTICK和TIMER来延时比较好。还有就是下次换个频率的芯片,FOR和NOP又要重新调试。
这个迁时肯定是要精确的,不是大约。这个NOP 方案只怕还是不行。还是得考虑下使用HAL库 如何做US延时
我最近也遇到了这个类似的问题,不过我是使用的LL库,使用CubeMx生成的,使用的额内部晶振,主要造成这个的原因是生成的代码里面有一个内部晶振校准的代码,屏蔽掉就好了,我是用的stm32L051的代码。你可以看看是不是有可能是相同的问题。