1.DMA时钟配置问题
想使用STM32CubeMX的DMA功能输出adc的值,使用软件生成代码后,添加启动DMA语句HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedValue,20);并不能得到adc的值
STM32Cube输出的代码段:
MX_GPIO_Init();
MX_ADC_Init();
MX_DMA_Init();
MX_DMA_Init()内部开启DMA时钟:
void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
}
这是直接由软件生成的代码块,问题是DMA的时钟再ADC初始化之后才开始配置,这样DMA的功能不能使用,调整为DMA的时钟在ADC初始化之前开始。
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC_Init();
之后再开启DMA便可以得到adc的经过DMA搬运的数值。
HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedValue,20);
2.DMA中断问题
在cubemx中配置好DMA之后,会自动开启DMA中断,如果单通道的ADC,那么会一直处在中断,这种情况也不能输出adc的值,需要屏蔽那两句中断优先级配置的代码
下面展示一些 内联代码片
。
/**
* Enable DMA controller clock
*/
void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel1_IRQn interrupt configuration */
// HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
// HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
}
......
HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedValue,1);
这样在使用单通道单次转换的时候便会正常输出adc的值。其余情况没有测试,有需要的请自行测试。