初学者一枚。。用的德研的F6638开发板,搞ADC搞了一整天了。。问题就是当屏幕和ADC一起用的时候程序容易跑飞复位,最早的情况是中断标志位ADC12IFG0永远是1,读取和软件清除一点用都没有,导致程序在中断里出不来。后来发现单步调试有些时候能出来一出来就跑飞,我写了一个状态机的函数FSM_Select(),函数内部可以很好的运行一返回就复位!!通过测试发现没有用FSM_Select()程序就跑的尚好,一用就各种挂。但是里面的函数都是例程里面的啊??之前用过STm32和TM4从来没遇到过这种情况,大过年的熬了一个通宵了实在想不通。希望有大神能提下宝贵建议吧。。。
//--------------------主程序和中断服务程序------------------------------------------------------//
void main(void)
{
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
Osccon_Initial(); //晶振初始化函数:定义相关晶振参数
Init_LCD_TFT_ILI9325(); //"彩屏LCD_TFT_ILI9325" 初使化: 所有相关资源的初始化
ADC_Wheel_Init();//ADC初始化
MAIN_Display();//菜单显示
_BIS_SR(GIE); // Enter LPM0, Enable interrupts
while (1)
{
_BIS_SR(LPM0);
}
}
//-------------------------------中断服务函数------------------------------------------------//
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
int i;
ADC_Result = ADC12MEM0; //读取ADC并清除中断位(实际上怎么清都清不掉,ADC12IFG0一直是1)
FSM_Select();//状态处理函数
}
//------------------------状态处理函数-------------------------------------------------//
void FSM_Select(void)//(测试应该是这个函数的问题,但是不应该啊??难道是和LCD通信的原因?)
{
switch (FSM_Condition)
{
case FSM_ADC_Wheel_Interrupt:
{
u8 TemptString[String_Size]={0};//建立一个空的字符串
Float_To_String(ADC_Result,TemptString);//浮点数转字符串
LCD_TFT_ShowString(30,90,"fdsgfs",FONT1608,WHITE,RED);//随便在屏幕上打印一些东西,和LCD通信,用的SPI总线
break;
}
default:
break;
}
}//从这里一返回就复位
//----------------------ADC配置--------------------------------------------------------//
void ADC_Wheel_Init(void)
{
P6SEL |= BIT6; // Enable A/D channel
ADC12CTL0 = ADC12ON+ADC12SHT0_15+ADC12MSC ; // Turn on ADC12, set sampling time
// set multiple sample conversion
ADC12CTL1 = ADC12SHP + ADC12CONSEQ_2 + ADC12SSEL_1; // Use sampling timer, set mode ,set clock ACLK
ADC12MCTL0 |= ADC12INCH_0; //change
ADC12IE = ADC12IE0; // Enable ADC12IFG.0
ADC12CTL0 |= ADC12ENC; // Enable conversions
ADC12CTL0 |= ADC12SC; // Start conversion
_EINT(); // Enable all interrupt
}
(其实还有一个问题= =就是用CCS Debug,下载几次板子似乎就脱机了,要重新插拔断电balabala,甚至重复十几次才能把程序下载下去,能有一个解决办法吗?)