DMA简介
直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
总结来说就是数据不需要CPU的干预完成下面四个过程:
1:外设---内存:I2C/UART等获取数据并送入SRAM。
2:内存---内存:SRAM的两个区域之间。
3:内存---外设:SRAM中预先保存的数据送入DAC产生各种波形。
4:外设---外设 :ADC读取数据后送到TIM1控制其产生不同的PWM占空比。
STM32F10xxx微控制器系列,DMA1有7个通道,DMA2有5个通道。
一:打开CUBEMX,新建工程,选择的芯片为STM32F103C8T6。
2:System Core->SYS,选择Trace Asynchronous Sw,用于适配我们的STLink下载器。
3:System Core->RCC,打开所有时钟。
4:配置时钟树。
5:点击Analog->ADC1,勾选IN0,IN1。注意此时时钟树里面ADC时钟会自动分频到14MHz,因为使用ADC时时钟最大不能超过14MHz。配置ADC。
6:点击System Core->DMA->Add,配置DMA,设置为扫描模式,优先级我们随便给。
7:点击Connectivity->UISART1。
8:配置工程,选择编译器。
9:点击右上角GENERATE CODE。打开工程。
10:给ADC数据分配空间。
11:printf的重定向。需要包含stdio.h。
12:主函数
13:重要函数。
HAL_ADCEx_Calibration_Start(&hadc1)
执行ADC自动自校准
入口参数1:ADC外设
HAL_ADC_Start_DMA(&hadc1,ADC_Buffer,ADC_Buffer_size);
启用ADC,启动常规组的转换,并通过DMA传输结果。
入口参数1:ADC外设
入口参数2:目标缓冲区地址
入口参数3:从ADC外设传输到内存的数据长度