最近在使用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和0b00100000PJDIR = 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频率为1MHzCSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; // 将所有的分频系数设置为1CSCTL4 &= ~LFXTOFF; // 使能LFXT1低频振荡器do{CSCTL5 &= ~LFXTOFFG; // 清除XT1默认标志位,详情参考《User's Guide》P110SFRIFG1 &= ~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闪烁)
}
本文链接:https://my.lmcjl.com/post/10231.html
展开阅读全文
4 评论