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.
我的芯片为MSP5438A,主频为内部时钟25M,应用的外设为Timer,UART,AD,现在的问题就是如果用32.768K主频,程序运行良好,但是如果用25M,程序会跑飞,我的数组的定义都用了__no_init 定义,而且查看寄存器的话,没有出现看门狗复位,内核电压我也抬升到了level 3 ,我的Clk, Timer,UART,AD的配置如下:
void UCS_Init(void)
{
unsigned int N_FLL=0;
UCSCTL3 |= SELREF_2; // Set DCO FLL reference = REFO 32768HZ
UCSCTL4 |= SELA_2; // Set ACLK = REFO
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_6; // Select DCO range 50MHz operation
N_FLL = 762;//
UCSCTL2 = FLLD_1 + N_FLL; // Set DCO Multiplier for 25MHz
// (N + 1) * FLLRef = Fdco
// (762 + 1) * 32768 = 25MHz
// Set FLL Div = fDCOCLK/2
__bic_SR_register(SCG0); // Enable the FLL control loop
// Worst-case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
// UG for optimization.
// 32 x 32 x 25 MHz / 32,768 Hz = 781250 = MCLK cycles for DCO to settle
__delay_cycles(78125);
// Loop until XT1,XT2 & DCO fault flag is cleared
/*
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
*/
}
unsigned char Fre=2; //主频 1为32768 2为 25M
void TimerB0_Init(void) //1ms定时
{
if(Fre==1)
{
TB0CTL = MC_0; //计数器禁止
// TBCTL|=MC_1+CNTL_0+TBCLGRP_0;
TB0CCTL0 |= CCIE; //中断使能
TB0CCR0 =32; // 1ms定时
TB0CTL = TBSSEL_1 + MC_1 + TBCLR; //SMCLK
}
else if(Fre==2)
{
TB0CTL = MC_0; //计数器禁止
// TBCTL|=MC_1+CNTL_0+TBCLGRP_0;
TB0CCTL0 |= CCIE; //中断使能
TB0CCR0 =60000; // 1ms定时
TB0CTL = TBSSEL_2 + MC_1 + TBCLR; //SMCLK
}
}
void ADC_Init()
{
P6SEL = 0x10; // Enable A/D channel inputs
ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_15; // Turn on ADC12_A, extend sampling time
// to avoid overflow of results
ADC12CTL1 = ADC12SHP+ADC12CONSEQ_3; // Use sampling timer, repeated sequence
ADC12MCTL0 = ADC12INCH_4+ADC12SREF_7+ADC12EOS; // ref+=AVcc, channel = A3, end seq.
ADC12IE = 0x01; // Enable ADC12IFG.3
// ADC12CTL0 |= ADC12ENC; // Enable conversions
// ADC12CTL0 |= ADC12SC; // Start conversion - software trigger // 使能转换
}
#include "main.h" #define Num_of_Results 80 #define ADC_START() ADC12CTL0 |= ADC12SC+ADC12ENC; // ʹ��AD�����ת�� #define ADC_Stop() ADC12CTL0= ADC12CTL0&(~ADC12ENC); volatile unsigned int A0results[Num_of_Results]; volatile unsigned int A1results[Num_of_Results]; volatile unsigned int A2results[Num_of_Results]; volatile unsigned int A3results[Num_of_Results]; unsigned char Fre=2; //��Ƶ 1Ϊ32768 2Ϊ 25M __no_init float AD_Value[8]; unsigned char *P; long AD_Value_Avg=0; unsigned char AD_Value_Flag=0; //AD�ɼ��Ѿ���ɱ�־��0Ϊ�Ѿ���ɣ�1Ϊδ��� __no_init unsigned int AD_Value_Arry[1000]; __no_init unsigned char RXD_Data[50]; //�������ݴ洢���� unsigned char RXD_Data_Count=0; //�������ݼ��� unsigned char RXD_End_Start_Conunt_Flag=0;//��������֡���ս��������ʱ��־λ��1�����ʱ unsigned char RXD_End_Time_Count=0;//������ʼ��ʱ�ļ���ֵ unsigned char RXD_End_Flag=0;//����֡���ձ�־λ��1Ϊ�Ѿ����� unsigned char Start_Flag=0;//������ת����־λ��1Ϊ���ת�� unsigned char Reverse_Flag=0;//��������ת��־λ��1Ϊ�����ת //��ת�ͷ�תҪ������ unsigned char ADC_Calibrat_A_Flag=0; //AŤ��У��ʼ��־λ��1Ϊ�Ѿ���ʼAŤ��У unsigned char ADC_Calibrat_B_Flag=0; //BŤ��У��ʼ��־λ��1Ϊ�Ѿ���ʼBŤ��У float Soft_Time_Set=0;//�����ʱ���趨ֵ unsigned int Soft_Speed_Set=0;//�����ת���趨ֵ float First_Torque_Set=0;//��һŤ���趨ֵ unsigned int First_Speed_Set=0;//��һת���趨ֵ float Second_Torque_Set=5;//�ڶ�Ť���趨ֵ unsigned int Second_Speed_Set=0;//�ڶ�ת���趨ֵ unsigned char curve_Disp_Flag=0;//���߽�����ʾ��־λ 1Ϊ��ʾ���ߣ�0Ϊ����ʾ���� unsigned int LCD_Disp_Count=0;//������ʾ��ʱ unsigned char LCD_Disp_Flag=0;//LCD���±�־λ��1������ʾ��0Ϊ��������ʾ float Torque_Value; float Final_Torque_Value=0; //����Ť�� //unsigned char Disp_Finsh_Flag=1; float K,B;//Ť������У���� F=K*V+B unsigned char B_Flag=0;//Bֵ�÷��ű�־λ 1Ϊ������2Ϊ���� float Vol_A,Vol_B; unsigned int nx; __no_init unsigned char Flash_Buff[16]; unsigned char Speed_Status_Flag=5;//5��������1,�������2����һ�ٶȣ�3���ڶ��ٶ�,4����һŤ�غ͵ڶ�Ť��֮���ͣ��״̬ unsigned int Soft_Time_Count=0; //����ʱ���ʱ���� unsigned int Time_Count=0; //�������ʱ���� unsigned char B_Calibrat_CMD[9]={0xEE,0xB1,0x00,0x00,0x04,0xFF,0xFC,0xFF,0xFF };//�л���BУ���� unsigned char Calibrat_SUCCECC_CMD[9]={0xEE,0xB1,0x00,0x00,0x07,0xFF,0xFC,0xFF,0xFF };//�л���У�ɹ����� unsigned int First_Stop_Count=0; //��һŤ�غ͵ڶ�Ť��֮���50msͣ������ unsigned char First_Stop_Flag=0;//��һŤ�غ͵ڶ�Ť��֮��ͣ�������Ѿ����µı�־λ unsigned char Control_Flag=0; //���Ʊ�־λ,1Ϊ�Ѿ���ʼ���� unsigned char AD_Start_Flag=0; unsigned int AD_Count=0; unsigned int index = 0; int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; SetVcoreUp(PMMCOREV_1); //12M SetVcoreUp(PMMCOREV_2); // Set VCore to 1.8MHz for 20MHz SetVcoreUp(PMMCOREV_3); //25M if(Fre==2) { UCS_Init(); } // GPIO_Init(); UART_Init(); ADC_Init(); // TimerA0_Init();//1ms TimerB0_Init();//1ms ReadData(); // Calibrat_Data_Read(); _EINT(); //��ȫ���жϿ��� while(1) { if(LCD_Disp_Flag==1) { UART3_to_TouchLCD(); LCD_Disp_Flag=0; Torque_Value+=0.5; Final_Torque_Value=Torque_Value; if(Torque_Value>19) { Torque_Value=0; } } if(AD_Start_Flag==1) { ADC_START(); AD_Value_Flag=1; AD_Count=0; AD_Start_Flag=0; } } } /*********************************************************************** ��ʱ��A �жϺ��� �ж�Դ��CC0 ************************************************************************/ #pragma vector=TIMER0_A0_VECTOR __interrupt void TIMER0_A0_ISR(void) //1ms �ж� { ; } #pragma vector=TIMER0_B0_VECTOR __interrupt void TIMER0_B0_ISR(void) //1ms �ж� { if(RXD_End_Start_Conunt_Flag==1) //����֡������ʱ { if(RXD_End_Time_Count>=10) { RXD_End_Flag=1; RXD_End_Time_Count=0; RXD_End_Start_Conunt_Flag=0; UART_A3_Data_Deal(); } RXD_End_Time_Count++; } if(LCD_Disp_Flag==0) { LCD_Disp_Count++; if(LCD_Disp_Count>=1000) { LCD_Disp_Flag=1; LCD_Disp_Count=0; } } /* if(AD_Value_Flag==0&&(Start_Flag==1||ADC_Calibrat_A_Flag==1||ADC_Calibrat_B_Flag==1)) { ADC_START(); AD_Value_Flag=1; } */ AD_Count++; if(AD_Count>10) { AD_Count=1000; AD_Start_Flag=1; } /* if(Speed_Status_Flag==1) { Time_Count--; if(Time_Count==0) { Speed_Status_Flag=2; } } else if(Speed_Status_Flag==4) { First_Stop_Count--; if(First_Stop_Count==0) { Speed_Status_Flag=3; } } */ } #pragma vector=USCI_A3_VECTOR __interrupt void USCI_A3_ISR(void) { switch(__even_in_range(UCA3IV,4)) { case 0:break; // Vector 0 - no interrupt case 2: // Vector 2 - RXIFG���ݽ��� UCA3IE &=~UCRXIE; //��ֹ�����ж� RXD_End_Start_Conunt_Flag=0; //ֹͣ��֡���ս�����ʱ RXD_Data[RXD_Data_Count]=UCA3RXBUF; RXD_Data_Count++; RXD_End_Start_Conunt_Flag=1; //���10ms��ʱ���������жϱ�֡�����Ƿ���� RXD_End_Time_Count=0; //�жϱ�֡�����Ƿ��������ֵ���� UCA3IE |= UCRXIE; // Enable USCI_A3 RX interrupt break; case 4:break; // Vector 4 - TXIFG���ͻ���� default: break; } } #pragma vector=ADC12_VECTOR __interrupt void ADC12ISR (void) { unsigned char i=0; switch(__even_in_range(ADC12IV,34)) { case 0: break; // Vector 0: No interrupt case 2: break; // Vector 2: ADC overflow case 4: break; // Vector 4: ADC timing overflow case 6: if(ADC_Calibrat_A_Flag==0&&ADC_Calibrat_B_Flag==0) { A0results[index] = ADC12MEM0; // Move A0 results, IFG is cleared index++; // Increment results index, modulo; Set Breakpoint1 here if (index == 8) { ADC_Stop(); index = 0; for(i=0;i<8;i++) { AD_Value[i]= A0results[i]*2.5/4095; //ADCֵ��ƽ�� AD_Value_Avg+=AD_Value[i]; } AD_Value_Avg=AD_Value_Avg/8; if(B_Flag==1) { ; // Torque_Value=K*AD_Value_Avg+B; } else if(B_Flag==2) { ; // Torque_Value=K*AD_Value_Avg-B; } AD_Value_Flag=0; } } else { A0results[index] = ADC12MEM0; // Move A0 results, IFG is cleared index++; // Increment results index, modulo; Set Breakpoint1 here if (index == 80) { ADC_Stop(); index = 0; for(i=0;i<80;i++) { AD_Value[i]= A0results[i]*2.5/4095; //ADCֵ��ƽ�� AD_Value_Avg+=AD_Value[i]; } AD_Value_Avg=AD_Value_Avg/80; if(ADC_Calibrat_A_Flag==1) { Vol_A=AD_Value_Avg; P=&B_Calibrat_CMD[0]; UART3_SendStr(P,9); ; ADC_Calibrat_A_Flag=0; } else if(ADC_Calibrat_B_Flag==1) { Vol_B=AD_Value_Avg; P=&Calibrat_SUCCECC_CMD[0]; UART3_SendStr(P,9); ; ADC_Calibrat_B_Flag=0; K=20/(Vol_B-Vol_A); B=-(K*Vol_A); K=0.5; B=-(0.32); if(B>0) { B_Flag=1; } else { B=B*(-1); B_Flag=2; } SaveData(); // ReadData(); // Calibrat_Data_Save(); } AD_Value_Flag=0; } } break; // Vector 6: ADC12IFG case 8: break; // Vector 8: ADC12IFG1 case 10: break; // Vector 10: ADC12IFG2 case 12: break; // Vector 12: ADC12IFG3 case 14: ; break; // Vector 14: ADC12IFG4 case 16: break; // Vector 16: ADC12IFG5 case 18: break; // Vector 18: ADC12IFG6 case 20: break; // Vector 20: ADC12IFG7 case 22: break; // Vector 22: ADC12IFG8 case 24: break; // Vector 24: ADC12IFG9 case 26: break; // Vector 26: ADC12IFG10 case 28: break; // Vector 28: ADC12IFG11 case 30: break; // Vector 30: ADC12IFG12 case 32: break; // Vector 32: ADC12IFG13 case 34: break; // Vector 34: ADC12IFG14 default: break; } } void SetVcoreUp (unsigned int level) { // Open PMM registers for write PMMCTL0_H = PMMPW_H; // Set SVS/SVM high side new level SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level; // Set SVM low side to new level SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level; // Wait till SVM is settled while ((PMMIFG & SVSMLDLYIFG) == 0); // Clear already set flags PMMIFG &= ~(SVMLVLRIFG + SVMLIFG); // Set VCore to new level PMMCTL0_L = PMMCOREV0 * level; // Wait till new level reached if ((PMMIFG & SVMLIFG)) while ((PMMIFG & SVMLVLRIFG) == 0); // Set SVS/SVM low side to new level SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level; // Lock PMM registers for write access PMMCTL0_H = 0x00; } void UCS_Init(void) { unsigned int N_FLL=0; UCSCTL3 |= SELREF_2; // Set DCO FLL reference = REFO 32768HZ UCSCTL4 |= SELA_2; // Set ACLK = REFO __bis_SR_register(SCG0); // Disable the FLL control loop UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx UCSCTL1 = DCORSEL_6; // Select DCO range 50MHz operation N_FLL = 762;// UCSCTL2 = FLLD_1 + N_FLL; // Set DCO Multiplier for 25MHz // (N + 1) * FLLRef = Fdco // (762 + 1) * 32768 = 25MHz // Set FLL Div = fDCOCLK/2 __bic_SR_register(SCG0); // Enable the FLL control loop // Worst-case settling time for the DCO when the DCO range bits have been // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx // UG for optimization. // 32 x 32 x 25 MHz / 32,768 Hz = 781250 = MCLK cycles for DCO to settle __delay_cycles(78125); // Loop until XT1,XT2 & DCO fault flag is cleared /* do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags }while (SFRIFG1&OFIFG); // Test oscillator fault flag */ } void GPIO_Init(void) { // P2DIR |= BIT1+BIT2; // P2.1 and P2.2 output // P2SEL |= BIT1; // P2SEL |= 0x0C; // P2.2 and P2.3 options select } void TimerA0_Init(void) //1ms��ʱ { TA0CTL = MC_0;//��������ֹ // TA0CCTL0 |= CCIE; //�ж�ʹ�� TA0CCR1 = 40000; // PWM Period/2 TA0CCTL0 = OUTMOD_6; // CCR1 toggle/set TA0CCR0 =65000; // 1ms��ʱ TA0CTL = TASSEL_2 + MC_1 + TACLR; //SMCLK } void TimerB0_Init(void) //1ms��ʱ { if(Fre==1) { TB0CTL = MC_0; //��������ֹ // TBCTL|=MC_1+CNTL_0+TBCLGRP_0; TB0CCTL0 |= CCIE; //�ж�ʹ�� TB0CCR0 =32; // 1ms��ʱ TB0CTL = TBSSEL_1 + MC_1 + TBCLR; //SMCLK } else if(Fre==2) { TB0CTL = MC_0; //��������ֹ // TBCTL|=MC_1+CNTL_0+TBCLGRP_0; TB0CCTL0 |= CCIE; //�ж�ʹ�� TB0CCR0 =60000; // 1ms��ʱ TB0CTL = TBSSEL_2 + MC_1 + TBCLR; //SMCLK } } void ADC_Init() { P6SEL = 0x10; // Enable A/D channel inputs ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_15; // Turn on ADC12_A, extend sampling time // to avoid overflow of results ADC12CTL1 = ADC12SHP+ADC12CONSEQ_3; // Use sampling timer, repeated sequence ADC12MCTL0 = ADC12INCH_4+ADC12SREF_7+ADC12EOS; // ref+=AVcc, channel = A3, end seq. ADC12IE = 0x01; // Enable ADC12IFG.3 // ADC12CTL0 |= ADC12ENC; // Enable conversions // ADC12CTL0 |= ADC12SC; // Start conversion - software trigger // ʹ��ת�� } void Speed_Control(void) //�ٶȿ��� { if(Speed_Status_Flag==0) { TA0CTL = MC_0;//��������ֹ // TA1CCR0 = 0; // TA1CCR1 = 0; Start_Flag=0; } else if(Speed_Status_Flag==1) //����� { TA0CTL = MC_0;//��������ֹ TA1CCR0 = 750000/Soft_Speed_Set; TA1CCR1 = 375000/Soft_Speed_Set; } else if(Speed_Status_Flag==2) //��һת�� { TA0CTL = MC_0;//��������ֹ TA1CCR0 = 750000/First_Speed_Set; TA1CCR1 = 375000/First_Speed_Set; } else if(Speed_Status_Flag==3) //�ڶ�ת�� { TA0CTL = MC_0;//��������ֹ TA1CCR0 = 750000/First_Speed_Set; TA1CCR1 = 375000/First_Speed_Set; } else if (Speed_Status_Flag==4) //��һŤ�غ͵ڶ�Ť��֮���ͣ��״̬ { TA0CTL = MC_0;//��������ֹ // TA1CCR0 = 0; // TA1CCR1 = 0; Start_Flag=0; } } void Torque_Control(void) //Ť�ؿ��� { if(Start_Flag==1) { if(Control_Flag==0) { Speed_Status_Flag=1;//��ʼ��������� Time_Count=Soft_Time_Count; Control_Flag=1; } if(Torque_Value>=First_Torque_Set) { if(First_Stop_Flag==0) { Speed_Status_Flag=4; First_Stop_Count=50; First_Stop_Flag=1; } } if(Torque_Value>Second_Torque_Set) { Speed_Status_Flag=0; } } }