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

我用了ADC1,ADC2,ADC3,DMA1_Stream0,DMA1_Stream1,BDMA_Channel0,ADC1.ADC2.回调函数都是正常工作,就

[复制链接]
ZHANGYONGHAI 提问时间:2021-11-28 08:28 / 未解决

ADC_HandleTypeDef hadc1; ADC_HandleTypeDef hadc2; ADC_HandleTypeDef hadc3; DMA_HandleTypeDef hdma_adc1; DMA_HandleTypeDef hdma_adc2; DMA_HandleTypeDef hdma_adc3;

/ ADC1 init function / void MX_ADC1_Init(void) {

ADC_MultiModeTypeDef multimode = {0}; ADC_ChannelConfTypeDef sConfig = {0}; GPIO_InitTypeDef GPIO_InitStruct = {0};

HAL_RCC_DMA1_CLK_ENABLE(); / ADC1 clock enable / HAL_RCC_ADC12_CLK_ENABLE();

HAL_RCC_GPIOA_CLK_ENABLE(); HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*ADC1 GPIO Configuration PA5 ------> ADC1_INP19 PA7 ------> ADC1_INP7 PC5 ------> ADC1_INP8 PB0 ------> ADC1_INP9 / HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_7); HAL_GPIO_DeInit(GPIOC, GPIO_PIN_5); HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0);

GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_5; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_0; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/ ADC1 DMA Init / / ADC1 Init / hdma_adc1.Instance = DMA1_Stream0; / 使用的DMA1 Stream0 / hdma_adc1.Init.Request = DMA_REQUEST_ADC1; / 请求类型采用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; / 外设数据传输位宽选择半字,即16bit / hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; / 存储器数据传输位宽选择半字,即16bit / hdma_adc1.Init.Mode = DMA_CIRCULAR; / 循环模式 / hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH; / 优先级低 / hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; / 禁止FIFO/ hdma_adc1.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; / 禁止FIFO此位不起作用,用于设置阀值 / hdma_adc1.Init.MemBurst = DMA_MBURST_SINGLE; / 禁止FIFO此位不起作用,用于存储器突发 / hdma_adc1.Init.PeriphBurst = DMA_PBURST_SINGLE; / 禁止FIFO此位不起作用,用于外设突发 / if (HAL_DMA_DeInit(&hdma_adc1) != HAL_OK) { Error_Handler(); } if (HAL_DMA_Init(&hdma_adc1) != HAL_OK) { Error_Handler(); }

__HAL_LINKDMA(&hadc1,DMA_Handle,hdma_adc1);

