牛卧堂MCU技术交流

标题: M451 ADC [打印本页]

作者: et009tw    时间: 2017-3-6 07:50
标题: M451 ADC
請問 M451 有開啟ADC中斷模式 NVIC_EnableIRQ(ADC00_IRQn); ,但ADC中斷程式內沒有設中斷點,
單步執行時會一直進入ADC中斷程式,要如何設定才不會停留在ADC中斷程式內?
謝謝
作者: a_ziliu    时间: 2017-3-6 09:40
應該是之前有下過軟體的斷點沒有清除。
在下載的時侯,選定erase full chip。
並在keil debug mode中,清除所有的斷點
作者: et009tw    时间: 2017-3-6 10:23
我試了還是一樣,真奇怪。
謝謝

作者: a_ziliu    时间: 2017-3-9 10:27
那你可能是adc中斷旗號沒清,或者是開連續轉換模式
作者: et009tw    时间: 2017-3-10 08:03
我是有開連續轉換模式,但是也不應該中斷,我用使用Jlink或ST-link 調試並不會發生中斷,
應該是 NU-link 程式有問題,我另用 NU-link 調試 M0516 也是開連續轉換模式,並不會發生中斷。
作者: a_ziliu    时间: 2017-3-10 09:31
請把代碼發上來吧。
現在都是在猜原因,看代碼就知道發生什麼事情了。
作者: et009tw    时间: 2017-3-11 21:13
我是用 BSP 的 EADC_ADINT_Trigger 範例修改的

/*---------------------------------------------------------------------------------------------------------*/
/* EADC function test                                                                                       */
/*---------------------------------------------------------------------------------------------------------*/
void EADC_FunctionTest()
{


            /* Set the ADC internal sampling time, input mode as single-end and enable the A/D converter */
            EADC_Open(EADC, EADC_CTL_DIFFEN_SINGLE_END);
            EADC_SetInternalSampleTime(EADC, 6);

            /* Configure the sample 4 module for analog input channel 0 and enable ADINT0 trigger source */
            EADC_ConfigSampleModule(EADC, 4, EADC_ADINT0_TRIGGER, 0);
            /* Configure the sample 5 module for analog input channel 1 and enable ADINT0 trigger source */
            EADC_ConfigSampleModule(EADC, 5, EADC_ADINT0_TRIGGER, 1);
            /* Configure the sample 6 module for analog input channel 2 and enable ADINT0 trigger source */
            EADC_ConfigSampleModule(EADC, 6, EADC_ADINT0_TRIGGER, 2);
            /* Configure the sample 7 module for analog input channel 3 and enable ADINT0 trigger source */
            EADC_ConfigSampleModule(EADC, 7, EADC_ADINT0_TRIGGER, 3);

            /* Clear the A/D ADINT0 interrupt flag for safe */
            EADC_CLR_INT_FLAG(EADC, 0x1);

            /* Enable the sample module 7 interrupt */
            EADC_ENABLE_INT(EADC, 0x1);//Enable sample module  A/D ADINT0 interrupt.
            EADC_ENABLE_SAMPLE_MODULE_INT(EADC, 0, (0x1 << 7));//Enable sample module 7 interrupt.
            NVIC_EnableIRQ(ADC00_IRQn);

            /* Reset the ADC indicator and trigger sample module 7 to start A/D conversion */
            g_u32AdcIntFlag = 0;
            g_u32COVNUMFlag = 0;
            EADC_START_CONV(EADC, (0x1 << 7));


}


        uint32_t i32ConversionData[4] ;
/*---------------------------------------------------------------------------------------------------------*/
/* EADC interrupt handler                                                                                  */
/*---------------------------------------------------------------------------------------------------------*/
void ADC00_IRQHandler(void)
{
                uint8_t u32SAMPLECount ;
    EADC_CLR_INT_FLAG(EADC, 0x1);      /* Clear the A/D ADINT0 interrupt flag */
                for(u32SAMPLECount = 0; u32SAMPLECount < 4; u32SAMPLECount++)
                        i32ConversionData[u32SAMPLECount] = EADC_GET_CONV_DATA(EADC, (u32SAMPLECount + 4));
}

/*---------------------------------------------------------------------------------------------------------*/
/*  Main Function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/
int32_t main(void)
{
    SYS_UnlockReg();
    SYS_Init();
    SYS_LockReg();
    UART0_Init();
    EADC_FunctionTest();

    while(1){
                       
         //   for(g_u32COVNUMFlag = 0; (g_u32COVNUMFlag) < 8; g_u32COVNUMFlag++)
           //     printf("Conversion result of channel %d: 0x%X (%d)\n", (g_u32COVNUMFlag % 4), i32ConversionData[g_u32COVNUMFlag], i32ConversionData[g_u32COVNUMFlag]);       
                         printf("Conversion result of channel %d: 0x%X (%d)\n", (0 % 4), i32ConversionData[0], i32ConversionData[0]);       
                        printf("Conversion result of channel %d: 0x%X (%d)\n", (1 % 4), i32ConversionData[1], i32ConversionData[1]);       
                        printf("Conversion result of channel %d: 0x%X (%d)\n", (2 % 4), i32ConversionData[2], i32ConversionData[3]);       
                        printf("Conversion result of channel %d: 0x%X (%d)\n", (3  % 4), i32ConversionData[3], i32ConversionData[3]);       
                                       
                }

}
作者: et009tw    时间: 2017-3-11 21:17
在 while(1) 中 printf 下斷點 後單步執行. 會中斷在 void ADC00_IRQHandler(void)裡面。

作者: ypwang314    时间: 2017-3-13 09:41
本帖最后由 ypwang314 于 2017-3-13 09:43 编辑

你这个程序中断一次读四次数据,这样行吗?就算能读到也是四个一样的,没有意义。
新手意见,仅供参考。
没看清,是四个通道,我错了,你们继续。

作者: a_ziliu    时间: 2017-3-15 16:46
正常,多通道連續轉換就會就一直進去中斷




欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/) Powered by Discuz! X3.2