This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP432P401R:具有按钮延迟控制的计时器:

Guru**** 2380860 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/990493/msp432p401r-timer-with-button-delay-control

器件型号:MSP432P401R

如何配置按钮以更改计时器的周期。 按下按钮一次、将 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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="482211" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/990493/msp432p401r-timer-with-button-delay-control ]// TimerA3_0中断服务例程处理程序
    void TA0_0_IRQHandler (void)

    int 计数器= 0;[/报价]

    计时器中断服务例程中控制计时器延迟变化的计数器变量具有自动范围、因此每次进入计时器中断处理程序时都会复位为零。 建议:

    1. 定义计数器全局变量
    2. 将计数器定义为  TA0_0_IRQHandler ()中的静态变量

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    计时器正在进入所有循环、但按钮按压操作不起作用。 灯开始自动发光、也不闪烁。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我声明了计数器的静态值如下:-

    void TA0_0_IRQHandler (void)

    静态 int 计数器= 0;

    但是、我的按钮按操作在这里不起作用、并且指示灯不会针对特定时间戳/中断进行切换。 指示灯一个接一个地亮起、但每次按下按钮时不会闪烁相应的中断。  

    我必须 配置一个按钮来更改计时器的周期。 按下按钮一次、将 Timer A 切换延迟更改为1秒。 再次按下此按钮可将 Timer A 切换延迟更改为2秒。 最后、第三次按下按钮会将计时器 A 切换延迟改回半秒延迟。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    那么、什么会使您无法在按下按钮时创建触发的中断? 使用下降沿事件。 跟踪当前计时器值。 在 ISR 中、检查该当前值是多少、并将其设置为列表上的下一个值。