10.DMA

理论

12个通道:DMA1(7)DMA2(5)

通道

方向:存储器和存储器间(DMA_MEMORY_TO_MEMORY)、外设到存储器(DMA_PERIPH_TO_MEMORY)、存储器到外设(DMA_MEMORY_TO_PERIPH)

闪存、 SRAM、外设的SRAM、 APB1、 APB2和AHB外设均可作为访问的源和目标

数据宽度:字节(Byte 8)、半字(Half Word 16)、全字(Word 32)

可编程的数据传输数目: 0 ~ 65535

若可编程的数据传输数目为10,数据宽度为字节,半字,全字
传输总数据大小:10字节,20字节,40字节

若传输总数据大小与实际传输不符,会让传输标志(__HAL_DMA_GET_FLAG) ≠ 0

代码编写

存储器和存储器间实验

DMA配置

DMA配置

串口初始化参考:链接

Cube IDE代码

main.c

/* USER CODE BEGIN PD */
#define BUFF_SIZE 100	//37行
/* USER CODE END PD */

/* USER CODE BEGIN PV */
uint8_t SRC_Buff[BUFF_SIZE];	//48行
uint8_t DEST_Buff[BUFF_SIZE];
/* USER CODE END PV */

for(int i = 0; i < BUFF_SIZE; i++)	//95行
  SRC_Buff[i] = i+2;
/*
* 参数1:指向 DMA_HandleTypeDef 结构的指针,该结构包含指向 DMA 通道的配置信息
* 参数2:源内存缓冲区地址
* 参数3:目标内存缓冲区地址,参数4:从源传输到目标的数据长度
*/
HAL_DMA_Start(&hdma_memtomem_dma1_channel1, (uint32_t)SRC_Buff, (uint32_t)DEST_Buff, BUFF_SIZE);

//while里,111行
hdma_memtomem_dma1_channel1.Instance->CNDTR = BUFF_SIZE;	//可编程的数据传输数目:CNDTR
__HAL_DMA_ENABLE(&hdma_memtomem_dma1_channel1);	//启用指定的 DMA 通道
while(__HAL_DMA_GET_FLAG(&hdma_memtomem_dma1_channel1, DMA_FLAG_TC1) == 0);	//判断是否传输完成
HAL_UART_Transmit(&huart1, DEST_Buff, BUFF_SIZE, 100);	//串口发送据
__HAL_DMA_CLEAR_FLAG(&hdma_memtomem_dma1_channel1, DMA_FLAG_TC1);	//清楚标志
__HAL_DMA_DISABLE(&hdma_memtomem_dma1_channel1);	//禁用指定的 DMA 通道
HAL_Delay(1000);
  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这段代码是用于配置和启用DMA1通道1的功能,实现ADC采集数据的自动传输。 具体的意思如下: 1. DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; 配置DMA传输的外设地址为ADC1的数据寄存器地址。 2. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; 配置DMA传输的存储器地址为ADC_ConvertedValue变量的地址,即将采集到的数据存储到ADC_ConvertedValue数组中。 3. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; 配置DMA传输方向为从外设到存储器。 4. DMA_InitStructure.DMA_BufferSize = 2; 配置DMA传输数据的数量为2,即每次传输两个半字(16位)的数据。 5. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 配置DMA传输过程中外设地址不自增。 6. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 配置DMA传输过程中存储器地址自增。 7. DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord; 配置DMA传输数据宽度为半字(16位)。 8. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; 配置DMA传输数据宽度为半字(16位)。 9. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; 配置DMA传输模式为循环传输。 10. DMA_InitStructure.DMA_Priority = DMA_Priority_High; 配置DMA传输的优先级为高。 11. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; 配置DMA传输模式为非存储器到存储器传输。 12. DMA_Init(DMA1_Channel1, &DMA_InitStructure); 将以上配置应用到DMA1通道1上。 13. DMA_Cmd(DMA1_Channel1, ENABLE); 启用DMA1通道1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星仔_X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值