关于STM32的DMA-ADC与DMA-串口发送的使用(hal库)

刚用了一下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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值