硬汉嵌入式论坛

 找回密码
 立即注册
查看: 191|回复: 4
收起左侧

[DMA] 使用DMA的传输中断和半传输中断采样,但是时序对不上

[复制链接]

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2025-11-4 15:15:34 | 显示全部楼层 |阅读模式



#include "./BSP/ADC/adc.h"
#include "./SYSTEM/delay/delay.h"
#include "os.h"

static ADC_HandleTypeDef hadc1;
static ADC_HandleTypeDef hadc2;
static ADC_HandleTypeDef hadc3;
DMA_HandleTypeDef g_dma2_nch_adc1_handle;
ADC_HandleTypeDef g_adc1_nch_dma2_handle;


volatile uint16_t ADC1_Value_buffer[200 = {0}; //ADC1通道采样值缓冲区
volatile uint8_t  ADC1_Dma_TransferFlag = DMA_TRANSFER_NONE; //DMA传输状态标志
extern uint32_t ADC_digital[4];

void MX_ADC1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_ADC1_CLK_ENABLE();

    __HAL_RCC_DMA2_CLK_ENABLE();
    g_dma2_nch_adc1_handle.Instance = DMA2_Stream0;  
    g_dma2_nch_adc1_handle.Init.Channel = DMA_CHANNEL_0;
    g_dma2_nch_adc1_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;
    g_dma2_nch_adc1_handle.Init.PeriphInc = DMA_PINC_DISABLE;
    g_dma2_nch_adc1_handle.Init.MemInc = DMA_MINC_ENABLE;
    g_dma2_nch_adc1_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    g_dma2_nch_adc1_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    g_dma2_nch_adc1_handle.Init.Mode = DMA_CIRCULAR;//循环模式
    g_dma2_nch_adc1_handle.Init.Priority = DMA_PRIORITY_MEDIUM;
   
   
   
   
    HAL_DMA_Init(&g_dma2_nch_adc1_handle);

    HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 5, 0); // 优先级必须>=5才能安全调用RTOS API
    HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
    __HAL_LINKDMA(&g_adc1_nch_dma2_handle, DMA_Handle, g_dma2_nch_adc1_handle);

    /* 设置 ADC 对应的 DMA */
    g_adc1_nch_dma2_handle.DMA_Handle = &g_dma2_nch_adc1_handle;
    g_adc1_nch_dma2_handle.Instance = ADC1;
    g_adc1_nch_dma2_handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;//由84Mhz进行4分频
    g_adc1_nch_dma2_handle.Init.Resolution = ADC_RESOLUTION_12B;
    g_adc1_nch_dma2_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; //数据右对齐
    g_adc1_nch_dma2_handle.Init.ScanConvMode = ENABLE; //启用ADC扫描转换模式
    g_adc1_nch_dma2_handle.Init.ContinuousConvMode = ENABLE; //启用连续转换模式
    g_adc1_nch_dma2_handle.Init.DiscontinuousConvMode = DISABLE; //禁用不连续转换模式
    g_adc1_nch_dma2_handle.Init.NbrOfConversion = 4; //设置转换的通道数为4
    g_adc1_nch_dma2_handle.Init.NbrOfDiscConversion = 0;//不连续转换的通道数为0
    g_adc1_nch_dma2_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; //软件触发转换
    g_adc1_nch_dma2_handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//禁用外部触发转换
    g_adc1_nch_dma2_handle.Init.DMAContinuousRequests = ENABLE; //启动DMA连续请求
   
    HAL_ADC_Init(&g_adc1_nch_dma2_handle);
   
    //GPIO初始化
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   
    /* 设置采样规则序列 1、2、3、6 */
    adc1_channel_set(&g_adc1_nch_dma2_handle, ADC_CHANNEL_1, 1, ADC_SAMPLETIME_480CYCLES); //GRN_NTC
    adc1_channel_set(&g_adc1_nch_dma2_handle, ADC_CHANNEL_2, 2, ADC_SAMPLETIME_480CYCLES); //RED_NTC
    adc1_channel_set(&g_adc1_nch_dma2_handle, ADC_CHANNEL_3, 3, ADC_SAMPLETIME_480CYCLES); //VPD_GRN
    adc1_channel_set(&g_adc1_nch_dma2_handle, ADC_CHANNEL_6, 4, ADC_SAMPLETIME_480CYCLES); //VPD_RED
   
    // 注意:DMA不在这里启动,而是在RTOS信号量创建后启动
    // 避免在信号量创建前触发DMA中断
    // 启动ADC1的DMA循环传输
}

/**
* @brief  启动ADC1的DMA传输
* @note   必须在RTOS启动且信号量创建后调用此函数
*/
void adc1_start_dma(void)
{
    // 启动ADC1的DMA循环传输
    HAL_ADC_Start_DMA(&g_adc1_nch_dma2_handle, (uint32_t*)ADC1_Value_buffer, 200);
   
    // 使能半传输和全传输中断
    __HAL_DMA_ENABLE_IT(&g_dma2_nch_adc1_handle, DMA_IT_HT | DMA_IT_TC);
}

微信图片_20251104151432.png
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2025-11-4 15:30:56 | 显示全部楼层
从这个时间上来看满足完成一次DMA全传输中断采样时间,但是半传输中断发生的时间和全传输发生的时间靠的太近了,理论上全传输采样和半传输采样时间应该差不多各自为2.4ms左右
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 2025-11-5 10:25:59 | 显示全部楼层

回帖奖励 +10 个金币

chasd 发表于 2025-11-4 15:30
从这个时间上来看满足完成一次DMA全传输中断采样时间,但是半传输中断发生的时间和全传输发生的时间靠的太 ...

没太看懂你的描述,你说的全传输距离半传输和半传输距离起始时间一样吧。

然后你的截图,注释那个位置是半传输,那个位置是全传输位置,最好采集10轮看
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2025-11-5 18:58:52 | 显示全部楼层
eric2013 发表于 2025-11-5 10:25
没太看懂你的描述,你说的全传输距离半传输和半传输距离起始时间一样吧。

然后你的截图,注释那个位置 ...

逻辑分析仪的线接反了,问题已经解决,谢谢
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2025-11-5 18:59:51 | 显示全部楼层
chasd 发表于 2025-11-4 15:30
从这个时间上来看满足完成一次DMA全传输中断采样时间,但是半传输中断发生的时间和全传输发生的时间靠的太 ...

抱歉,逻辑分析仪地线接错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-11-21 22:26 , Processed in 0.047581 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表