用户工具

站点工具


icore3l_15

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
icore3l_15 [2020/11/11 10:19]
zgf
icore3l_15 [2020/11/11 10:26] (当前版本)
zgf
行 122: 行 122:
   {   {
      ​if(dst_buffer[i] != src_buffer[i]) ​ //​测试失败      ​if(dst_buffer[i] != src_buffer[i]) ​ //​测试失败
- {+     {
          ​while(1)          ​while(1)
-    {+  {
            ​HAL_Delay(500);​            ​HAL_Delay(500);​
            ​LED_RED_ON;​            ​LED_RED_ON;​
            ​HAL_Delay(500);​            ​HAL_Delay(500);​
            ​LED_RED_OFF;​            ​LED_RED_OFF;​
-        ​}+         }
      ​}  ​      ​}  ​
   }   }
行 138: 行 138:
 } }
 </​code>​ </​code>​
 +=== 2.DMA初始化函数 === 
 +<code c> 
 +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);​ 
 +
 +</​code>​ 
 +=== 3.DMA寄存器结构体 === 
 +DMA相关的寄存器是通过HAL库中的结构体DMA_TypeDef 和DMA_Stream_TypeDef定义的 
 +<code c> 
 +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;​ 
 +</​code>​ 
 +=== 4.DMA句柄结构体DMA_HandleTypeDef === 
 +HAL库在DMA_TypeDef的基础上封装了一个结构体DMA_HandleTypeDef,定义如下: 
 +<code c> 
 +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;​ 
 +</​code>​ 
 +==== 五、实验步骤 ==== 
 +  - 把仿真器与iCore3L的SWD调试口相连(直接相连或者通过转接器相连); 
 +  - 把iCore3L通过Micro USB线与计算机相连,为iCore3L供电; 
 +  - 打开Keil MDK 开发环境,并打开本实验工程; 
 +  - 烧写程序到iCore3L上; 
 +  - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。 
 +==== 六、实验现象 ==== 
 +实验成功红色LED灯常亮,实验失败红色LED灯闪烁。
icore3l_15.1605061176.txt.gz · 最后更改: 2020/11/11 10:19 由 zgf