对于 M0 时钟树的总结

要介绍时钟树,首先要知道M0的时钟树长什么样子:(在M0编程手册中有)

M0有4个时钟源,从最左边就可以看到,但是我个人认为2个内部的时钟较为重要,因为一般情况下,都是这2个时钟在支撑我们外设的工作。

RCH(内部高速时钟),和STM32不同,我们的M0是采用内部的16MHZ的时钟,而STM32(C8T6)是采用外部的8MHZ为主时钟,这点是不同的,在SYSCLK_SEL这个寄存器中不会直接选择RCH作为外设的时钟,而是要经过锁相环倍频(如图绿色箭头),将时钟频率弄成72MHZ(和STM32的频率一样),但是这边并不是固定的,有些人把它倍频到144MHZ,也是可以的,只不过在后面的HDIV寄存器和MTDIV寄存器要进行一个分频,最终给到外设的就是72MHZ。

如下图就是先将时钟倍频到144MHZ,再将其分频到72MHZ.(在CLK.C文件中)

如下图是将时钟倍频到72MHZ,后续不做分频

值得指出的是,对于HDIV(APB时钟分频)和MTDIV(电机时钟分频)寄存器来说0代表着1分频,1代表着2分频:

当然,一开始大家有个疑问为什么一定要是72MHZ,按理说的话,时钟频率越高,速度也就越快,这个时候我们需要打开我们的M0芯片手册,

可以看到芯片手册上给到的是72MHZ(MAX),所以最多就只能达到72MHZ,超频很容易把芯片弄坏。

再说说RCL(内部低速时钟),这个时钟我感觉还是很有用的,我们可以看到它引出了2个线路,一个是给我们的看门狗,一个就是给我们的滴答定时器。对于滴答定时器,一些人会有些陌生,在STM32中如果我们没有深入学习,基本是不会在意有这个定时器的,因为在STM32中,定时器的数目较多,大家很习惯的将其中一个定时器来配置成自己需要的中断间隔,自然不会过多关注。其实,很多时候我们的用的DELAY就是通过这个定时器来的(它会先被分频到1MHZ,然后再去用这个1MHZ做计时),用滴答定时器来做delay,有好处也有坏处,优点毫无疑问非常的精准,但是缺点很多人并没有注意到,当我们在一个中断中使用由滴答定时器产生的DELAY,在不调整其中断优先级的情况下,程序一定会死机,大家可以去尝试一下。

至于为什么会死机,我这边说明一下:当我们的程序进入中断时,则程序会执行中断里面的程序,当执行到delay(由滴答定时器产生)时,这时程序会卡在这里等待滴答定时器的中断,但是由于中断的优先级是大于我们滴答定时器的(不做修改情况下),这就导致我们的滴答定时器是根本没有机会产生中断的,所以执行到delay这里就和while1)一样卡死在了这里,值得指出的是,滴答定时器并不是一下子就产生中断的,而是在累加到1000(默认情况下)才产生中断(1MS一次中断)。所以很多时候,我们的程序模板中会给我们一个软件的delay,在我们需要的时候,可以在中断中使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值