你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G474 HRTIM 触发ADC问题求助

[复制链接]
amishe 提问时间:2024-7-4 22:28 / 未解决

你好:

我的目的是使用G474的HRTIM 做平均电流控制电源环路:

想法是:使用HRTIM A 、B做移相控制,HRTIM A、B设置comp1和comp2做占空比控制,频率20KHz,设置HRTIM A设置comp3作为ADC触发源;ADC启动DMA,并使用DMA中断来处理ADC数据和环2路计算。

问题:当开启HRTIMA 的中断和DMA ADC中断后,DMA ADC中断一直被触发,系统其他的部分一直得不到运行,优先级也对该过,任然是一样的一直在DMA ADC中断。

现象1:关闭DMA ADC中断后,程序正常运行;

请教一下,如果使用HRTIM A触发ADC,使用ADC的DMA中断接受数据,该怎么处理呢?

谢谢

收藏 评论3 发布时间:2024-7-4 22:28

举报

3个回答
xmshao 回答时间:前天 10:46
感觉你没有对某些中断标志位没做清零。


你说 DMA ADC中断一直被触发,到底是什么中断呢?ADC的EOC中断还是DMA传输中断,它又分半传输和传输完成中断。


你现在想通过TIMER触发ADC,使用DMA搬运数据。这时,一般是没必要开启ADC的EOC中断的。


如果使用CubeMx配置及Cube库API的话,DMA的半传输和传输完成中断都是默认开启了的,我们


基于传输完成或半完成中断处理数据即可。如果说你的TIMER触发是没完没了的循环的话,利用半传输


完成中断来处理接收数据是个不错的选择。


如基于库提供的回调函数来写代码的话,只需添加用户处理代码,标志位都交给库代码完成了。


如果全部是自己编写的代码,记得做中断标志的清零处理。
amishe 回答时间:前天 14:13

你好!是HRIM 触发ADC ,然后启动DMA完成中断,来处理数据。使用的是HAL的接口;ADC中关联DMA channel 1:

hdma_adc1.Instance = DMA1_Channel1; hdma_adc1.Init.Request = DMA_REQUEST_ADC1; hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc1.Init.Mode = DMA_CIRCULAR; hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;

在DMA.C中配置DMA1_Channel1中断:

HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 3, 0); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);

在void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)中处理数据。

在主任务中开启ADC MDA:

ADC1_StartDMA();

运行程序,DMA中断就会导致UCOS系统的是任务不发正常调度了。UCOS的系统时钟用的SysTick的优先级为:

define TICK_INT_PRIORITY 2U

xmshao 回答时间:前天 16:40

amishe 发表于 2024-7-5 14:13
你好!是HRIM 触发ADC ,然后启动DMA完成中断,来处理数据。使用的是HAL的接口;ADC中关联DMA channel 1 ...

[md]你要注意一点,

你现在的DMA配置在循环模式,如果定时器频繁地触发ADC的话,

也就意味着频繁产生DMA完成中断。该中断如果总是频繁产生,势必

会对任务调度有影响。这个地方要合理规划下。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版