请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR2311 如果这是我的错误或 driverlib 的问题、我不确定会发生什么情况、但我无法从 RTC 获得预期的中断速率。 下面的代码为我提供了一个2ms 的中断周期。 如果我执行数学1/0.002 = 500Hz。 500Hz *32000=16MHz。 RTC 模块的时钟似乎不正确。
我还会收到 有关 RTC_clearInterrupt (RTC_BASE、RTC_CLOCKSOURCE_SMCLK)的警告; 即"#70-D 整数转换导致截断"
*编辑: 作为另一个数据点、我将 TimerB 配置为以128Hz 的频率进行中断、并将 ACLK 连接为其 CLK 源。 我已验证它是否按预期以128Hz 的频率运行。
int main (void){
//停止 WDT
WDT_A_HOLD (WDT_A_base);
initClockTo16MHz();
//初始化外设*/
initGPIO();
initRTC();
while (1)
{
}
void initGPIO (void){
//输入为0,输出为1
//将 Px.x 设定为输出方向
P1DIR |= 0b00000000;//输入
P2DIR |= 0b00001011;
P2OUT = 0x00;
PMM_enableTempSensor ();//启用温度传感器
PMM_enableInternalReference();
//选择 P2.0作为 PWM 计时器输出功能
P2SEL0 |= GPIO_PIN0;
P1SEL1 &=~(BIT7); // USCI_A0 UART 操作仅发送
P1SEL0 |= BIT7;
// I2C 引脚
P1SEL0 |= BIT2 | BIT3;
P1SEL1 &=~(BIT2 | BIT3);
//ADC 引脚
P1SEL0 |= BIT0 | BIT1;
P1SEL1 |= BIT0 | BIT1;
/*
*禁用 GPIO 上电默认高阻抗模式以激活
*先前配置的端口设置
*
PMM_unlockLPM5 ();
}
void initClockTo16MHz ()
{
//根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
//在配置时钟系统之前在8MHz 以上运行。
FRCTL0 = FRCTLPW | NWAITS_1;
_bis_SR_register (SCG0);//禁用 FLL
CSCTL3 |= SELREF_REFOCLK;//将 REFO 设置为 FLL 基准源
CSCTL0 = 0; //清除 DCO 和 MOD 寄存器
CSCTL1 &=~(DCORSEL_7); //首先清除 DCO 频率选择位
CSCTL1 |= DCORSEL_5; //设置 DCO = 16MHz
CSCTL2 = FLLD_0 + 487; //设置为 fDCOCLKDIV =(FLLN + 1)*(fFLLREFCLK/n)
// =(487 + 1)*(32.768 kHz/1)
// = 16MHz
_DELAY_CYCLES (3);
_BIC_SR_register (SCG0); //启用 FLL
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1)); // FLL 锁定
CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;
}
// RTC 中断服务例程
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector=RTC_vector
__interrupt RTC_ISR (void)
#Elif defined (__IAR_systems_ICC_)(void
)(void)(void)(n_rtc)(void)(void)(void)
#endif
{
switch (__even_in_range (RTCIV、RTCIV_RTCIF)
){
案例 RTCIV_NONE:中断; //无中断
案例 RTCIV_RTCIF: // RTC 溢出
P2OUT ^= BIT3;
//P2OUT &=~BIT3;
//P2OUT |= BIT3;
中断;
默认值:break;
}
void initrtc()
{
SYSCFG2 |= RTCCKSEL;//配置为使用 ACLK 而不是 SMCLK
RTC_INIT (RTC_BASE、32000、RTC_CLOCKDIVIDER_1);
RTC_clearInterrupt (RTC_BASE、RTC_CLOCKSOURCE_SMCLK);
RTC_enableInterrupt (RTC_BASE、RTC_overflow_interrupt);
RTC_START (RTC_BASE、RTC_CLOCKSOURCE_SMCLK);
}