主题中讨论的其他器件: MSP430WARE
我得到了 MSP430FR5969代码、我对该微控制器非常陌生。 我想知道我必须编辑哪些参数以及要编辑哪些参数、以便我可以将此示例从60秒或以上唤醒、而不是更改为2秒的设置。
源代码
/*-版权-, BSD_EX
*版权所有(c) 2012、德州仪器(TI)公司
保留所有权利。
*
*以源代码和二进制形式重新分发和使用,有或没有
*修改,在以下条件允许的条件下
*满足:
*
**源代码的重新分发必须保留以上版权
*请注意,本条件清单和以下免责声明。
*
**二进制形式的再分发必须复制上述版权
*通知,本条件清单和下述免责声明在
*与分发一起提供的文档和/或其他材料。
*
**德州仪器公司名称或公司名称
*其贡献者可用于认可或推广派生的产品
*从本软件未经事先书面许可。
*
*本软件由版权持有者和贡献者"按原样"提供
本站明确声明不作出任何种类的所有明示或暗示的保证,包括但不限于关于适销性、适用于
*对特定产品的适销性和适用性的暗示保证
*免责声明。 在任何情况下,版权所有者或
*贡献者对任何直接、间接、偶然、特殊、
*示例性或后果性损害(包括但不限于:
*替代产品或服务的采购;使用、数据或利润的损失;
*或业务中断)然而造成和任何责任理论,
*无论是合同,严格的责任,或侵权(包括疏忽或
*其他)因使用本软件而产生的任何原因、
*即使被告知此类损害的可能性。
*
*
*
* msp430代码示例免责声明
*
* MSP430代码示例是自包含的低级程序、通常
*以高度优化的方式演示单个外设功能或设备特性
*简洁的方式。 为此、代码可依赖于器件的加电默认值
*寄存器的值和设置,如时钟配置和小心必须
*在合并来自几个示例的代码时采取,以避免潜在的侧
*效果。 有关 GUI、另请参阅 www.ti.com/grace 和 www.ti.com/msp430ware
*针对外设配置的 API 函数库方法。
*
*-/版权-*/
//*****
// MSP430FR59xx 演示- LPM3.5中的 RTC_B 具有2秒的唤醒间隔
//
//说明:RTC_B 模块处于带有计数器中断的计数器模式
//每2秒触发一次。 然后、器件将进入 LPM3.5、等待
// RT1PSIFG 中断。 从 LPMx.5唤醒后、器件将恢复
//基于 ledState 变量计算 P1.0 LED 的先前状态。 然后、它将切换
//电路板上的 P1.0 LED 并将 LED 状态存储到 FRAM 存储器中。
//这是一个很好的示例,展示了如何在开始
//进入 LPMx.5并在唤醒时恢复 GPIO 状态。
// P4.6用作检测信号,表明设备正在唤醒
//从 BOR 复位或 LPMx.5中加电。
//
// ACLK = 32.768kHz、MCLK = SMCLK = DCO =~1MHz
//
// MSP430FR59xx
//-------------------------------------------------------
///|\| xin|-
//|||| 32kHz
//--|RST XOUT|-
//|
//| P1.0|--> LED
//| P4.6|-->探头输出/LED
//
//高建
//德州仪器公司
// 2013年1月
//通过 Code Composer Studio v5.5和 Embedded Workbench v5.60构建
//*****
#包含
void initboard(void);
void initRtc (void);
void WakeUpLPM35 (void);
//将 LED 的状态存储在 FRAM 中,其中此变量
//在启动期间不会用 C 语言初始化。 这允许
///可轻松恢复和管理的某些变量
//存储在非易失性存储器中,无需闪存电荷泵。
//这样可以缩短启动时间。
#if defined (__TI_Compiler_version__)
#pragma persistent(ledState);
unsigned char ledState = 0;
#Elif Defined (__IAR_systems_ICC__)
_persistent unsigned char ledState;
#else
//对于其他编译器,将此变量插入 FRAM 存储器
unsigned char ledState;
#endif
int main (空)
{
WDTCTL = WDTPW | WDTHOLD;//停止 WDT
//初始化板
initBoard();// GPIO 和 CS 的常规初始化代码
//确定是来自 LPMx.5还是常规复位。
如果(SYSRSTIV = SYSRSTIV_LPM5WU)
{
//在从 LPM3.5唤醒时,重新
WakeUpLPM35 ();// LPMx.5唤醒特定的初始化代码
_enable_interrupt ();// RTC 中断应立即触发...
}
否则
{
ledState = 0;//初始化 LED 状态变量
P1OUT = 0x00;//初始化 P1OUT 为零
initRtc ();// RTC_B 的常规初始化代码
}
//使用 P4.6 LED 作为心跳,表示设备已重新启动,或者
//从 LPMx.5或完全加电
P4OUT |= BIT6;
//使用计时器 A 短暂延迟,使 P1.0 LED 闪烁
TA0CCTL0 = CCIE;// TACCR0中断被启用
TA0CCR0 = 1000;
TA0CTL = TASSEL__ACLK | MC__UP;// SMCLK、向上计数模式
__ bis_SR_register (LPM3_bits | GIE);
TA0CTL &=~(MC__UP);//停止计时器
P4OUT &=~BIT6;//清除 P4.6 LED
//按顺序进入 LPM3.5。
PMMCTL0_H = PMMPW_H;//打开 PMM 寄存器以进行写入
PMMCTL0_L |= PMMREGOFF;//并设置 PMMREGOFF
//使能中断后进入 LPM3.5模式。 请注意、该运算确实
//不返回。 LPM3.5将通过一个复位事件退出、这会导致一个
//重新启动代码。
__ bis_SR_register (LPM3_bits | GIE);
___ no_operation();
返回1;
}
void initBoard (void)
{
//端口配置
//从变量复位之前恢复 P1.0 LED 状态
//存储在 FRAM 中
P1OUT = ledState;
P1DIR = 0xFF;
P2OUT = 0x00;
P2DIR = 0xFF;
P3OUT = 0x00;
P3DIR = 0xFF;
P4OUT = 0x00;
P4DIR = 0xFF;
PJOUT = 0x00;
PJSEL0 |= BIT4 | BIT5;
PJDIR = 0xFFFF;
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~μ A LOCKLPM5;
//设置时钟
CSCTL0_H = CSKEY >> 8;//解锁 CS 寄存器
CSCTL1 = DCOFSEL_0;//将 DCO 设置为1MHz
CSCTL2 = SELAM_0 | SELS_3 | SELM_3;//设置 ACLK = XT1;MCLK = DCO
CSCTL3 = DIIVA_0 | DIVS_0 | DIVM_0;//将所有分频器设置为1
CSCTL4 &&~LFXTOFF;//启用 LFXT1
正确
{
CSCTL5 &=~LFXTOFFG;//清除 XT1故障标志
SFRIFG1 &=~OFIFG;
}while (SFRIFG1和 OFIFG);//测试振荡器故障标志
CSCTL0_H = 0;//锁定 CS 寄存器
}
void initRtc (void)
{
//配置 RTC_B
//配置 BCD 模式,停止 RTC,然后启用 RTC
RTCCTL01 = RTCBCD | RTCHOLD | RTCTEV_0;
//将 RTC 第二级分频器设置为256
//每2秒发生一次 RTC 中断
RTCPS1CTL = RT1IP_7 | RT1PSIE;
//启动 RTC 日历模式
RTCCTL01 &=~μ H RTCHOLD;
}
空 WakeUpLPM35 (空)
{
// Re 配置/启动
//配置 BCD 模式,停止 RTC,然后启用 RTC
RTCCTL01 |= RTCBCD | RTCHOLD | RTCTEV_0;
//将 RTC 第二级分频器设置为256
//每2秒发生一次 RTC 中断
RTCPS1CTL = RT1IP_7 | RT1PSIE;
//启动 RTC 日历模式
RTCCTL01 &=~μ H RTCHOLD;
}
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector=RTC_vector
__interrupt void RTC_ISR (void)
#Elif 已定义(_ GNU _)
void __attribute__((interrupt (RTC_vector))) RTC_ISR (void)
#else
#错误编译器不受支持!
#endif
{
开关(__even_in_range (RTCIV、RTCIV_RTCOFIFG))
{
案例 RTCIV_NONE:中止;
案例 RTCIV_RTCRDYIFG:中断;
案例 RTCIV_RTCTEVIFG:中断;
案例 RTCIV_RTCAIFG:中断;
案例 RTCIV_RT0PSIFG:中断;
情形 RTCIV_RT1PSIFG:
//切换 P1.0上的 LED
P1OUT ^= BIT0;
//将 P1.0输出状态存储到变量中
ledState =(P1OUT & BIT0);
中断;
案例 RTCIV_RTCOFIFG:中止;
}
}
//计时器 A0中断服务例程
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector=TIMER0_A0_vector
__interrupt void Timer_A (void)
#Elif 已定义(_ GNU _)
void __attribute__((interrupt (TIMER0_A0_vector)) Timer_A (void)
#else
#错误编译器不受支持!
#endif
{
__ bic_SR_register_on_exit (LPM4_bits);
}
谢谢!
此致、
普赫拉吉·辛格