Stm32 DMA配置(库函数笔记)

1.简介

<1>:DMA,全称为:Direct Memory Access,即直接存储器访问。实际上,DMA作为一个硬件电路,实现在无CPU干预的情况下,内存(memory)和外设之间的联系

<2>:STM32最多有两个DMA的控制器,DMA1有7个通道,DMA2有5个通道,也存在一个仲裁器来判断优先级(共四级 很高 高 中 低)

<3>:DMA的通道连接着专用硬件的DMA请求,可以通过软件来配置

<4>:在DMA中,每个通道存在着三个事件标志(半传输,传输完成,传输失败),通过读取其中的0/1判断是否配置成功

<5>:可以实现外设(Peripheral)和内部存储器(Memory)之间的传输(单向,可相互转换)

<6>:可以实现内存到内存之间的传输(M2M)


2.配置过程

1.实现DMA时钟使能

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA1

2.实现DMA的初始化

    
        DMA_InitTypeDef DMA_InitStruct;        
        DMA1_MEM_LEN=cndtr;//设置每一次的数据传输量
	DMA_DeInit(DMA_CHx);//刷新设置
	//开始初始化
	DMA_InitStruct.DMA_BufferSize=cndtr;//数据传输量
	DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralDST;//director(目标)  DST(外设为目标) SRC(外设为源头)
	DMA_InitStruct.DMA_M2M= DMA_M2M_Disable;//不采用存储器到存储器
	DMA_InitStruct.DMA_MemoryBaseAddr=cmar;//设置存储器地址
	DMA_InitStruct.DMA_MemoryDataSize=DMA_PeripheralDataSize_Byte;//8位
	DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;//设置增量模式
	DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;//设置循环模式
	DMA_InitStruct.DMA_PeripheralBaseAddr=cpar;
	DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//8位
	DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
	DMA_InitStruct.DMA_Priority=DMA_Priority_Medium;//设置优先级
	
	DMA_Init(DMA_CHx,&DMA_InitStruct);//设置结构体
	
} 

3.开启传输过程(注意实现DMA数据值的刷新)

void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{ 
	DMA_Cmd(DMA_CHx,DISABLE);//关闭通道,设置DMA的数据值
	DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);//设置传输数据
	DMA_Cmd(DMA_CHx,ENABLE);//使能,产生数据传输
}	  

注:对于DMA初始化详解:

typedef struct {   
uint32_t DMA_PeripheralBaseAddr;   uint32_t DMA_MemoryBaseAddr;       uint32_t DMA_DIR;                uint32_t DMA_BufferSize;     
 uint32_t DMA_PeripheralInc;       uint32_t DMA_MemoryInc;        
uint32_t DMA_PeripheralDataSize;   uint32_t DMA_MemoryDataSize;      uint32_t DMA_Mode;             
uint32_t DMA_Priority;    
uint32_t DMA_M2M;      }
DMA_InitTypeDef; 

1.第一个参数 DMA_PeripheralBaseAddr 用来设置 DMA 传输的外设基地址,比如要进行串口 DMA 传输,那么外设基地址为串口接受发送数据存储器 USART1->DR 的地址,表示方法为 &USART1->DR,在传输之前要设置外设和内存的地址,一般是以指针的形式

 第二个参数DMA_MemoryBaseAddr为内存基地址,也就是我们存放DMA传输数据的内存地址。

 第三个参数 DMA_DIR 设置数据传输方向,决定是从外设读取数据到内存还送从内存读取数 据发送到外设,也就是外设是源地还是目的地,DST(distraction 目标),SRE(source 源头)所以选择值为 DMA_DIR_PeripheralDST。

 第四个参数 DMA_BufferSize 设置一次传输数据量的大小,(不超过65535)

 第五个参数 DMA_PeripheralInc 设置传输数据的时候外设地址是不变还是递增。如果设置 为递增,那么下一次传输的时候地址加 1

第六个参数 DMA_MemoryInc 设置传输数据时候内存地址是否递增。这个参数和 DMA_PeripheralInc 意思接近,只不过针对的是内存。

第七个参数 DMA_PeripheralDataSize 用来设置外设的的数据长度是为字节传输(8bits), 半字传输(16bits)还是字传输(32bits),这里我们是 8 位字节传输,所以值设置为 DMA_PeripheralDataSize_Byte。

 第八个参数 DMA_MemoryDataSize 是用来设置内存的数据长度,和第七个参数意思接近,这 里我们同样设置为字节传输 DMA_MemoryDataSize_Byte




  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 MCU中,串口是非常重要的通信接口。为了方便使用,ST官方提供了一套串口配置库函数,可以帮助开发者轻松配置串口参数和进行数据传输。下面是一个简单的使用STM32串口配置库函数的示例代码: ``` #include "stm32f4xx_hal.h" UART_HandleTypeDef huart2; void SystemClock_Config(void); int main(void) { HAL_Init(); SystemClock_Config(); __HAL_RCC_USART2_CLK_ENABLE(); huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart2); while (1) { char tx_data[] = "Hello, world!\n"; HAL_UART_Transmit(&huart2, (uint8_t*)tx_data, sizeof(tx_data), 1000); char rx_data[16]; HAL_UART_Receive(&huart2, (uint8_t*)rx_data, sizeof(rx_data), 1000); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1 |RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } ``` 这段代码使用了HAL库函数配置串口参数和进行数据传输。具体来说,它使用了USART2接口,设置了波特率为115200,数据位为8位,停止位为1位,无奇偶校验,发送和接收模式均开启。然后在while循环中,通过`HAL_UART_Transmit`函数发送一段字符串,然后通过`HAL_UART_Receive`函数接收一段字符串并存储到缓冲区中。开发者可以根据实际需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值