所用单片机型号:MSP432P401r
今日继续更新我的MSP432电赛速通笔记:
提示:
本节内容相当于讲述delay_ms() 和delay_us() 俩延时函数的由来,
所以不需要花费过多时间斟酌
MSP432单片机各部件能在有条不紊地自动工作,实际上是在其系统时钟作用下,由CPU指挥芯片内各个部件自动协调工作,使内部逻辑硬件产生各种操作所需要的脉冲信号而实现的。
MSP432单片机通过软件控制时钟系统可以使其工作在多种模式,
包括6种活动模式 和 5种低功耗模式,
通过这些工作模式,可合理地利用单片机内部资源,从而实现低功耗。
时钟系统是MSP432单片机中非常关键的部件,
通过时钟系统可以在功耗和性能之间寻求最佳的平衡点,
为单芯片系统的超低功耗设计提供了灵活的实现手段。
本文滴答定时器有关配置代码,函数都在空项目例程有包含:可在此处下载:
https://download.csdn.net/download/qq_64257614/87781382?spm=1001.2014.3001.5503
目录
一、时钟框图的介绍:
框图大体介绍:
目录
一、时钟框图的介绍:
框图大体介绍:
内部时钟源和外部时钟源介绍:
二、滴答计时器延时:
三、滴答定时器用法:
一、时钟框图的介绍:
此页来源于技术手册(slau356h.pdf)第380页
框图大体介绍:
1.左边的带有方框的都是MSP432的时钟源
2.梯形圈出的就是选择器
3.紧跟着梯形选择器后面矩形圈出来的就是分频器之类的
4.分频器之后就是时钟了
内部时钟源和外部时钟源介绍:
左上角俩个是外部时钟源:
在上面的LFXTBYPASS是低速晶振
在下面的HFXTBYPASS是高速晶振
他下面的五个就是内部时钟源:
这些 XIN和 XOUT都是外接晶振的引脚:
这些引脚后续会有需要进行配置
1.首先介绍这个 DCO数控时钟源:
默认时钟频率是3Mhz
可以通过程序来改变它的时钟
使用内部电阻时,它的时钟精度不高,可通过外接高精度电阻来提升精度
(下图的DCOR就是这个外接高精度电阻)
有了DCOR,DCO就能超频到64Mhz,但超频可能会发热、耗硬件寿命
(超频到64Mhz,默认最大频率48Mhz的1.3333 " 4/3 " 倍)
2.VLO超低功耗低频时钟源:
它输出时钟的典型频率为9.4kHz。
3.REFO低频时钟源:
有俩个典型的时钟频率 32768Hz 和 128kHz
4.SYSOSC系统振荡器:
输出时钟典型频率为5Mhz,也可作为ADC的时钟源,每秒采样率达到每秒200ksps
以上1~4的时钟源 (在整个图下面的 四个)
这些时钟源都没有分频器,是不可以分频的
5.ACLK辅助时钟:
可以选择低速晶振VLO REFO作为时钟源,
可以给各个外设提供时钟,最大频率为128kHz
6.MCLK主时钟:
配置时六个时钟源都可用,
CPU的滴答定时器就是直接连在这个时钟的
外设也可用这个时钟
7.HSMCLK是子系统时钟:
8.SMCLK是低俗子系统时钟:
7和8接的六个时钟源都是可以用的
9.BCLK是低俗备用时钟:
可选择低俗晶振和REFO作为时钟源。
最大频率被限制在32768Hz
10.最后还有个默认时钟切换: 略~
二、滴答计时器延时:
Systick定时器是24位单调递减定时器,最大重装载值为16777216,
滴答定时器是连接到MCLK的
当MCLK频率为48Mhz时
通过计算得:
(2的24次方再除以48000000),最大延时时长为0.349秒。
滴答定时器可以作为操作OS(操作系统)的节拍定时器,以及 测量时间,等等。
滴答计时器有三个寄存器:
控制和查看状态的寄存器(STCSR);
放重装载值的寄存器 (STRVR);
当前值寄存器 (STCVR);
SysTick滴答定时器,不支持外部时钟源,
因此控制和状态寄存器中的时钟源位
CLKSOURCE位需要写1,
三、滴答定时器用法:
刚才学习了这么多滴答定时器的原理,那他该如何使用呢?
其实它就是提供了俩个 不占用软件延时的延时函数,以及后续学习的定时器中断
延时函数使用十分简单,
比如我想需要时延100ms,只要写一句:delay_ms(100);即可。
以下贴出 void delay_ms(uint32_t nms) 和void delay_us(uint32_t nus)定义:
//延时nus
//nus为要延时的us数.
//注意nus的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nus<=0xffffff*1000000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对48M条件下,nus<=349525 (349ms)
void delay_us(uint32_t nus)
{
uint32_t temp;
SysTick->LOAD = nus * fac_us; //时间加载
SysTick->VAL = 0x00; //清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开始倒数
do
{
temp = SysTick->CTRL;
} while ((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL = 0X00; //清空计数器
}
//延时nms
void delay_ms(uint32_t nms)
{
while(nms)
{
delay_us(1000);
--nms;
}
}
目前学习进度就只到这,以后有新发现会添加进去。