银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-07-28 | gingko | 初次建立 |
1. 在主界面选择File–>New Project 或者直接点击ACCEE TO MCU SELECTOR 2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 在搜索栏的下面,提供的各 种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32H750IBKx。 3. 配置RCC,使用外部时钟源 4. 时基源选择SysTick 5. 将LED对应的引脚PA10设置为GPIO_Output 6. 引脚模式配置 7. DMA配置 8. 打开DMA2的中断 9. 时钟源设置,选择外部高速时钟源,配置为最大主频 10. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK V5.27 11. 点击Code Generator,进行进一步配置
//定义src_buffer数组作为DMA传输数据源 //const关键字将src_buffer数组变量定义为常量类型 //表示数据存储在内部的FLASH中 const unsigned long int src_buffer[BUFFER_SIZE] = { 0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10, 0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20, 0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30, 0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40, 0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50, 0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60, 0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70, 0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80}; //定义DMA传输目标存储器 //存储在内部的SRAM中 unsigned long int dst_buffer[BUFFER_SIZE] = {0}; int main(void) { int i; HAL_Init(); SystemClock_Config(); i2c.initialize(); axp152.initialize(); axp152.set_dcdc1(3500);//[ARM & FPGA] axp152.set_dcdc2(1200);//[FPGA INT] axp152.set_dcdc3(3300);//[DCOUT3] axp152.set_dcdc4(3300);//[DCOUT4] axp152.set_aldo1(3300);//[BK3] axp152.set_aldo2(3300);//[ALDOOUT2] axp152.set_dldo1(3300);//[BK0] axp152.set_dldo2(3300);//[BK1] HAL_Delay(200); MX_GPIO_Init(); MX_DMA_Init(); HAL_DMA_Start(&hdma_memtomem_dma2_stream0,(unsigned long int)src_buffer,(unsigned long int)dst_buffer,(unsigned long int)BUFFER_SIZE); while(__HAL_DMA_GET_FLAG(&hdma_memtomem_dma2_stream0,DMA_FLAG_TCIF0_4) == SET); for(i = 0;i < BUFFER_SIZE;i++){ if(dst_buffer[i] != src_buffer[i]){ //测试失败 while(1){ HAL_Delay(500); LED_ON; HAL_Delay(500); LED_OFF; } } } //测试成功 LED_ON; while (1) { } }
void MX_DMA_Init(void) { //使能DMA控制器时钟 __HAL_RCC_DMA2_CLK_ENABLE(); //配置DMA工作方式 hdma_memtomem_dma2_stream0.Instance = DMA2_Stream0; hdma_memtomem_dma2_stream0.Init.Request = DMA_REQUEST_MEM2MEM; hdma_memtomem_dma2_stream0.Init.Direction = DMA_MEMORY_TO_MEMORY;//方向为存储器到存储器 hdma_memtomem_dma2_stream0.Init.PeriphInc = DMA_PINC_ENABLE; hdma_memtomem_dma2_stream0.Init.MemInc = DMA_MINC_ENABLE; hdma_memtomem_dma2_stream0.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;//外设数据宽度 hdma_memtomem_dma2_stream0.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;//存储器数据宽度 hdma_memtomem_dma2_stream0.Init.Mode = DMA_NORMAL; hdma_memtomem_dma2_stream0.Init.Priority = DMA_PRIORITY_HIGH;//优先级别为高 hdma_memtomem_dma2_stream0.Init.FIFOMode = DMA_FIFOMODE_ENABLE; hdma_memtomem_dma2_stream0.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; hdma_memtomem_dma2_stream0.Init.MemBurst = DMA_MBURST_SINGLE;//存储器突发单次传输 hdma_memtomem_dma2_stream0.Init.PeriphBurst = DMA_PBURST_SINGLE;//外设突发单次传输 if (HAL_DMA_Init(&hdma_memtomem_dma2_stream0) != HAL_OK) { Error_Handler(); } //DMA2中断配置 HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); }
DMA相关的寄存器是通过HAL库中的结构体DMA_TypeDef和DMA_Stream_TypeDef定义的。
typedef struct { __IO uint32_t CR; /* DMA stream x 配置寄存器 */ __IO uint32_t NDTR; /* DMA stream x 数据寄存器数 */ __IO uint32_t PAR; /* DMA stream x 外设地址寄存器 */ __IO uint32_t M0AR; /* DMA stream x 存储器0地址寄存器 */ __IO uint32_t M1AR; /* DMA stream x 存储器1地址寄存器 */ __IO uint32_t FCR; /* DMA stream x FIFO控制寄存器 */ } DMA_Stream_TypeDef; typedef struct { __IO uint32_t LISR; /* DMA低中断状态寄存器,地址偏移量:0x00 */ __IO uint32_t HISR; /* DMA高中断状态寄存器,地址偏移量:0x04 */ __IO uint32_t LIFCR; /* DMA低中断标志清除寄存器,地址偏移量:0x08 */ __IO uint32_t HIFCR; /* DMA高中断标志清除寄存器,地址偏移量:0x0C */ } DMA_TypeDef;
HAL库在DMA_TypeDef的基础上封装了一个结构体DMA_HandleTypeDef,定义如下:
typedef struct __DMA_HandleTypeDef { void *Instance; /* 注册基地址 */ DMA_InitTypeDef Init; /* DMA通讯参数 */ HAL_LockTypeDef Lock; /* DMA锁定对象 */ __IO HAL_DMA_StateTypeDef State; /* DMA传输状态 */ void *Parent; /* 父对象状态 */ void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); /* DMA传输完成回调 */ void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /* DMA半传输完成回调 */ void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /* DMA传输完成Memory1回调 */ void (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /* DMA传输半完成Memory1回调 */ void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma); /* DMA传输错误回调 */ void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); /* DMA传输中止回调 */ __IO uint32_t ErrorCode; /* DMA错误代码 */ uint32_t StreamBaseAddress; /* DMA流基址 */ uint32_t StreamIndex; /* DMA流索引 */ DMAMUX_Channel_TypeDef *DMAmuxChannel; /* DMAMUX通道基地址 */ DMAMUX_ChannelStatus_TypeDef *DMAmuxChannelStatus; /* DMAMUX通道状态基地址 */ uint32_t DMAmuxChannelStatusMask; /* DMAMUX通道状态掩码 */ DMAMUX_RequestGen_TypeDef *DMAmuxRequestGen; /* DMAMUX请求生成器基地址 */ DMAMUX_RequestGenStatus_TypeDef *DMAmuxRequestGenStatus; /* DMAMUX请求生成器状态地址 */ uint32_t DMAmuxRequestGenStatusMask; /* DMAMUX请求生成器状态掩码 */ }DMA_HandleTypeDef;
实验成功LED灯常亮,实验失败LED灯闪烁。