使用DMA时卡在configASSERT( pxQueue );

        FreeRTOS系统中使用ADC-DMA模式,在DMA中断中发送信号量,结果程序进入一次中断后不再进入中断。

        检查ADC及DMA寄存器:在KEIL中把ADC1->CR等寄存器添加到watch窗口,注意添加DMA寄存器时,基地址稍稍有些不同,LISR的基地址是DMA->LISR,DMA_SxCR等寄存器的基地址为 DMA2_Stream0->CR,具体到某个数据流。检查后确认配置没有问题。

        断点调试发现程序卡死在:configASSERT( pxQueue );查看具体信号量的句柄,发现没有被赋值,分析流程发现ADC及DMA的使能是在信号量句柄使能之前,所以产生了卡死的BUG,在中断中添加:

if(voltagecplt!=NULL)
{

}

BUG解决。

 

另一种情况:引用

http://www.stm32cube.com/article/79

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用硬件抽象层(Hardware Abstraction Layer, HAL)处理DMA(Direct Memory Access)中断时,通常步骤如下: 1. **初始化DMA和外设**: 首先,你需要在HAL库中初始化相应的DMA控制器以及它所连接的数据传输源和目标设备。这包括配置DMA通道、设置数据传输地址、长度等参数。 2. **配置中断**: 在HAL里,为DMA操作启用中断。通常,你需要注册一个回调函数,当DMA完成传输或发生错误时,这个函数会被自动调用。 ```c HAL_DMA_Init(&hdma); __HAL_LINKDMA(h peripheral, hdma, DMA_Channel TransferComplete_IRQn); ``` 这里`hdma`是你配置好的DMA句柄,`h peripheral`是包含DMA的外设结构体,TransferComplete_IRQn是对应的中断服务例程。 3. **开启中断**: 向系统或处理器管理器请求开启DMA中断,并确保其优先级设置得当。 ```c HAL_NVIC_EnableIRQ(DMA_CHANNEL_IRQn); ``` 这里的`DMA_CHANNEL_IRQn`是对应DMA中断的全局中断标识符。 4. **处理中断**: 当中断被触发后,执行中断服务例程(ISR),在这个函数中检查DMA的状态并根据需要更新数据或者控制流程。 ```c void DMA_Channel_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma); // 处理DMA中断 } ``` 5. **清除中断标志**: DMA中断处理完后,通常需要清除中断标志以避免再次连续进入中断。 ```c HAL_DMA_IRQHandler(&hdma); HAL_DMA_FLAG_CLEAR(&hdma, DMA_FLAG_TCIF | DMA_FLAG_HTIF | DMA_FLAG_DMACF); ``` 这里`DMA_FLAG_TCIF`, `DMA_FLAG_HTIF`, 和 `DMA_FLAG_DMACF`分别表示传输完成、硬件故障和DMA通道溢出。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值