刚用了一下hal库的DMA-ADC和DMA-USART,遇到了一些问题,记录一下。没有深层次的了解相关外设寄存器层面的操作,待了解后再回过头看看。
1、DMA_ADC
根据cube生成后只需要调用:
HAL_ADC_Start_DMA(&hadc1, 转换得到的数组名, 转换的通道数);
如果要确保转换完成,调用转换完成回调函数:
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
Uint8_t flag = 1; //告诉下面我转换好了
// Count ++;
}
另外,ADC初始化部分,采样周期调节通过:
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_8B;
sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES;
然后,DMA的数据大小根据ADC来,8位(BYTE);16位(HALFWORD);32位(WORD)
对于模式, hdma_adc1.Init.Mode = DMA_CIRCULAR;只需要开启一次,然后遇到
HAL_ADC_Stop_DMA(&hadc1) 关闭。我是在转换完成回调函数中关闭DMAadc。
2、DMA_USART
只使用了串口2的发送。先说说遇到的问题,开始定义的缓存数组是8位的,有128*50个。然后配置串口DMA时,配置的是WORD,打印出来的(16进制)就不正确,而且只输出了128*25个数据;换成HALFWORD,同样不正确,但输出的结果是一半数组的数据,每隔一个输出来。换成BYTE就好了,但同样只输出一半数据。把函数的size增大一倍就好了。
HAL_UART_Transmit_DMA(&huart2,(uint8_t*)DMATX_frame,128*50*2);
模式是一般模式:
hdma_usart2_tx.Init.Mode = DMA_NORMAL;
然后传输完成后,进入中断,中断中需要清除中断标志,并停止DMA。
__HAL_DMA_CLEAR_FLAG(&hdma_usart2_tx,DMA_FLAG_TCIF2_6);
HAL_UART_DMAStop(&huart2);
然后需要再发送的时候,就开启HAL_UART_Transmit_DMA。