尊敬的*
我们需要测量:
1)带引脚切换的 MCLK (在引脚 P2.2上)(该引脚连接到示波器),但我们得到错误的频率,输入时钟为24MHz,引脚切换仅为3MHz,并具有以下代码
#include
#include
void init_CS();
void CS_BypassXT1_HF ();
uint16_t ADC_val = 0;
void main (void){
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
P2SEL0 &=~(BIT2); //选择 P2.2作为 I/O 功能
P2SEL1 &=~(BIT2); //选择 P2.2作为 I/O 功能
P2DIR |= BIT2; //将 P2.2配置为输出方向引脚
P2OUT |= BIT2; //将 P2.2初始值配置为高电平
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P2、
GPIO_PIN7、
GPIO_secondary 模块功能
);
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P1、
GPIO_PIN6、
GPIO_ternary_module_function
);
//将 P3.7设置为输出方向| LED1
GPIO_setAsOutputPin (
GPIO_PORT_P3、
GPIO_PIN7
);
GPIO_setOutputLowOnPin (
GPIO_PORT_P3、
GPIO_PIN7
);
//将 P3.6设置为输出方向| LED2
GPIO_setAsOutputPin (
GPIO_PORT_P3、
GPIO_PIN6
);
GPIO_setOutputLowOnPin (
GPIO_PORT_P3、
GPIO_PIN6
);
// P2.6上的输出 MCLK
GPIO_setPeripheralModuleFunctionOutputPin (
GPIO_PORT_P2、
GPIO_PIN6、
GPIO_PRIMARY_MODULE_FUNCTION
);
// P1.0上的输出 SMCLK
GPIO_setPeripheralModuleFunctionOutputPin (
GPIO_PORT_P1、
GPIO_PIN0、
GPIO_secondary 模块功能
);
PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
init_CS();
ADCCTL0 &=~ADCSHT; //清除 ADCCTL0中的 ADCSHT
ADCCTL0 |= ADCSHT_0; //将 S&H 设置为4个 ADCCLK 周期
//ADCCTL0 |= ADCSHT_1; //将 S&H 设置为8个 ADCCLK 周期
//ADCCTL0 |= ADCSHT_2; //将 S&H 设置为16个 ADCCLK 周期
ADCCTL1 |= ADCSHP_1 | ADCDIV_1 | ADCSSEL_3; // SAMPCON 信号来源于采样定时器| SMCLK/2 | SMCLK 源
ADCCTL2 &=~ADCRES; //清除 ADCCTL2中的 ADCRES
ADCCTL2 |= ADCRES_1; //设置10位
ADCMCTL0 |= ADCINCH_6;
ADCCTL0 |= ADCON | ADCENC;
while (1)
{
P2OUT = 0x04;
P2OUT = 0x00;
/*
ADCCTL0 |= ADCSC;
//P2OUT ^= BIT2;
while (!(ADCIFG & ADCIFG0));
P2OUT ^= BIT2;
*/
}
}
void init_CS()
{
//将 MCLK 设置为24MHz
cs_initClockSignal (
CS_MCLK、
CS_XT1CLK_SELECT、
CS_CLOCK 分频器_1
);
//将 SMCLK 设置为12MHz
cs_initClockSignal (
CS_SMCLK、
CS_XT1CLK_SELECT、
cs_clock_divider
);
//将 ACLK 设置为31.25kHz
cs_initClockSignal (
CS_ACLK、
CS_XT1CLK_SELECT、
cs_clock_divider
);
//初始化外部 HF CLK
CS_BypassXT1_HF ();
}
void CS_BypassXT1_HF ()
{
//启用 HF 模式
HWREG16 (CS_BASE + OFS_CSCTL6)|= XTS;
//关闭 XT1振荡器并启用旁路模式
HWREG16 (CS_BASE + OFS_CSCTL6)|=(XT1BYPASS | XT1AUTOOFF);
while (HWREG8 (CS_BASE + OFS_CSCTL7)&(XT1OFFG)){
//清除 OSC 故障标志
HWREG8 (CS_BASE + OFS_CSCTL7)&=~(XT1OFFG);
//清除全局故障标志。 如果 XT1导致全局故障
//标志要进行设置,这将清除全局错误条件。 如果有的话
//错误条件仍然存在,全局标志将再次出现。
HWREG8 (SFR_BASE + OFS_SFRIFG1)&&~OFIFG;
}
}
2)另外、测量完整 ADC 转换(采样保持、转换、稳定)的正确方法是什么?
我们使用10位 ADC、在12MHz SMCLK 频率下为6MHz、并将 S&H 设置为4 ADC 周期= 4/6 + 12/6 + 100ns = 2.76us、我们使用以下带 TOGGLE 引脚的代码测量3.3us
#include
#include
void init_CS();
void CS_BypassXT1_HF ();
uint16_t ADC_val = 0;
void main (void){
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
P2SEL0 &=~(BIT2); //选择 P2.2作为 I/O 功能
P2SEL1 &=~(BIT2); //选择 P2.2作为 I/O 功能
P2DIR |= BIT2; //将 P2.2配置为输出方向引脚
P2OUT |= BIT2; //将 P2.2初始值配置为高电平
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P2、
GPIO_PIN7、
GPIO_secondary 模块功能
);
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P1、
GPIO_PIN6、
GPIO_ternary_module_function
);
//将 P3.7设置为输出方向| LED1
GPIO_setAsOutputPin (
GPIO_PORT_P3、
GPIO_PIN7
);
GPIO_setOutputLowOnPin (
GPIO_PORT_P3、
GPIO_PIN7
);
//将 P3.6设置为输出方向| LED2
GPIO_setAsOutputPin (
GPIO_PORT_P3、
GPIO_PIN6
);
GPIO_setOutputLowOnPin (
GPIO_PORT_P3、
GPIO_PIN6
);
// P2.6上的输出 MCLK
GPIO_setPeripheralModuleFunctionOutputPin (
GPIO_PORT_P2、
GPIO_PIN6、
GPIO_PRIMARY_MODULE_FUNCTION
);
// P1.0上的输出 SMCLK
GPIO_setPeripheralModuleFunctionOutputPin (
GPIO_PORT_P1、
GPIO_PIN0、
GPIO_secondary 模块功能
);
PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
init_CS();
ADCCTL0 &=~ADCSHT; //清除 ADCCTL0中的 ADCSHT
ADCCTL0 |= ADCSHT_0; //将 S&H 设置为4个 ADCCLK 周期
//ADCCTL0 |= ADCSHT_1; //将 S&H 设置为8个 ADCCLK 周期
//ADCCTL0 |= ADCSHT_2; //将 S&H 设置为16个 ADCCLK 周期
ADCCTL1 |= ADCSHP_1 | ADCDIV_1 | ADCSSEL_3; // SAMPCON 信号来源于采样定时器| SMCLK/2 | SMCLK 源
ADCCTL2 &=~ADCRES; //清除 ADCCTL2中的 ADCRES
ADCCTL2 |= ADCRES_1; //设置10位
ADCMCTL0 |= ADCINCH_6;
ADCCTL0 |= ADCON | ADCENC;
while (1)
{
ADCCTL0 |= ADCSC;
P2OUT ^= BIT2;
while (!(ADCIFG & ADCIFG0));
P2OUT ^= BIT2;
}
}
void init_CS()
{
//将 MCLK 设置为24MHz
cs_initClockSignal (
CS_MCLK、
CS_XT1CLK_SELECT、
CS_CLOCK 分频器_1
);
//将 SMCLK 设置为12MHz
cs_initClockSignal (
CS_SMCLK、
CS_XT1CLK_SELECT、
cs_clock_divider
);
//将 ACLK 设置为31.25kHz
cs_initClockSignal (
CS_ACLK、
CS_XT1CLK_SELECT、
cs_clock_divider
);
//初始化外部 HF CLK
CS_BypassXT1_HF ();
}
void CS_BypassXT1_HF ()
{
//启用 HF 模式
HWREG16 (CS_BASE + OFS_CSCTL6)|= XTS;
//关闭 XT1振荡器并启用旁路模式
HWREG16 (CS_BASE + OFS_CSCTL6)|=(XT1BYPASS | XT1AUTOOFF);
while (HWREG8 (CS_BASE + OFS_CSCTL7)&(XT1OFFG)){
//清除 OSC 故障标志
HWREG8 (CS_BASE + OFS_CSCTL7)&=~(XT1OFFG);
//清除全局故障标志。 如果 XT1导致全局故障
//标志要进行设置,这将清除全局错误条件。 如果有的话
//错误条件仍然存在,全局标志将再次出现。
HWREG8 (SFR_BASE + OFS_SFRIFG1)&&~OFIFG;
}
}
此致、
David。