找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

M451 ADC

[复制链接]
跳转到指定楼层
楼主
et009tw 发表于 2017-3-6 07:50:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
請問 M451 有開啟ADC中斷模式 NVIC_EnableIRQ(ADC00_IRQn); ,但ADC中斷程式內沒有設中斷點,
單步執行時會一直進入ADC中斷程式,要如何設定才不會停留在ADC中斷程式內?
謝謝
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具 举报

沙发
a_ziliu 发表于 2017-3-6 09:40:56 | 只看该作者
應該是之前有下過軟體的斷點沒有清除。
在下載的時侯,選定erase full chip。
並在keil debug mode中,清除所有的斷點
回复 支持 反对

使用道具 举报

板凳
 楼主| et009tw 发表于 2017-3-6 10:23:06 | 只看该作者
我試了還是一樣,真奇怪。
謝謝
回复 支持 反对

使用道具 举报

地板
a_ziliu 发表于 2017-3-9 10:27:14 | 只看该作者
那你可能是adc中斷旗號沒清,或者是開連續轉換模式
回复 支持 反对

使用道具 举报

5#
 楼主| et009tw 发表于 2017-3-10 08:03:04 | 只看该作者
我是有開連續轉換模式,但是也不應該中斷,我用使用Jlink或ST-link 調試並不會發生中斷,
應該是 NU-link 程式有問題,我另用 NU-link 調試 M0516 也是開連續轉換模式,並不會發生中斷。
回复 支持 反对

使用道具 举报

6#
a_ziliu 发表于 2017-3-10 09:31:24 | 只看该作者
請把代碼發上來吧。
現在都是在猜原因,看代碼就知道發生什麼事情了。
回复 支持 反对

使用道具 举报

7#
 楼主| et009tw 发表于 2017-3-11 21:13:36 | 只看该作者
我是用 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]);       
                                       
                }

}
回复 支持 反对

使用道具 举报

8#
 楼主| et009tw 发表于 2017-3-11 21:17:33 | 只看该作者
在 while(1) 中 printf 下斷點 後單步執行. 會中斷在 void ADC00_IRQHandler(void)裡面。
回复 支持 反对

使用道具 举报

9#
ypwang314 发表于 2017-3-13 09:41:21 | 只看该作者
本帖最后由 ypwang314 于 2017-3-13 09:43 编辑

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

使用道具 举报

10#
a_ziliu 发表于 2017-3-15 16:46:48 | 只看该作者
正常,多通道連續轉換就會就一直進去中斷
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU