久芯网

STM32F103使用cubemx配置ADC和DMA导致delay函数无法使用的问题

avatar DII 提问时间: 2023-07-29 16:27:23 / 未解决

如需获得 STM32F103 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

7个回答
  • avatar DII
    回答时间: 2023-07-29 16:47:09

    用CUBEMX配置完adc和dma后在主函数中调用函数HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&DMA_value,6); 会导致while循环中的delay延时函数失效,具体情况是: 不打开ADC,delay函数正常使用,可以1S打印一次信息, 但是打开HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&DMA_value,6);函数后,打印频率不是1S,而是比1S快 同样,只使用ADC不使用DMA,在while循环之前打开HAL_ADC_Start_IT(&hadc1);,可以1S打印一次信息, 但是如果同时打开HAL_ADC_Start_IT(&hadc1);和HAL_ADC_Start(&hadc1);,就会导致打印的频率比1S快 有没有大佬知道如何解决问题

  • avatar xmshao
    回答时间: 2023-07-29 17:18:17

    你关注下中断优先级方面的问题,这里主要是DMA中断。另外,你打印是基于时间还是基于事件?

  • avatar huanying
    回答时间: 2023-07-29 17:38:14
    xmshao 发表于 2022-5-18 07:28
    你关注下中断优先级方面的问题,这里主要是DMA中断。另外,你打印是基于时间还是基于事件? ...

    delay延时用的是for while死循环,这种延时精度不高,当有频繁中断产生时,延时就会变长,如果要精准定时建议你使用定时器,并且用优先级别较高的定时器。

  • avatar DII
    回答时间: 2023-07-29 18:04:03
    huanying 发表于 2022-5-18 10:01
    delay延时用的是for while死循环,这种延时精度不高,当有频繁中断产生时,延时就会变长,如果要精准定时 ...

    这是我刚刚用F4芯片测试的程序 问题依旧 ,延时1S打印一次 但是使用ADC_DMA后打印频率非常高

  • avatar DII
    回答时间: 2023-07-29 18:22:32
    xmshao 发表于 2022-5-18 07:28
    你关注下中断优先级方面的问题,这里主要是DMA中断。另外,你打印是基于时间还是基于事件? ...

    我昨天可能没有表达清楚 程序是图一图二和图三 图一是1S打印一次 把程序改为图2后 (昨天)打印情况为1S打印10多次,但是找不到原因, 打开DMA传输,使用图三的程序后,还是1S打印10多次,(中断都是空函数) 但是今天早上再次调试,程序又正常了(程序一点都没变),挺玄学的

  • avatar DII
    回答时间: 2023-07-29 18:55:08
    huanying 发表于 2022-5-18 10:01
    delay延时用的是for while死循环,这种延时精度不高,当有频繁中断产生时,延时就会变长,如果要精准定时 ...

    这是我刚刚用F4芯片测试的程序 问题依旧 ,延时1S打印一次 但是使用ADC_DMA后打印频率非常高

  • avatar huanying
    回答时间: 2023-07-29 19:21:08
    DII 发表于 2022-5-18 10:36
    这是我刚刚用F4芯片测试的程序 问题依旧 ,延时1S打印一次 但是使用ADC_DMA后打印频率非常高 ...

    printf 效率很低,最好不要用,而且你这是调试没什么用

会员中心 微信客服
客服
回到顶部