[STM32F1] STM32F103具备DMA吗

[复制链接]
745|2
 楼主| 捉虫天师 发表于 2025-2-25 14:57 | 显示全部楼层 |阅读模式
STM32F103系列微控制器具备DMA(直接存储器访问)功能。STM32F103的DMA控制器可以直接在内存与外设之间传输数据,而不需要CPU的干预,从而大大提高了数据传输效率并减少了CPU的负担。

STM32F103的DMA特点:
DMA控制器: STM32F103通常配备一个DMA控制器,支持最多7个通道,可以实现内存到外设、外设到内存、内存之间的直接数据传输。

多种数据传输模式:

内存到外设:如将数据从内存传输到USART、SPI、I2C等外设寄存器。
外设到内存:如从外设(ADC、USART、SPI等)读取数据到内存。
内存到内存:支持内存之间的直接数据传输,常用于数据拷贝。
传输类型:

支持字节、半字、字(8位、16位、32位)的数据传输。
支持循环模式: 许多DMA通道支持循环模式,适用于数据流的连续传输,比如ADC采样数据流到内存。

中断支持: DMA传输完成后可以触发中断,用于通知CPU,适合需要响应的数据传输操作。

优先级管理: DMA支持通道的优先级控制,可以根据应用需要调整不同DMA通道的传输优先级。

使用DMA的优势:
减轻CPU负担:DMA使得数据传输工作由DMA控制器完成,CPU只需进行配置和处理结果,从而减少了CPU的工作负担。
提高数据传输效率:DMA控制器能够以更高的速度进行数据传输,尤其适合于大数据量或高速数据流的应用。
节省功耗:通过DMA完成数据传输,CPU可进入低功耗模式,减少功耗消耗。
应用示例:
ADC数据采集:在STM32F103中,通常使用DMA将ADC转换结果直接传输到内存,而不需要CPU进行干预。这样可以实现高效的连续数据采集。
串口数据传输:可以使用DMA实现串口接收和发送数据的自动化,避免了CPU的频繁中断和数据处理。
SPI或I2C数据传输:DMA可以在不占用CPU的情况下,自动将SPI或I2C外设的数据传输到内存中。

 楼主| 捉虫天师 发表于 2025-2-25 14:57 | 显示全部楼层
在STM32F103上使用DMA时,首先需要配置DMA通道,然后配置外设(如ADC、USART等)以使用DMA进行数据传输。以下是一个简单的配置DMA传输的代码结构(以ADC为例):
  1. #include "stm32f10x.h"

  2. // 初始化DMA用于ADC
  3. void DMA_ADC_Init(void)
  4. {
  5.     // 启动DMA时钟
  6.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  7.     // 配置DMA1通道1用于ADC数据传输
  8.     DMA_InitTypeDef DMA_InitStructure;
  9.     DMA_StructInit(&DMA_InitStructure);  // 使用默认值进行初始化
  10.     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; // 外设地址:ADC数据寄存器
  11.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_Buffer;   // 内存地址:ADC数据存储数组
  12.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  // 外设为源
  13.     DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE;  // 数据缓冲区大小
  14.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不自增
  15.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址自增
  16.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外设数据宽度:16位
  17.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 内存数据宽度:16位
  18.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  // 循环模式
  19.     DMA_InitStructure.DMA_Priority = DMA_Priority_High; // 高优先级
  20.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 不支持内存到内存传输

  21.     // 初始化DMA1通道1
  22.     DMA_Init(DMA1_Channel1, &DMA_InitStructure);

  23.     // 启动DMA通道1
  24.     DMA_Cmd(DMA1_Channel1, ENABLE);

  25.     // 配置ADC,启用DMA模式
  26.     ADC_DMARequestAfterLastTransferCmd(ENABLE);  // 启用ADC转换结束后DMA请求
  27.     ADC_DMACmd(ADC1, ENABLE);  // 启用DMA功能
  28. }
 楼主| 捉虫天师 发表于 2025-2-25 14:58 | 显示全部楼层
TM32F103具备DMA功能,并且DMA配置非常灵活,适用于多种数据传输场景。通过使用DMA,STM32F103可以高效地进行数据传输,减轻CPU负担,并提高系统性能和响应速度。如果你的应用需要高效的数据传输或处理大量数据,利用DMA将是一个非常有用的选择。

你在使用STM32F103的时候使用过DMA吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

3276

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部