stm32adc dma 延时函数不能用
在使用STM32的ADC与DMA时,若发现延时函数(如HAL_Delay())失效,通常是因为中断冲突或系统资源被DMA占用导致SysTick(系统定时器)无法正常计数。以下是常见原因和解决方案:
1. 中断优先级冲突
- 原因:DMA传输完成中断或ADC中断的优先级高于SysTick中断,导致SysTick被阻塞,无法更新计数器。
- 解决:
- 调整中断优先级,确保SysTick中断优先级 ≤ DMA/ADC中断优先级。
- 在STM32CubeMX中配置优先级时,将SysTick的优先级设置为较低(数值越大,优先级越低)。
2. 全局中断被意外关闭
- 原因:在ADC或DMA初始化代码中可能误用了
__disable_irq()关闭全局中断,导致SysTick中断无法触发。 - 解决:
- 检查代码中是否有关闭中断的操作,确保在关键代码段外重新启用中断(
__enable_irq())。 - 避免在ADC/DMA初始化流程中禁用中断。
- 检查代码中是否有关闭中断的操作,确保在关键代码段外重新启用中断(
3. DMA持续占用总线
- 原因:ADC配置为连续扫描模式(Continuous Conversion),且DMA设为循环模式(Circular Mode),导致DMA持续占用总线,阻塞CPU访问SysTick。
- 解决:
- 改用单次模式(Single Conversion),通过代码或定时器触发ADC采样。
- 如果必须用连续模式,确保DMA传输完成中断中释放资源或降低DMA请求频率。
4. SysTick时钟源异常
- 原因:系统时钟配置错误(如HSE/PLL未启用),导致SysTick无法正常计时。
- 解决:
- 检查系统时钟树配置,确保SysTick的时钟源(通常为HCLK)正常。
- 使用STM32CubeMX重新验证时钟配置。
5. 替代方案:使用硬件定时器实现延时
-
如果问题无法解决,可以改用其他定时器(如TIM2/TIM3)实现延时,避免依赖SysTick:
// 初始化TIM2(示例) void TIM2_Init(void) { __HAL_RCC_TIM2_CLK_ENABLE(); TIM_HandleTypeDef htim2; htim2.Instance = TIM2; htim2.Init.Prescaler = 90-1; // 90MHz/90 = 1MHz htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0xFFFF; HAL_TIM_Base_Init(&htim2); HAL_TIM_Base_Start(&htim2); } // 自定义微秒级延时 void Delay_us(uint16_t us) { __HAL_TIM_SET_COUNTER(&htim2, 0); while (__HAL_TIM_GET_COUNTER(&htim2) < us); }
6. 代码示例:ADC+DMA配置要点
// 确保DMA中断优先级合理
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 1, 0); // 优先级低于SysTick
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
// 启动ADC+DMA
HAL_ADC_Start_DMA(&hadc, (uint32_t*)adc_buffer, BUFFER_SIZE);
通过检查中断优先级、系统时钟和DMA配置,通常可以解决延时函数失效的问题。如果问题依然存在,建议使用调试器观察SysTick计数器(HAL_GetTick())是否正常递增。
STM32H750VBT6 ADC1,ADC2,ADC3,加DMA为什么ADC3回调函数不能正常工作?
STM32H750VBT6ADC1,ADC2,ADC3,加DMA为什么
STM32ADC中断的使用注意事项和优化建议
STM32ADC中断的使用注意事项和优化建议 STM32ADC(模拟数字转换器)是STMicroelectronics开发的一款用于外部模拟信号转换为数字信号的器件。在使用
2024-01-12 15:17:50
STM32单片机实现DMA+ADC+UART功能
。于是想到了ADC采样的数据用DMA功能存储,并通过串口打印。但是串口打印依然要占用单片机时间,那能不能串口数据的输出也采用
资料下载
佚名
2021-12-28 19:25:44
STM32ADC转换
ADC模数转换一、概述ADC翻译过来是模数转换,意思就是将外部世界采集到的模拟量的数据信息通过ADC变为计算机可以识别的数字信号。
资料下载
佚名
2021-12-24 19:25:55
STM32 DMA传输的问题分析
用户使用STM32G473RET6芯片,开发环境STM32CubeMX+Keil(LL库)。使用DMA1通道1,在半传输中断和完全传输中断里,拷
2023-12-01 09:19:48
STM32单片机的延时原理和延时函数方法
当涉及到单片机编程时,延时是一项常见但关键的任务。在许多应用中,我们需要控制程序暂停一段时间,以实现精确的时间控制或协调不同设备之间的操作。本文将以STM32为例,介绍关于单片机的
2023-08-09 09:13:00
使用STM32ADC看门狗测量出待测信号
我们在做ADC应用时,有些场合需要精确测量出待测信号的数据,有时可能并不关心ADC结果多准确,只要满足某个范围即可,这时我们就可以考虑使用STM32ADC
2023-07-17 10:31:16
使用OSSchedLock()关闭调度器后,延时函数为什么不能用了
使用OSSchedLock()关闭调度器后,延时函数不能用了吗?delay.c文件中的delay_ms(),OSTimeDly()
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- amoled屏幕和oled区别
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机