大家好、
我尝试创建一个函数、 通过计时器 B1生成3个时钟、频率如下:
500kHz、600kHz 和700kHz。
在计时器中断中、我切换输出引脚。
我无法创建这些频率。 我在示波器上看到的频率为~200-300kHz。
计时器的时钟是 smclk。
是否可以通过 Msp430fr2355生成此类频率?
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.
大家好、
我尝试创建一个函数、 通过计时器 B1生成3个时钟、频率如下:
500kHz、600kHz 和700kHz。
在计时器中断中、我切换输出引脚。
我无法创建这些频率。 我在示波器上看到的频率为~200-300kHz。
计时器的时钟是 smclk。
是否可以通过 Msp430fr2355生成此类频率?
您好!
我需要同时生成一个时钟。 例如:600kHz。
我在中断中使用 timerB1。 在中断处、我切换输出引脚。
timerB1的源时钟为 SMCLK (DCO 为24MHz)。
我已经定义了 timerB1的以下寄存器:
TB1CTL |= TBCLR;
TB1CTL |= CNTL_0 | TBSSEL_SMCLK | ID_0 | MC_UP;
TB1EX0 = 0;
TB1CCR0 = 0x28;//(24MHz/600kHz = 40 = 0x28)。
TB1CTL |= TBIE; //启用 TB1
TB1CTL &=~TBIFG;//清除 IRQ
我得到的最大频率输出约为200-300kHz。
问题可能是 CPU 没有足够的时钟周期来进入中断和切换输出引脚。 你怎么看?
BR、
Mor。
尊敬的 Mor GE:
假设您使用 SMCLK 作为 timerB 的时钟源、您将需要选择一个可以使用 TBCCRx 计数寄存器之一进行分频的基频、例如本示例中的 TBCCR1。 考虑到1/500kHz = 2us、1/600kHz = 1.67us 和1/700kHz = 1.43us、这是很棘手的问题。
例如、如果 SMCLK 为1MHz、则最小分辨率为1us。 这可能会生成500kHz、但不会生成其他频率。
幸运的是、FR2355可在高达24MHz 的频率下运行、从而为计时器提供更多粒度。 因此、如果您将 SMCLK 设置为24MHz、这将提供1/24MHz 或41.67nS 的计时器分辨率。 当定时器配置为增模式时(定时器从0增到= TB0CCR1)、您可以使用以下 TB0CCR1值。
随附的示例可用于使计时器正常工作。 如果您想要动态切换频率、您应该能够弄清这一点。
提示:请参阅 用户指南中的第14.2.4.2.1节。
e2e.ti.com/.../timerb_5F00_multiple_5F00_freq.c
#include
void initCS (void)
{
FRCTL0 = FRCTLPW | NWAITS_2;
P2SEL1 |= BIT6 | BIT7; // P2.6~P2.7:晶振引脚
操作
{
CSCTL7 &=~(XT1OFFG | DCOFFG); //清除 XT1和 DCO 故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1 & OFIFG); //测试振荡器故障标志
_bis_SR_register (SCG0); //禁用 FLL
CSCTL3 |= SELREF_XT1CLK; //将 XT1设置为 FLL 基准源
CSCTL0 = 0; //清除 DCO 和 MOD 寄存器
CSCTL1 |= DCORSEL_7; //设置 DCO = 24MHz
CSCTL2 = FLLD_0 + 731; // DCOCLKDIV = 24MHz
_DELAY_CYCLES (3);
_BIC_SR_register (SCG0); //启用 FLL
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1)); // FLL 锁定
CSCTL4 = SELMS_DCOCLKDIV | SELA_XT1CLK; //将 XT1 (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
//默认 DCOCLKDIV 为 MCLK 和 SMCLK 源
}
#define FREQ_500K 48.
#define FREQ_600K 40.
#define FREQ_700K 34.
#define FREQ FREQ_600K
int main (空)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT
initCS();
P1DIR |= BIT6;
P1SEL1 |= BIT6; // P1.6/TB0.1输出
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
//计时器将独立于 CPU 切换输出
TB0CCTL1 |= OUTMOD_7;
TB0CCR0 = FREQ;
TB0CCR1 = FREQ >> 1;
TB0CTL = TBSSEL_SMCLK | MC__UP; // SMCLK、UP 模式
// CPU 进入 while 循环
//可以一直休眠或执行其他任务
while (1)
{
_bis_SR_register (LPM0_bits); //通过中断输入 LPM0
__no_operation(); //进行调试
}
}