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.
器件型号:CCSTUDIO-C2000
您好!
我正在尝试了解如何对 ADC1进行编程、我是否可以参考任何文档?
我有一些用于初始化的现有示例代码、但当我尝试打印读数值时、它看起来都是0。
void ADC_Init()
{
*(unsigned int*) 0x4E58 = 7;//针对 InitAnalogSystemClock() Advisory 的权变措施
if (((** InitAnalogSystemClock)(ACLKDIV4)| 0x8000)!= 0xA005){
//如果返回值不是0xA005,则模拟子系统未正确初始化
ASM (" ESTOP0");
for (;;);
}
EALLOW;
//初始化模拟子系统并将时钟分频器设置为4分频
while (((** AnalogClockEnable)(AnalogConfig1、ADC1_ENABLE));//启用 ADC 1
while (((** AnalogClockEnable)(AnalogConfig2、ADC2_enable));//启用 ADC 2
(**读取 AnalogClockStatus)(AnalogConfig2);//等待 AnalogClockEnable 函数完成
//在最后一次复位是调试器复位时复位两个 ADC (这不是
//复位 ADC
Adc1Regs.ADCCTL1.bit.reset = 1;
//在调用器件校准之前,等待确保 ADC 不会复位
_asm (" nop");
_asm (" nop");
//校准器件的温度
(**设备校准)();
EDIS;
//Init the ADC
InitAdc1();
//配置 ADC 读数以连续触发(ADCINT1和 ADCINT2之间交替)
EALLOW;
Adc1Regs.ADCCTL2.bit.ADCNONOVERLAP = 1;//启用非重叠模式、即转换和未来采样事件不重叠
Adc1Regs.ADCCTL1.bit.INTPULSEPOS = 0;// ADCINT1在 ADCResults 锁存后跳闸
Adc1Regs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1
Adc1Regs.INTSEL1N2.bit.INT2E = 1;//启用 ADCINT2
Adc1Regs.INTSEL1N2.bit.INT1CONT = 1;//启用 ADCINT1连续模式
Adc1Regs.INTSEL1N2.bit.INT2CONT = 1;//启用 ADCINT2连续模式
Adc1Regs.INTSEL1N2.bit.INT1SEL = 3;//设置 EOC3以触发 ADCINT1触发
Adc1Regs.INTSEL1N2.bit.INT2SEL = 1;//设置 EOC1以触发 ADCINT2触发
Adc1Regs.ADCSOC0CTL.bit.CHSEL = 0;//将 SOC0通道选择设置为 ADC1A0 (EOC0)
Adc1Regs.ADCSOC1CTL.bit.CHSEL = 2;//将 SOC1通道选择设置为 ADC1A2 (EOC1)
Adc1Regs.ADCSOC2CTL.bit.CHSEL = 3;//将 SOC2通道选择设置为 ADC1A3 (EOC2)
Adc1Regs.ADCSOC3CTL.bit.CHSEL = 4;//将 SOC3通道选择设置为 ADC1A4 (EOC3)
Adc1Regs.ADCINTSOCSEL.bit.SOC0 = 2;// ADCINT2触发 SOC0
Adc1Regs.ADCINTSOCSEL1.bit.SOC1 = 2;// ADCINT2触发 SOC1
Adc1Regs.ADCINTSOCSEL1.bit.SOC2 = 1;// ADCINT1触发 SOC2
Adc1Regs.ADCINTSOCSEL1.bit.SOC3 = 1;// ADCINT1触发 SOC3
Adc1Regs.ADCSOC0CTL.bit.ACQPS = 25;//将 SOC0 S/H 窗口设置为26个 ADC 时钟周期(25个 ACQPS 加1)
Adc1Regs.ADCSOC1CTL.bit.ACQPS = 25;//将 SOC1 S/H 窗口设置为26个 ADC 时钟周期(25个 ACQPS 加1)
Adc1Regs.ADCSOC2CTL.bit.ACQPS = 25;//将 SOC2 S/H 窗口设置为26个 ADC 时钟周期(25个 ACQPS 加1)
Adc1Regs.ADCSOC3CTL.bit.ACQPS = 25;//将 SOC3 S/H 窗口设置为26个 ADC 时钟周期(25个 ACQPS 加1)
EDIS;
DELAY_US (5000);
// EALLOW;
// PieVectTable.ADCINT1 =&ADC_ISR;
// EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
//
////在 PIE 中启用 ADCINT1
// PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 INT 1.1
// IER |= M_INT1;//启用 CPU 中断1
//手动启动转换
Adc1Regs.ADCSOCFRC1.bit.SOC0 = 1;//在 SOC0上触发转换
Adc1Regs.ADCSOCFRC1.bit.SOC1 = 1;//在 SOC1上触发转换
Adc1Regs.ADCSOCFRC1.bit.SOC2 = 1;//在 SOC2上触发转换
Adc1Regs.ADCSOCFRC1.bit.SOC3 = 1;//在 SOC3上触发转换
}
嗨、Tommy、
感谢您回来。
我在代码中执行了与 C28_ADC 文件类似的步骤、但我在调用 InitAdc1 ()时发现、我的代码将崩溃、并且从调试模式中看不到任何错误
我必须对该 API 进行注释以使软件运行、但我认为如果没有此 API 调用、ADC 将无法运行、因为我得到的 ADC 值非常小。
代码片段:
//初始化系统控制
InitSysCtrl();
//初始化 GPIO
InitGpio();
Flash_Init();
// InitAdc1();//初始化 ADC1
(笑声)
[引用 user="chenkun chuang"]1. 您能否确认我是否未调用 InitAdc1 ()、ADC 块不应工作、因此我得到较小的值、比如4096中的190?
但情况不一定如此。 如果跳过 InitAdc1()、我会将 ADC 的状态视为未知、而不是禁用。
预期的结果值完全取决于施加到 ADC 引脚上的电压。
[引用 user="chenkun chuang"]2. 我尝试在 InitAdc1()的入口点添加 B.P,但当我从 main 恢复时,我得到下面的错误。
[C28xx_0]{MODULE#22}:第1022行:E_unPluggedInterrupt:已取消插拔的中断已标记:INTR#19
xdc.runtime.Error.raise:终止执行
基本上、我尝试设置断点、但如果我在代码中进行 InitAdc1 () API 调用、我无法设置断点。 [/报价]
这可能与在闪存之外执行相关: processors.wiki.ti.com/.../FAQs
[引用 user="chenkun chuang"]3. 我执行闪存、我想、因为在我的 M3代码中、我确实有这个
/*闪存 API 函数必须从 RAM 内存中运行。 如果闪存 API 已经存在
*在 RAM 中、则可以跳过此步骤。
*
*不要从闪存运行闪存 API。 *
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
但是、我在 C28中使用了 API、我是否还需要在 C28代码中使用此 API?
C28和 M3在代码库和程序执行方面完全独立、因此您还需要 C28的 memcpy。
[引用 user="chenkun chuang"]4. 至于 RAM 构建、我不确定如何将其配置为 RAM 构建。 我不想为我的发展增加更多的复杂度。 如果这是一个易于配置的步骤、您能告诉我如何操作吗?
如果您使用的是 controlSUITE 中的示例工程、则可以通过以下方式更改编译目标:右键单击工程或转至 Project 菜单>> Build Configurations >> Set Active >> RAM
嗨、Tommy、
我尝试了一些实验、很高兴其中一些问题得到了解决。
1.你能确认我是否没有调用 InitAdc1(),ADC 块不应该工作,所以我得到较小的值,比如4096中的190个?
但情况不一定如此。 如果跳过 InitAdc1()、我会将 ADC 的状态视为未知、而不是禁用。
预期的结果值完全取决于施加到 ADC 引脚上的电压。
[Chenkun]在我的实验中,我需要调用这个 initAdc1();否则,ADC 值为4095而不发生变化。
2.我尝试在 InitAdc1()的入口点添加 B.P,但当我从 main 恢复时,我得到下面的错误。
这可能与在闪存之外执行相关: processors.wiki.ti.com/.../FAQs
[Chenkun]我发现我不能再回到下一个 B.P. 相反、我必须"步入"、以便能够识别 PC 出错的位置。
解决方案是为该延迟 API 添加 RAM 函数、如前所述。 按照以下步骤解决该问题。
1.将 F28M36x_usDelay.asm 复制到在另一个文件中调用此 API 的同一文件夹中。
2.添加 memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);在 C28的 init 函数中。
感谢你的帮助。