最近在使用MSP430系列做低功耗无线传感器网络设计,之前没学过MSP430,网上教程又比较少,搞了个MSP430FR5969 LaunchPad回来研究,抱着用户指南和数据手册和固件库源文件外加ChatGPT啃了半天才把每一句代码搞明白什么意思,其实和STM32没有太大的区别,主要还得靠用户指南和固件库的释义,全英文的看着太难受了但是看中文版又会有很大歧义,慢慢啃吧,后面还会更新LPM.x的其他官方例程详解,取决于我啃手册的进度......
例程和释义如下(建议结合用户手册和固件库源码查看,用户手册真的很详细)
//******************************************************************************
// MSP430FR59xx Demo - 进入LPM0模式(设置ACLK = LFXT, MCLK = 1MHz)
//
// 描述: 配置ACLK = LFXT并进入LPM0模式.
//
// 注意: 在FET板上: MSP-TS430RGZ48C是一种开发板,它可以控制LED灯的亮暗状态
// 当LED灯被打开时,它可以显示高功率数值
// 如果您想测量电流,请拆下LED跳线JP9
// 因为在LED跳线没有连接的情况下,可以通过其他方法将电流传感器与开发板连接起来,从而能够精确地测量电流
// ACLK = LFXT, MCLK = SMCLK = 1MHz
// 辅助时钟 = 低频晶体振荡器,将LFXT晶体振荡器作为ACLK的源,ACLK的时钟频率将等于LFXT晶体振荡器的频率
// 主时钟 = 子系统时钟 = 1MHz,MCLK和SMCLK都将以1MHz的速度运行,从而实现对整个系统时序的精确控制和同步
//
// MSP430FR5969
// ---------------
// /|\| XIN|-
// | | | 32KHz 晶振
// --|RST XOUT|-
// | |
// | |
// | P1.0 |---> Disconnect JP9 for power meas.
//
// Built with IAR Embedded Workbench V5.30 & Code Composer Studio V5.5
//******************************************************************************
#include <msp430.h>
int main(void)
{
// 初始化WDT定时器,并启用WDT中断,以便在定时时间到达时触发LED的闪烁
/* 参考自《User's Guide》P641 & msp430fr5969.h
* WDTCTL->看门狗定时器控制寄存器的名称
* WDTPW->看门狗定时器控制寄存器WDTCTL的密码
* WDTTMSEL->选择定时器模式或看门狗模式,此处WDTTMSEL被设置为1,即选择了定时器模式
* WDTSSEL_1->选择看门狗定时器的时钟源,此处WDTSSEL_1被设置为1,即选择了ACLK作为看门狗定时器的时钟源
* WDTIS_5->看门狗定时器的时钟源分频为2^15(1s at 32.768kHz) */
WDTCTL = WDTPW | WDTTMSEL | WDTSSEL_1 | WDTIS_5;
/* 参考自《User's Guide》P73 & msp430fr5969.h
* SFRIE1->SFR寄存器,用于控制设备的中断使能
* 按位或运算符"|="->可以将一个操作数的特定位设置为1而不影响其他位
* WDTIE->将SFRIE1寄存器的第0位设置为1,以开启看门狗定时器中断 */
SFRIE1 |= WDTIE;
// 配置GPIO
/* 参考自《User's Guide》P368
* 配置了所有8个GPIO端口(P1-P4和PJ)的输出模式,使它们都可以用来控制外部设备 */
P1OUT = 0;
P1DIR = 0xFF;
P2OUT = 0;
P2DIR = 0xFF;
P3OUT = 0;
P3DIR = 0xFF;
P4OUT = 0;
P4DIR = 0xFF;
PJOUT = 0;
PJSEL0 = BIT4 | BIT5;// BIT4和BIT5是两个常量,它们的二进制值分别为0b00010000和0b00100000
PJDIR = 0xFFFF;
/* 设置PJ4和PJ5口的功能为外部晶振XT1(PJ.4->LFXOUT - PJ.5->LFIN)的输入端口->line10&line12
* */
// 关闭GPIO上电默认高阻抗模式激活
// 之前配置的端口
/* 参考自《User's Guide》P92 & msp430fr5969.h
* PM5CTL0->控制低功耗模式的寄存器 - PMM寄存器 - 电源管理模块
* LOCKLPM5->(0x0001)->进入/退出LPM5时锁定I/O引脚配置 */
PM5CTL0 &= ~LOCKLPM5;
/* CS->Clock System->时钟系统
* 参考自《User's Guide》P104 & msp430fr5969.h
* CSCTL0->CS控制寄存器0 - CSCTL0-0_H->CS控制寄存器0的高八位 - CSKEY->CS寄存器解锁密码
* CSCTL1->CS控制寄存器1 - DCOFSEL_0->DCO频率选择:0
* CSCTL2->CS控制寄存器2 - SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK->详情参考《User's Guide》P106
* CSCTL3->CS控制寄存器3 - DIVA__1 | DIVS__1 | DIVM__1->详情参考《User's Guide》P107
* CSCTL4->CS控制寄存器4 - LFXTOFF->低频振荡器(LFXT)禁用 */
CSCTL0_H = CSKEY >> 8; // 解锁CS寄存器
CSCTL1 = DCOFSEL_0; // 设置DCO频率为1MHz
CSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; // 将所有的分频系数设置为1
CSCTL4 &= ~LFXTOFF; // 使能LFXT1低频振荡器
do
{
CSCTL5 &= ~LFXTOFFG; // 清除XT1默认标志位,详情参考《User's Guide》P110
SFRIFG1 &= ~OFIFG; // SFRIFG1->中断标志位寄存器,详情参考《User's Guide》P74
}while (SFRIFG1&OFIFG); // 测试振荡器故障标志位 - OFIFG->振荡器故障中断标志
CSCTL0_H = 0; // CS寄存器上锁
P1DIR |= BIT0; // 打开LED BIT0->0000 0000 0000 0001
/* SR->Status Register->状态寄存器->参考自《User's Guide》P118
* __bis_SR_register->宏定义,用于设置SR寄存器的值
* LPM0_bits->LPM0低功耗模式
* GIE->general Interrupt Enable->全局中断使能标志位,决定是否允许处理器响应中断请求,GIE=1->正常响应中断;GIE=0->忽略任何中断请求 */
__bis_SR_register(LPM0_bits | GIE);
__no_operation(); // 内置的空操作函数,在程序运行时不执行任何操作,但保持CPU处于活动状态,不会进入低功耗模式
}
// 看门狗定时器中断服务程序
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)// 如果是TI或IAR的编译器,则编译下一段代码,否则跳到#else
#pragma vector=WDT_VECTOR// TI和IAR编译器特有的指令,指定了WDT_VECTOR中断向量,表示定义的函数为WDT中断服务程序
__interrupt void WDT_ISR(void)// 中断服务程序的函数声明
#elif defined(__GNUC__)// 如果编译器为GCC,则编译下一段代码
void __attribute__ ((interrupt(WDT_VECTOR))) WDT_ISR (void)
#else
#error Compiler not supported!// 如果编译器不支持TI、IAR和GCC中的任何一种,则产生编译错误
#endif
{
P1OUT ^= 0x01; // P1.0翻转状态(LED1闪烁)
}
因篇幅问题不能全部显示,请点此查看更多更全内容