问题原因:这是由于cubemx在默认下会开启DMA的中断,导致程序卡死在DMA 中断当中。将DMA中断关闭即可。这个卡死往往和ADC的continues convert是协同的。 在NVIC中取消这个选项即可。
ADC_value=HAL_ADC_GetValue(&hadc1); //开始读ADC的值 } } } 5.2、多通道连续 开启Continuous conversion Mode 6、HAL配置单通道ADC+DMA 在每次完成ADC转换后,会产生完成标志或者进入中断 产生中断后回进入公共的中断服务函数,完成中断处理,中断服务函数最终会调用ADC转换完成回调函数,所以采集完成后在回调函数...
//开启ADC使能中断 HAL_ADC_Start_IT(&hadc1); while (1) { } } //ADC转换完成后自动调用ADC中断回调函数 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { //获取ADC值并存储 ADC_Values=HAL_ADC_GetValue(hadc); } 三、ADC单通道+DMA采集数据 ADC的连续转换模式 + ADC的不扫描模式 +...
在NVIC(Nested Vectored Interrupt Controller)中使能相应的 ADC 中断通道,确保中断请求能够被正确处理。 编写中断服务程序: 当ADC 转换完成时,会触发中断服务程序。在中断服务程序中,我们可以调用HAL_ADC_ConvCpltCallback函数进行数据处理。 对于DMA 方式,通常在中断服务程序中进行后续的数据处理,例如对存储在内存缓冲...
采样周期 SamplingTime 越大越精确,越小则则会频繁触发DMA中断(在开启dma中断时,我试了在14M的adc时钟程序进不来while(因为频繁触发DMA中断) 看数据手册,知道三个adc中(adc1,adc2,adc3只有adc1和adc3能用DMA通道。 ADC的时钟不能超过14Mhz, 配置外设到内存(cubeMX自动配置好了),外设adc地址是不变的,而DMA把...
如果发生DMA传输数据丢失,会置位ADC状态寄存器ADC_SR的OVR位,如果同时使能了溢出中断,那在转换结束后会产生一个溢出中断。 模拟看门狗中断 当被ADC转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,前提是我们开启了模拟看门狗中断,其中低阈值和高阈值由ADC_LTR和ADC_HTR设置。例如我们设置高阈值是2.5V,那么模...
如果多通道转换ADC,次数频繁,间隔时间短(循环模式),会导致数据寄存器的数值被覆盖,所以要利用DMA转运。 注入组限制较多,一般采用规则组进行转换。 TCONV = 采样时间 + 12.5个ADC周期,采样时间=n个ADC周期,ADC采用频率最大是14MHZ,由于ADC挂载总线的频率是72MHZ所以进行6分频,采用周期是12MHZ。
将ADC DMA中断的NVIC使能代码屏蔽即可解决。。。/** * Enable DMA controller clock */ static void ...
相关dma配置,这里模式选择循环,这就不需要每次调用相关函数去获取adc的值了。因为是5个通道,所以Memory选择递增。另外这里的DMA的中断是默认开启的,实际在程序上是不用的,生成工程后,得注释掉DMA中断使能,不然会一直进中断(这种现象我也只在f103和f334中见到)。
hadc3.Init.ContinuousConvMode = ENABLE; 这个在实际应用中要改为DISABLE。 hadc3.Init.DMAContinuousRequests = DISABLE; 这个一定要设置为DISABLE,否则开启一次后就会没完没了的采样,然后调用DMA中断,太耗资源了。本项目10mS左右采样一次,不需要这个。