MSP430F5529 DriverLib 库函数学习笔记(一)时钟配置和闪烁LED
目录
- 一、新建工程
- 二、时钟树
- 时钟系统结构
- 时钟系统的原理
- 时钟树配置实战
- 三、点灯工程师
- 封装好的初始化函数
平台:Code Composer Studio 10.3.1
MSP430F5529 LaunchPad™ Development Kit
(MSP‑EXP430F5529LP)
一、新建工程
二、时钟树
时钟系统结构
(1)5个时钟来源
时钟系统模块具有5个时钟来源。
① XT1CLK:低频/高频振荡器,可以使用32768Hz的手表晶振、标准晶体、谐振器或4~32MHz的外部时钟源;
② VLOCLK:内部超低功耗低频振荡器,典型频率12kHz;
③ REFOCLK:内部调整低频参考振荡器,典型值为32768Hz;
④ DCOCLK:内部数字时钟振荡器,可由FLL稳定后得到;
⑤ XT2CLK:高频振荡器,可以是标准晶振、谐振器或4~32MHz的外部时钟源。
(2)3个时钟信号
时钟系统模块可以产生3个时钟信号供CPU和外设使用。
① ACLK:辅助时钟(Auxiliary Clock)。可以通过软件选择XT1CLK、REFOCLK、VLOCLK、DCOCLK、DCOCLKDIV或XT2CLK(当XT2CLK可用时)。DCOCLKDIV是FLL模块内DCOCLK经过1/2/4/8/16/32分频后获得的。ACLK主要用于低速外设。ACLK可以再进行1/2/4/8/16/32分频,ACLK/n 就是ACLK 经过1/2/4/8/16/32分频后得到的,也可以通过外部引脚进行输出。
② MCLK:主时钟(Master Clock)。MCLK的时钟来源与ACLK相同,MCLK专门供CPU使用,MCLK配置得越高,CPU的执行速度就越快,功耗就越高。一旦关闭MCLK,CPU也将停止工作,因此在超低功耗系统中可以通过间歇启用MCLK的方法降低系统功耗。MCLK也可经1/2/4/8/16/32分频后供CPU使用。
③ SMCLK:子系统时钟(Subsystem Master Clock)。SMCLK的时钟来源与ACLK相同,SMCLK主要用于高速外设,SMCLK也可以再进行1/2/4/8/16/32分频。
时钟系统的原理
(1)内部超低功耗低频振荡器(VLO)
内部超低功耗低频振荡器在无须外部晶振的情况下,可提供12kHz的典型频率。VLO为不需要精确时钟基准的系统提供了一个低成本、超低功耗的时钟源。当VLO被用作ACLK、MCLK或SMCLK时(SELA={1}、SELM={1}或SELS={1}),VLO被启用。
(2)内部调整低频参考时钟振荡器(REFO)
在不要求或不允许使用晶振的应用中,REFO可以用作高精度时钟。经过内部调整,REFO的典型频率为32768Hz,并且可以为FLL模块提供一个稳定的参考时钟源。REFOCLK与FLL的组合,在无须外部晶振的情况下,提供了灵活的大范围系统时钟。当不使用REFO时,REFO不消耗电能。
(3)XT1振荡器(XT1)
如图所示。MSP430单片机的每种器件都支持XT1振荡器,MSP430F5xx/6xx系列单片机的XT1振荡器支持两种模式:LF(低频模式)和HF(高频模式)。
(4)XT2振荡器(XT2)
如图所示,XT2振荡器用来产生高频的时钟信号XT2CLK,其工作特性与XT1振荡器工作在高频模式相似,晶振的选择范围为4 ~32MHz,具体范围由XT2DRIVE控制位进行设置。高频时钟信号XT2CLK可以分别作为辅助时钟ACLK、主时钟MCLK和子系统时钟SMCLK的基准时钟信号,也可提供给锁频环模块(FLL),可以利用XT2OFF控制位实现对XT2模块的启用(0)和关闭(1)。
(5)锁频环(FLL)
如图所示,FLL的参考时钟FLLREFCLK可以来自于XT1CLK、REFOCLK或XT2CLK中的任何一个时钟源,通过SELREF控制位进行选择。由于这3种时钟的精确度都很高,倍频后仍然能够得到准确的频率。FLL能够产生两种时钟信号:DCOCLK和DCOCLKDIV,其中DCOCLKDIV信号为DCOCLK时钟经1/2/4/8/16/32分频后得到(分频系数为D)。
锁频环是一种非常巧妙的电路,它的核心部件是数控振荡器和一个频率积分器。数控振荡器能够产生DCOCLK时钟,频率计数器实际上是一个加减计数器,“+”输入端上的每个脉冲将使计数值加1,“-”输入端上的每个脉冲将使计数值减1。FLLREFCLK经过1/2/4/8/12/16分频后输入频率积分器的“+”输入端(分频系数为n),DCOCLKDIV经过(N+1)分频后输入频率积分器的“-”输入端,频率积分器的运算结果又输出给数控振荡器,改变数控振荡器的输出频率DCOCLK,构成反馈环。经过反馈调整,最终的结果使频率积分器的“+”输入端的频率与“-”输入端的频率相同,即
所以,数控振荡器的最终输出频率为
其中,D由3位FLLD控制位确定,取值为1,2,4,8,16,32;
N由10位FLLN控制位确定,取值范围为1~1023;
n由3位FLLREFDIV控制位确定,取值为1,2,4,8,12,16。
(6)内部模块振荡器(MODOSC)
如图所示,UCS时钟模块还包含一个内部模块振荡器MODOSC,能够产生约4.8MHz的MODCLK时钟。Flash控制器模块、ADC_12模块等片内外设都可使用MODCLK作为内部参考时钟。
为了降低功耗,当不需要使用MODOSC时,可将其关闭。当产生有条件或无条件启用请求时,MODOSC可自动开启。设置MODOSCREQEN控制位,将允许有条件启用请求使用MODOSC模块。对于利用无条件启用请求的模块无须置位MODOSCREQEN控制位,例如Flash控制器、ADC_12等。
(7)时钟模块失效及安全操作
MSP430单片机的时钟模块包含检测XT1、XT2和DCO振荡器故障失效的功能。振荡器故障失效检测逻辑如图所示。
晶振故障失效条件有以下4种。
① XT1LFOFFG:XT1振荡器在低频模式(LF)下失效;
② XT1HFOFFG:XT1振荡器在高频模式(HF)下失效;
③ XT2OFFG:XT2振荡器失效;
④ DCOFFG:DCO振荡器失效。
时钟树配置实战
这里我打算将MCLK、SMCLK配置为25MHz,它们的时钟源设为倍频后的DCOCLK,FLL时钟源设为XT2CLK。
由原理图可知,XT2输入引脚为P5.2、P5.3
复用P5.2、P5.3
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);
根据自己的开发板,选择合适的参数启用XT2
MSP430F5529 LaunchPad™ Development Kit 板载XT2晶振为CSTCR4M00G15L99,4MHz
UCS_turnOnXT2 (UCS_XT2_DRIVE_4MHZ_8MHZ);
MSP430为了省电默认状态下核心电压默认设置为1.8V来节省功耗,高频工作需要较高的核心电压,本次实验不需要低功耗模式,故我们直接将核心电压设为最高级。
PMM_setVCore(PMM_CORE_LEVEL_3);
UCS_initClockSignal用于设置各时钟的时钟源和分频系数。
UCS_initFLLSettle用于设置锁相环倍频系数。
故将XT2的4MHz经8分频进入锁相环,再倍频50倍后即可得到25MHz的DCOCLK
(4MHz经4分频再倍频24倍、25倍只能得到24MHz,26倍得到26MHz,我暂且蒙在鼓里)
最后将MCLK、SMCLK的时钟源选为DCOCLK
UCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);UCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);UCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);
综上,最后将MCLK和SMCLK通过P7.7、P2.2复用输出
#include "driverlib.h"int main(void)
{WDT_A_hold(WDT_A_BASE);GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);UCS_turnOnXT2 (UCS_XT2_DRIVE_4MHZ_8MHZ);PMM_setVCore(PMM_CORE_LEVEL_3);UCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);UCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);UCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN2); //SMCLK OutputGPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7, GPIO_PIN7); //MCLK Outputwhile(1){}
}
测得对应时钟已升至25MHz
三、点灯工程师
如原理图所示,P4.7控制LED2,高电平点亮
在程序中加入
#define MCLK_IN_HZ 25000000#define delay_us(x) __delay_cycles((MCLK_IN_HZ/1000000*(x)))
#define delay_ms(x) __delay_cycles((MCLK_IN_HZ/1000*(x)))
将P4.7设为输出模式
GPIO_setAsOutputPin(GPIO_PORT_P4, GPIO_PIN7);while(1){GPIO_toggleOutputOnPin (GPIO_PORT_P4, GPIO_PIN7);delay_ms(500);}
即可观察到LED2以1Hz的频率闪烁
封装好的初始化函数
void SystemClock_Init(void)
{PMM_setVCore(PMM_CORE_LEVEL_3); //高主频工作需要较高的核心电压//XT1引脚复用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN4);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN5);//起振XT1UCS_turnOnLFXT1(UCS_XT1_DRIVE_3,UCS_XCAP_3);//XT2引脚复用GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5, GPIO_PIN2);GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P5, GPIO_PIN3);//起振XT2UCS_turnOnXT2(UCS_XT2_DRIVE_4MHZ_8MHZ);//XT2作为FLL参考时钟,先8分频,再50倍频 4MHz / 8 * 50 = 25MHzUCS_initClockSignal(UCS_FLLREF, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_8);UCS_initFLLSettle(25000, 50);//XT1作为ACLK时钟源 = 32768HzUCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作为MCLK时钟源 = 25MHzUCS_initClockSignal(UCS_MCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//DCOCLK作为SMCLK时钟源 = 25MHzUCS_initClockSignal(UCS_SMCLK, UCS_DCOCLK_SELECT, UCS_CLOCK_DIVIDER_1);//设置外部时钟源的频率,使得在调用UCS_getMCLK, UCS_getSMCLK 或 UCS_getACLK时可得到正确值UCS_setExternalClockSource(32768, 4000000);
}
MSP430F5529 DriverLib 库函数学习笔记(一)时钟配置和闪烁LED相关推荐
- MSP430F5529 DriverLib 库函数学习笔记(十六)比较器B Comp_B
目录 硬知识 比较器B介绍 比较器 B 的特点 比较器 B 的结构 模拟输入部分 比较部分 基准电压部分 低通滤波部分 比较器和普通运放的区别 比较器B测量电阻原理 利用比较器B实现电容触摸按键原理 ...
- MSP430F5529 DriverLib 库函数学习笔记(十四)看门狗定时器 (WDT)
目录 硬知识 看门狗定时计数器 (WDTCNT) 看门狗模式 定时计数模式 看门狗定时器中断 时钟故障保护功能 低功耗模式下的看门狗操作 看门狗定时器控制寄存器 WDT_A API (机翻) 参数 上 ...
- MSP430F5529 DriverLib 库函数学习笔记(十二)I2C实战
目录 上机实战 I2C给 DAC 芯片 DAC7571 写入数字量 DAC7571 介绍 程序分析 引脚复用 I2C 初始化 发送一个字节 发送一个字 读取一个字节 读取多个字节 中断服务函数 整体代 ...
- MSP430F5529 DriverLib 库函数学习笔记(八)模数转换模块(ADC12)
目录 硬知识 模数转换概述 MSP430单片机ADC12模块介绍 MSP430单片机ADC12模块操作 ADC12的转换模式 采样和转换 转换存储器 使用片内集成温度传感器 ADC12模块寄存器 AD ...
- MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波
目录 1.通过Timer_A_outputPWM配置产生PWM波 初始化函数 计算 修改占空比的函数 整体程序 效果 2.单定时器产生多路PWM信号 初始化函数 实验结果 3.对称PWM信号的产生 初 ...
- MSP430F5529 DriverLib 库函数学习笔记(五)定时器A
目录 硬知识 定时器A 16位定时器原理 (1)时钟源选择和分频器 (2)Timer_A工作模式 (3)捕获/比较模块 (4)Timer_A中断(重要) 定时器A API (机翻) 定时器A配置和控制 ...
- MSP430F5529 DriverLib 库函数学习笔记(四)UART通信
目录 硬知识 USCI通信模块 USCI的UART模式 1. USCI初始化和复位 2. 异步通信字符格式 3. 异步多机通信模式 4. 自动波特率检测 5. IrDA编码和解码 6. 自动错误检测 ...
- MSP430F5529 DriverLib 库函数学习笔记(十三)认识低功耗模式
目录 硬知识 低功耗模式 MSP430单片机各工作模式下的电流消耗 API 进入低功耗模式 退出低功耗模式 平台:Code Composer Studio 10.3.1 MSP430F5529 Lau ...
- MSP430F5529 DriverLib 库函数学习笔记(十)SPI驱动墨水屏
目录 上机实战 SPI 驱动 墨水屏 墨水屏介绍 电子纸的分类 电泳型电子纸技术详解 原理 结构 优势与不足 实验电路介绍 程序分析 引脚初始化 SPI模块初始化 发送和接收 全部源代码 main.c ...
最新文章
- 不懂这几个问题就落后了:Python、Android开发者必读!
- NodeJS入门--环境搭建 IntelliJ IDEA
- C++中的转换构造函数和类型转换函数
- SQL 基础正则表达式(二十三)
- 全球及中国天然香豆素行业竞争态势与投资份额调研报告2022版
- 系统开发小结【未完待续】
- MyBatis 解决了什么问题?
- 重启手机出现机器人加一个叹号_印度科幻脑洞高能!《宝莱坞机器人2.0》内地定档...
- 大疆aeb连拍_大疆 AIR2 玩机(一)包围曝光及后期处理
- PostgreSQL DELETE 大表性能 explain 测试
- 积分简明笔记-第一类曲线积分的类型
- 她每天吃一个煮熟的苹果,从此打开了通往新世界的大门~
- CUDA 下载不了(只有 42B)的应急解决办法(暂时可用)
- 移动硬盘提示“需要格式化”
- 微信小程序实现授权登录及退出
- LM2596电路中,肖特基二极管得作用!
- 定时关机软件里的锁定计算机,怎么让电脑定时关机设置大全
- 玉米社:百度SEM竞价推广策略有哪些?
- 香港电动方程式大赛3月开跑 体验区可模拟中环驾车
- Ubuntu系统入门