如何配置按钮以更改计时器的周期。 按下按钮一次、将 Timer A 切换延迟更改为1秒。 再次按下此按钮可将 Timer A 切换延迟更改为2秒。 最后、第三次按下按钮会将计时器 A 切换延迟改回半秒延迟。 其他按钮按压操作应循环显示此顺序。 当系统未切换指示灯或按下处理按钮时、它应处于低功耗模式。
我尝试了以下代码、但我的循环不起作用。 它仅呈红色闪烁。 并且不会切换计时器 LED 的其余部分
我的代码:-
/*-版权所有-、BSD_EX
*版权所有(c) 2013、德州仪器(TI)公司
*保留所有权利。
*
*以源代码和二进制形式重新分发和使用、有无
*如果满足以下条件、则允许进行修改
符合*:
*
**源代码的重新分发必须保留上述版权
*注意、此条件列表和以下免责声明。
*
**二进制形式的再发行必须复制上述版权
*请注意、中的此条件列表和以下免责声明
*随分发提供的文档和/或其他材料。
*
**德州仪器公司的名称和名称均不相同
*其贡献者可用于认可或推广衍生产品
*未经特定的事先书面许可。
*
*本软件由版权所有者和贡献者"按原样"提供
*以及任何明示或暗示的保证、包括但不限于:
*特定适销性和适用性的隐含保证
*不承认目的。 在任何情况下、版权所有者不得或
*派遣国应对任何直接、间接、偶然、特殊、
*典型或必然的损害(包括但不限于
*采购替代货物或服务;丧失使用、数据或利润;
*或业务中断)、无论原因是什么以及任何责任理论、
*无论是合同、严格责任还是侵权行为(包括疏忽或)
*否则)因使用本软件而以任何方式产生、
*即使被告知可能会发生此类损坏。
*
秘书长的报告
*
* MSP432代码示例免责声明
*
* MSP432代码示例是通常包含的低级程序
*高度演示单个外设功能或器件功能
*简明扼要。 为此、代码可能依赖于器件的加电默认值
*寄存器值和设置、如时钟配置和注意
*在组合多个示例中的代码时应采取这种方法、以避免潜在的问题
*效果。 另请参阅 www.ti.com/.../mspdriverlib 以了解 API 功能
*库和 https://dev.ti.com/pinmux/ 、用于 GUI 外设配置方法。
*
*--/版权--*/
//
// MSP432P401演示-使用 LPM0在低频模式下使用 TimerA
//
//
//说明:将器件配置为使用 TimerA 在低频 LPM0中运行
//运行并由低频时钟源供源。 本示例将进行构建
//在 msp432p401_PCM_05上运行、该操作将转换到 LF 工作模式
//从活动模式(LDO)。
//
//注意:此示例中的代码假定器件当前处于 LDO 模式
// AM0_LDO 或 AM1_LDO (使用 LDO 的有源模式、分别为 VCORE=0/1)
//
//从 DCDC 模式转换到 LF 需要通过中间转换
// LDO 模式。 有关更多信息、请参阅器件用户中的 PCM 章节
//指南。
//
// AM1_DCDC <-- > AM1_LDO <-@-> AM1_LF
//^
//|
//|
// v
// AM0_DCDC <-- > AM0_LDO*<-@-> AM0_LF
//^
//|
//|
// v
// LPM0_LF
//*:复位后的电源状态条件
//@:此代码示例中演示的转换
//
// MSP432P401x
//------------
///|\||
//|||
//-|RST |
//| P1.0|--> LED
//||
//
// William Goh
// Texas Instruments Inc.
// 2016年6月(更新)| 2013年11月(创建)
//使用 CCSv6.1、IAR、Keil、GCC 构建
//
#include "ti/devices/msp432p4xx/inc/msp.h"
#include
void 错误(void);
int main (空)
{
uint32_t currentPowerState;
WDT_A->CTL = WDT_A_CTL_PW |//停止 WDT
WDT_A_CTL_HOLD;
//终止器件上所有剩余的引脚
P1->DIR |= 0xFF;P1->OUT = 0;
P2->DIR |= 0xFF;P2->OUT = 0;
P3->DIR |= 0xFF;P3->OUT = 0;
P4->DIR |= 0xFF;P4->OUT = 0;
P5->DIR |= 0xFF;P5->OUT = 0;
P6->DIR |= 0xFF;P6->OUT = 0;
P7->DIR |= 0xFF;P7->OUT = 0;
P8->DIR |= 0xFF;P8->OUT = 0;
P9->DIR |= 0xFF;P9->OUT = 0;
P10->DIR |= 0xFF;P10->OUT = 0;
PJ->DIR |= 0xFF;PJ->OUT = 0;
CS->KEY = CS_KEY_VAL;//解锁 CS 模块
//将 MCLK、SMCLK、ACLK 拉低至 REFO 时钟
//首先进行低频操作
CS->CTL1 = CS_CTL1_SELM_2|
CS_CTL1_SELS _2 |
CS_CTL1_SERA_2;
CS->KEY = 0;//锁定 CS 模块
//获取当前电源状态
currentPowerState = PCM->CTL0 & PCM_CTL0_CPM_MASK;
//正确地从当前 LDO 电源状态转换到低频模式
开关(电流电源状态)
{
案例 PCM_CTL0_CPM_0:// AM0_LDO、需要切换到 AM0_Low Frequency Mode
while (((PCM->CTL1 & PCM_CTL1_PMR_BUSY));
PCM->CTL0 = PCM_CTL0_KEY_VAL | PCM_CTL0_AMR_8;
while (((PCM->CTL1 & PCM_CTL1_PMR_BUSY));
IF (PCM->IFG & PCM_IFG_AM_INVALID_TR_IFG)
error();//如果转换不成功则出错
中断;
案例 PCM_CTL0_CPM_1:// AM1_LDO、需要切换到 AM1_Low Frequency Mode
while (((PCM->CTL1 & PCM_CTL1_PMR_BUSY));
PCM->CTL0 = PCM_CTL0_KEY_VAL | PCM_CTL0_AMR_9;
while (((PCM->CTL1 & PCM_CTL1_PMR_BUSY));
IF (PCM->IFG & PCM_IFG_AM_INVALID_TR_IFG)
error();//如果转换不成功则出错
中断;
案例 PCM_CTL0_CPM_8://器件已处于 AM0_Low Frequency 模式
中断;
案例 PCM_CTL0_CPM_9://器件已处于 AM1_Low Frequency 模式
中断;
默认值://设备处于某种其他状态,这是意外的
error();
}
//将 TimerA 配置为关闭 SMCLK = REFO
Timer_A0->CCTL[0]= TIMER_A_CCTLN_CCIE;//启用捕捉比较中断
Timer_A0->CCR[0]= 1000;
Timer_A0->CTL = TIMER_A_CTL_ssel_SMCLK |// SMCLK
Timer_A_CTL_MC__Continuous;//连续模式
//在 NVIC 上启用 TimerA3_cC0中断
NVIC->ISER[0]= 1 <<(TA0_0_IRQn)& 31);
//启用全局中断
__ENABLE_IRQ();
SCB->SCR |= SCB_SCR_SLEEPONEXIT_MSK;//不会在退出 ISR 时唤醒
//确保 SLEEPONEXIT 掩码已设置。
_DSB();
//转到 LPM3
PCM_gotoLPM3 ();
}
// TimerA3_0中断服务例程处理程序
void TA0_0_IRQHandler (void)
{
int 计数器= 0;
if (((P1IN & 0x02)=0)
{
if (counter=0)
{
P2->OUT ^= BIT1;//切换 P1.0 LED
Timer_A0->CCTL[0]&&~ Timer_A_CCTLN_CCIFG;
Timer_A0->CCR[0]+=256000;
计数器= 1;
}
否则、如果(counter=1)
{
P2->OUT ^= BIT2;//切换 P1.0 LED
Timer_A0->CCTL[0]&&~ Timer_A_CCTLN_CCIFG;
Timer_A0->CCR[0]+=128000;
计数器= 2;
}
否则、如果(counter=2)
{
P2->OUT ^= BIT3;//切换 P1.0 LED
Timer_A0->CCTL[0]&&~ Timer_A_CCTLN_CCIFG;
Timer_A0->CCR[0]+=64000;
计数器=0;
}
}
}
空错误(空)
{
volatile uint32_t i;
while (1)
{
P2->OUT ^= BIT1;
对于(I = 0;I < 20000;I++);//一直闪烁 LED
}
}