/ DMA interrupt init / / DMA1_Stream0_IRQn interrupt configuration / HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 4, 1); HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn); /* Common config / hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; /! ADC2_INP18 PA6 ------> ADC2_INP3 PC4 ------> ADC2_INP4 PB1 ------> ADC2_INP5 / HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_6); HAL_GPIO_DeInit(GPIOC, GPIO_PIN_4); HAL_GPIO_DeInit(GPIOB, GPIO_PIN_1);

GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_4; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/ ADC2 DMA Init / / ADC2 Init / hdma_adc2.Instance = DMA1_Stream1; / 使用的DMA1 Stream1 / hdma_adc2.Init.Request = DMA_REQUEST_ADC2; / 请求类型采用DMA_REQUEST_ADC2 / hdma_adc2.Init.Direction = DMA_PERIPH_TO_MEMORY; / 传输方向是从存储器到外设 / hdma_adc2.Init.PeriphInc = DMA_PINC_DISABLE; / 外设地址自增禁止 / hdma_adc2.Init.MemInc = DMA_MINC_ENABLE; / 存储器地址自增使能 / hdma_adc2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; / 外设数据传输位宽选择半字,即16bit / hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; / 存储器数据传输位宽选择半字,即16bit / hdma_adc2.Init.Mode = DMA_CIRCULAR; / 循环模式 / hdma_adc2.Init.Priority = DMA_PRIORITY_MEDIUM; / 优先级低 / hdma_adc2.Init.FIFOMode = DMA_FIFOMODE_DISABLE; / 禁止FIFO/ hdma_adc2.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; / 禁止FIFO此位不起作用,用于设置阀值 / hdma_adc2.Init.MemBurst = DMA_MBURST_SINGLE; / 禁止FIFO此位不起作用,用于存储器突发 / hdma_adc2.Init.PeriphBurst = DMA_PBURST_SINGLE; / 禁止FIFO此位不起作用,用于外设突发 /

if (HAL_DMA_DeInit(&hdma_adc2) != HAL_OK) { Error_Handler(); }

if (HAL_DMA_Init(&hdma_adc2) != HAL_OK) { Error_Handler(); }

__HAL_LINKDMA(&hadc2,DMA_Handle,hdma_adc2);

/ DMA1_Stream1_IRQn interrupt configuration / HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 4, 3); HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); /* Common config / hadc2.Instance = ADC2; hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; /! ADC3_INP10 PC3_C ------> ADC3_INP1 / HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0);

GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

HAL_SYSCFG_AnalogSwitchConfig(SYSCFG_SWITCH_PC3, SYSCFG_SWITCH_PC3_OPEN);

/ ADC3 DMA Init / / ADC3 Init / hdma_adc3.Instance = BDMA_Channel0; / 使用的BDMA_Channel0/ hdma_adc3.Init.Request = BDMA_REQUEST_ADC3; / 请求类型采用BDMA_REQUEST_ADC3 / hdma_adc3.Init.Direction = DMA_PERIPH_TO_MEMORY; / 传输方向是从存储器到外设 / hdma_adc3.Init.PeriphInc = DMA_PINC_DISABLE; / 外设地址自增禁止 / hdma_adc3.Init.MemInc = DMA_MINC_ENABLE; / 存储器地址自增使能 / hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; / 外设数据传输位宽选择半字,即16bit / hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; / 存储器数据传输位宽选择半字,即16bit / hdma_adc3.Init.Mode = DMA_CIRCULAR; / 循环模式 / hdma_adc3.Init.Priority = DMA_PRIORITY_LOW; / 优先级低 / hdma_adc3.Init.FIFOMode = DMA_FIFOMODE_DISABLE; / 禁止FIFO/ hdma_adc3.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; / 禁止FIFO此位不起作用,用于设置阀值 / hdma_adc3.Init.MemBurst = DMA_MBURST_SINGLE; / 禁止FIFO此位不起作用,用于存储器突发 / hdma_adc3.Init.PeriphBurst = DMA_PBURST_SINGLE; / 禁止FIFO此位不起作用,用于外设突发 /

if (HAL_DMA_DeInit(&hdma_adc3) != HAL_OK) { Error_Handler(); } if (HAL_DMA_Init(&hdma_adc3) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(&hadc3,DMA_Handle,hdma_adc3);

/ BDMA_Channel0_IRQn interrupt configuration / HAL_NVIC_SetPriority(BDMA_Channel0_IRQn, 4, 7); HAL_NVIC_EnableIRQ(BDMA_Channel0_IRQn);

/* Common config / hadc3.Instance = ADC3; hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; /*!Instance == ADC1)






{

//          printf(" ADC00000: \r\n");
SCB_InvalidateDCache_by_Addr((uint32_t *)Adc1Value, ADC_AVERAGE_SIZE);
ADCSYM.BDT = TRUE;
}
else if(hadc->Instance == ADC2)
{
SCB_InvalidateDCache_by_Addr((uint32_t *)Adc2Value, ADC_AVERAGE_SIZE);  
ADCSYM.VFP = TRUE;
//          printf(" ADC11111: \r\n");
}
else if(hadc->Instance == ADC3)
{
SCB_InvalidateDCache_by_Addr((uint32_t *)Adc3Value, ADC_AVERAGE_SIZE);
ADCSYM.TBP = TRUE;
//          printf(" ADC22222: \r\n");
//          printf(" \r\n");
}

}

就是ADC3.回调函数不能正常工作。有没有遇到这种情况的
收藏 评论1 发布时间:2021-11-28 08:28

举报

1个回答
xmshao 回答时间:2021-11-29 11:36:06
你咨询问题尽量把芯片型号说清楚,从你的代码来看感觉是H7系列的。你说ADC3回调函数不能正常工作,ADC3能否正常工作,能否进入相关DMA传输中断,这些请检查确认下。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版