之前的寄存器设置文件是用Grace生成的,我与其它例子比对了一下没有问题。
DEBUG的时候,第一次可以运行到nop,继续运行(第二次loop)就卡在while检测忙那里,读寄存器的值,ADC10CTL0的ENC使能的确关掉了,而ADC10BUSY始终是1。
中断处理程序里有一句while(1),没有停在那里过,说明没进过中断。
G2开发板,芯片型号G2553
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.
之前的寄存器设置文件是用Grace生成的,我与其它例子比对了一下没有问题。
DEBUG的时候,第一次可以运行到nop,继续运行(第二次loop)就卡在while检测忙那里,读寄存器的值,ADC10CTL0的ENC使能的确关掉了,而ADC10BUSY始终是1。
中断处理程序里有一句while(1),没有停在那里过,说明没进过中断。
G2开发板,芯片型号G2553
ADC10只有一个数值寄存器ADC10MEM,当多通道多次采样时,为防止采样结果被覆盖,可以利用DTC(data transfer controller),将每次转换的值存到内存中,之前我已经配置存储大小,存储结束产生中断。那个赋值语句就是设置地址的意思,表示存到data地址的内存中。
思路是先关闭ADC10,while语句的意思是等到模块不工作(不忙)再进行下一步,设置地址。然后开启模块,使能中断,进中断之后处理数据。
现在发现进不去中断,设置断点调试发现卡在while那里,也就是说AD一直在工作,我明明让它不使能,为什么还在工作呢。
ADC10只有一个存储转换结果的寄存器ADC10MEM,如果是多通道多次转换模式,转换结果就会被覆盖,要通过DTC(data transfer controller)把结果放到内存里,那个赋值语句就是设置存储地址。每次转换结束,结果放到内存以后,会产生中断。
思路是先停止AD,然后设置存储地址,开启中断,使能AD,等中断产生就处理结果。
现在的问题就是我进不去中断,断点调试后发现我明明关了AD,但转换内核始终工作(在忙)。
Zhengguan,
方便把关于系统初始化,特别是ADC的配置的语句贴出来的。
需要确认一下,你的ADC是否是配置成repeat采样模式,同时相关的ADC中断时候正常开启。
谢谢
adc配置是由grace生成的, 代码如下
void ADC10_graceInit(void)
{
/* USER CODE START (section: ADC10_graceInit_prologue) */
/* User initialization code */
/* USER CODE END (section: ADC10_graceInit_prologue) */
/* disable ADC10 during initialization */
ADC10CTL0 &= ~ENC;
/*
* Control Register 0
*
* ~ADC10SC -- No conversion
* ~ENC -- Disable ADC
* ~ADC10IFG -- Clear ADC interrupt flag
* ADC10IE -- Enable ADC interrupt
* ADC10ON -- Switch On ADC10
* REFON -- Enable ADC reference generator
* REF2_5V -- Set reference voltage generator = 2.5V
* ~MSC -- Disable multiple sample and conversion
* REFBURST -- Reference buffer on only during sample-and-conversion
* ~REFOUT -- Reference output off
* ~ADC10SR -- Reference buffer supports up to ~200 ksps
* ADC10SHT_1 -- 8 x ADC10CLKs
* SREF_1 -- VR+ = VREF+ and VR- = VSS
*
* Note: ~<BIT> indicates that <BIT> has value zero
*/
ADC10CTL0 = ADC10IE | ADC10ON | REFON | REF2_5V | REFBURST | ADC10SHT_1 | SREF_1;
/*
* Control Register 1
*
* ~ADC10BUSY -- No operation is active
* CONSEQ_3 -- Repeat sequence of channels
* ADC10SSEL_3 -- SMCLK
* ADC10DIV_3 -- Divide by 4
* ~ISSH -- Input signal not inverted
* ~ADC10DF -- ADC10 Data Format as binary
* SHS_0 -- ADC10SC
* INCH_7 -- ADC Channel 7
*
* Note: ~<BIT> indicates that <BIT> has value zero
*/
ADC10CTL1 = CONSEQ_3 | ADC10SSEL_3 | ADC10DIV_3 | SHS_0 | INCH_7;
/* Analog (Input) Enable Control Register 0 */
ADC10AE0 = 0xC0;
/* Data Transfer Control Register 1 */
ADC10DTC1 = 8;
/* Data Transfer Start Address */
//ADC10SA = (unsigned int)512;
/* Software delay for REFON to settle */
__delay_cycles(30000);
/* enable ADC10 */
ADC10CTL0 |= ENC;
/* USER CODE START (section: ADC10_graceInit_epilogue) */
/* User code */
/* USER CODE END (section: ADC10_graceInit_epilogue) */
}
Zhengguan,
你的代码有几个小问题:
1. ADC10CTL1设置channel的采样方式有问题,你应该选择repeat signle模式,即CONSEQ_2.因为你的程序里面只选择了一个ADC的channel,选择CONSEQ_3的意义不大。
2.你在初始化里面的最后启动了ADC的enable信号,这样做不合适。因为你在程序里面没有设置好相应的DTC的start buffer 地址,这样启动ADC会有问题。
所以建议你先修改采样模式,然后在初始化程序里面先禁用ADC,直接只在for(;;)程序里面去使能ADC。
谢谢