S3C6410--DMA裸机开发实例

S3C6410中DMA操作步骤:

1、决定使用安全DMAC(SDMAC)还是通用DMAC(DMAC);

2、开始相应DMAC的系统时钟,并关闭另外一组的时钟(系统默认开启SDMA时钟);

3、开启DMAC控制,设置DMAC_Configuration寄存器;

4、清除传输结束中断寄存器和错误中断寄存器;

5、选择合适的优先级通道;

6、设置通道的源数据地址和目的数据地址(设置DMACC_SrcAddr和DMACC_DestAddr);

7、设置通道控制寄存器0(设置DMACC_Control0);

8、设置通道控制寄存器1,(传输大小,设置DMACC_Control1);

9、设置通道配置寄存器;(设置DMACC_Configuration)

10、使能相应通道(设置DMACC_Configuratoin);

注意:在DMA工作过程中,通道寄存器Control0,Control1,Configuration的值近尽量不要读取,否则会产生副作用,导致传输失败!!


文件:dma.H

[cpp]  view plain  copy
  1. <span style="font-size:18px;">/******************************************************************************************* 
  2.  * 文件名:     dma.h 
  3.  * 功能:      S3C6410 DMA底层驱动函数 
  4.  * 作者:      肖仕刚 
  5.  * 创建时间:        2013年5月7日21:33 
  6.  * 最后修改时间:  2013年5月7日 
  7.  * 详细:       
  8. *******************************************************************************************/  
  9.   
  10. /***功能:DMA控制****/  
  11. #include "s3c6410_types.h"  
  12. #include "s3c6410_map.h"  
  13. #include "s3c6410_system.h"  
  14.   
  15. //模块功能:     DMA通道定义  
  16. typedef enum  
  17. {  
  18.     DMA_CH1 =   0,  
  19.     DMA_CH2 =   1,  
  20.     DMA_CH3 =   2,  
  21.     DMA_CH4 =   3,  
  22.     DMA_CH5 =   4,  
  23.     DMA_CH6 =   5,  
  24.     DMA_CH7 =   6,  
  25.     DMA_CH8 =   7     
  26. }DMA_CHx_Type;  
  27.   
  28. //模块功能:     DMA数据源定义  
  29. typedef enum  
  30. {  
  31.     //DMA0,SDMA0  
  32.     DMA_UART0_0 =   0,  
  33.     DMA_UART0_1 =   1,  
  34.     DMA_UART1_0 =   2,  
  35.     DMA_UART1_1 =   3,  
  36.     DMA_UART2_0 =   4,  
  37.     DMA_UART2_1 =   5,  
  38.     DMA_UART3_0 =   6,  
  39.     DMA_UART3_1 =   7,  
  40.     DMA_PCM0_TX =   8,  
  41.     DMA_PCM0_RX =   9,  
  42.     DMA_I2S0_TX =   10,  
  43.     DMA_I2S0_Rx =   11,  
  44.     DMA_SPI0_TX =   12,  
  45.     DMA_SPI0_RX =   13,  
  46.     DMA_HSI_I2SV40_TX=  14,  
  47.     DMA_HSI_I2SV40_RX=  15,  
  48.       
  49.     //DMA1,SDMA1  
  50.     DMA_PCM1_TX =   16,  
  51.     DMA_PCM1_RX =   17,  
  52.     DMA_I2S1_TX =   18,  
  53.     DMA_I2S1_Rx =   19,  
  54.     DMA_SPI1_TX =   20,  
  55.     DMA_SPI1_RX =   21,  
  56.     DMA_AC_PCMout   =   22,  
  57.     DMA_AC_PCMin    =   23,  
  58.     DMA_AC_MICin    =   24,  
  59.     DMA_PWM     =   25,  
  60.     DMA_IrDA    =   26,  
  61.     DMA_EXTERNAL    =   27,  
  62.     DMA_SECU_RX =   30,  
  63.     DMA_SECU_TX =   31  
  64. }DMA_Source_Type;  
  65.   
  66. //模块功能:     DMA AHB主机选择  
  67. typedef enum  
  68. {  
  69.     AHB_M1  =   0,  //主机1  
  70.     AHB_M2  =   1   //主机2     
  71. }AHB_Manager_Type;  
  72.   
  73. //模块功能:     DMA突发传输大小定义  
  74. typedef enum  
  75. {  
  76.     Burst_1 =   0x000,  
  77.     Burst_4 =   0x001,  
  78.     Burst_8 =   0x010,  
  79.     Burst_16=   0x011  
  80. }DMA_BurstSize_Type;  
  81.   
  82. //模块功能:     DMA传输宽度定义  
  83. typedef enum  
  84. {  
  85.     BitWidth_8 =    0x000,  
  86.     BitWidth_16=    0x001,  
  87.     BitWidth_32=    0x010  
  88. }DMA_BitWidth_Type;  
  89.   
  90. //模块功能:     DMA数据流模式定义  
  91. typedef enum  
  92. {  
  93.     MTM =   0x000,  
  94.     MTP =   0x001,  
  95.     PTM =   0x010,  
  96.     PTP =   0x011  
  97. }DMA_Flow_Type;  
  98.   
  99. //模块功能:     外设DMA:MTM请求  
  100. typedef enum  
  101. {  
  102.     TX0 =   0x00,  
  103.     TX1 =   0x01,  
  104.     RX0 =   0x10,  
  105.     RX1 =   0x11          
  106. }DMA_EXPREQ_Type;  
  107.   
  108.   
  109. /*********************************************************************************************************** 
  110. * 
  111. *模块功能:          对象、函数定义 
  112. * 
  113. ************************************************************************************************************/  
  114. void DMA_EnableCLK(void);  
  115. void DMA_SwitchEnable(DMA_TypeDef *DMA,u8 flag);  
  116. void DMA_ClearTCStatus(DMA_TypeDef *DMA);  
  117. void DMA_ClearErrorStatus(DMA_TypeDef *DMA);  
  118. void DMA_CHBurstREQ_EN(DMA_TypeDef *DMA,u8 ChNo,u8 Flag);  
  119. void DMA_CHSingleREQ_EN(DMA_TypeDef *DMA,u8 ChNo,u8 Flag);  
  120. void DMA_WaitComplete(DMA_TypeDef *DMA, DMA_CHx_Type ChNo);  
  121.   
  122. void CH_SwitchEnable(DMA_CH_Config *ch,u8 flag);  
  123. void CH_SetSDAddr(DMA_CH_Config *CH,u32 SAddr,u32 DAddr);  
  124. void CH_SetLII(DMA_CH_Config *ch,u32 LIIAddr,u8 LM);  
  125. void CH_SetControl0(DMA_CH_Config *ch);  
  126. void CH_SetControl1(DMA_CH_Config *ch);  
  127. void CH_SetConfiguration(DMA_CH_Config *ch);  
  128.   
  129. </span>  

文件:dma.C

[cpp]  view plain  copy
  1. <span style="font-size:18px;">/************************************************************************************************************* 
  2.  * 文件名:     dma.c 
  3.  * 功能:      S3C6410 DMA底层驱动函数 
  4.  * 作者:      肖仕刚 
  5.  * 创建时间:        2013年5月7日21:33 
  6.  * 最后修改时间:  2013年5月7日 
  7.  * 详细:       
  8. *************************************************************************************************************/  
  9. /***功能:DMA控制****/  
  10. #include "dma.h"  
  11. #include "uart.h"  
  12.   
  13. #define DMA_Enable      0x1  
  14. #define DMA_Disable     0x0  
  15.   
  16.   
  17. //控制器0参数定义    
  18. #define TERMCOUNT_INTEN     0x0<<31                   //终点计数中断使能  
  19. #define SRC_INCREMENT       0x1<<27                   //源地址自增长  
  20. #define DEST_INCREMENT      0x1<<26                   //目的地址自增长  
  21. #define DEST_MASTERSEL      AHB_M1<<25                //目的AHB主机选择  
  22. #define SRC_MASTERSEL       AHB_M1<<24                //源AHB主机选择  
  23. #define DEST_TRANWIDTH      (0x7&BitWidth_8)<<21  //目的传输宽度  
  24. #define SRC_TRANWIDTH       (0x7&BitWidth_8)<<18  //源传输宽度  
  25. #define DEST_BURSTWIDTH     (0x7&Burst_1)<<15     //目的突发宽度  
  26. #define SRC_BURSTWIDTH      (0x7&Burst_1)<<12     //源突发宽度  
  27.   
  28. //控制器1参数配置  
  29. #define TRANSFER_SIZE       0x64        //数据传输大小  
  30.   
  31. //Configuration寄存器参数  
  32. #define HALT                0x0<<18       //通道终止控制(保留数据)  
  33. #define LOCK_ENABLE         0x0<<16       //传输锁定使能  
  34. #define TERMCOUNT_INTMASK   0x0<<15       //通道终点计数中断屏蔽位  
  35. #define ERROR_INTMASK       0x0<<14       //通道错误中断屏蔽位  
  36. #define FLOW_TYPE           MTM         //数据流控制和传输类型  
  37. #define ONENAND_MODEDEST    0x0<<10       //oneNand模式目的选择  
  38. #define DEST_PERIPHERAL     0x0<<6        //oneNand模式目的外设选择  
  39. #define ONENAND_MODESRC     0x0<<5        //oneNand模式源选择  
  40. #define SRC_PERIPHERAL      0x0<<1        //oneNand模式源外设选择  
  41.   
  42. //ConfigurationExp寄存器参数设置  
  43. #define EXPREQ_SEL      TX0     //外设DMA:MTM请求选择  
  44. #define EXPREQ_ENA      DMA_Enable  //外设DMA请求使能  
  45.   
  46.   
  47.   
  48. void DMA_EnableCLK(void)  
  49. {  
  50.     Set_CLK_GATE(HCLK_DMA0, 0x1);  
  51.     Set_CLK_GATE(HCLK_DMA1, 0x1);  
  52.     Set_CLK_GATE(HCLK_SDMA0,0x0);  
  53.     Set_CLK_GATE(HCLK_SDMA1,0x0);     
  54. }  
  55.   
  56.   
  57.   
  58.   
  59. /************************************************************************************************************************* 
  60. *函数        :    void DMA_SwitchEnable(DMA_TypeDef *DMA,u8 flag) 
  61. *功能        :    DMA使能、禁能转换 
  62. *参数        :    DMA 
  63. *返回        :    无 
  64. *依赖        :    底层宏定义 
  65. *作者        :    肖仕刚 
  66. *时间        :    2013年05月16 
  67. *最后修改时间:    2013年05月16 
  68. *说明        :    - 
  69. *************************************************************************************************************************/  
  70. void DMA_SwitchEnable(DMA_TypeDef *DMA,u8 flag)  
  71. {  
  72.     if(flag&DMA_Enable)  
  73.         DMA->Configuration   =   DMA_Enable;   
  74.     else  
  75.         DMA->Configuration   =   DMA_Disable;  
  76. }  
  77.   
  78. /************************************************************************************************************************* 
  79. *函数        :    void DMA_ClearTCStatus(DMA_TypeDef *DMA) 
  80. *功能        :    DMA终点计数中断清除 
  81. *参数        :    DMA 
  82. *返回        :    无 
  83. *依赖        :    底层宏定义 
  84. *作者        :    肖仕刚 
  85. *时间        :    2013年05月16 
  86. *最后修改时间:    2013年05月16 
  87. *说明        :    - 
  88. *************************************************************************************************************************/  
  89. void DMA_ClearTCStatus(DMA_TypeDef *DMA)  
  90. {  
  91.     DMA->IntTCClear |= 0xFF;     //寄存器写1清除  
  92. }  
  93.   
  94. /************************************************************************************************************************* 
  95. *函数        :    void DMA_ClearErrorStatus(DMA_TypeDef *DMA) 
  96. *功能        :    DMA错误中断清除 
  97. *参数        :    DMA 
  98. *返回        :    无 
  99. *依赖        :    底层宏定义 
  100. *作者        :    肖仕刚 
  101. *时间        :    2013年05月16 
  102. *最后修改时间:    2013年05月16 
  103. *说明        :    - 
  104. *************************************************************************************************************************/  
  105. void DMA_ClearErrorStatus(DMA_TypeDef *DMA)  
  106. {  
  107.     DMA->IntErrClr   |= 0xFF;        //寄存器写1清除     
  108. }  
  109.   
  110. /************************************************************************************************************************* 
  111. *函数        :    void DMA_CHBurstREQ_EN(DMA_TypeDef *DMA,u8 ChNo,u8 Flag) 
  112. *功能        :    DMA通道软件突发请求使能 
  113. *参数        :    DMA,ChNo:通道号,Flag:使能/禁能位 
  114. *返回        :    无 
  115. *依赖        :    底层宏定义 
  116. *作者        :    肖仕刚 
  117. *时间        :    2013年05月16 
  118. *最后修改时间:    2013年05月16 
  119. *说明        :    - 
  120. *************************************************************************************************************************/  
  121. void DMA_CHBurstREQ_EN(DMA_TypeDef *DMA,u8 ChNo,u8 Flag)  
  122. {  
  123.     DMA->SoftBReq &= ~(1<<ChNo);   //复位相关位  
  124.     DMA->SoftBReq |= (Flag<<ChNo);  
  125. }  
  126.   
  127. /************************************************************************************************************************* 
  128. *函数        :    void DMA_CHSingleREQ_EN(DMA_TypeDef *DMA,u8 ChNo,u8 Flag) 
  129. *功能        :    DMA通道软件单一请求使能 
  130. *参数        :    DMA,ChNo:通道号,Flag:使能/禁能位 
  131. *返回        :    无 
  132. *依赖        :    底层宏定义 
  133. *作者        :    肖仕刚 
  134. *时间        :    2013年05月16 
  135. *最后修改时间:    2013年05月16 
  136. *说明        :    - 
  137. *************************************************************************************************************************/  
  138. void DMA_CHSingleREQ_EN(DMA_TypeDef *DMA,u8 ChNo,u8 Flag)  
  139. {  
  140.     DMA->SoftSReq &= ~(1<<ChNo);   //复位相关位  
  141.     DMA->SoftSReq |= (Flag<<ChNo);  
  142. }  
  143.   
  144.   
  145. /************************************************************************************************************************* 
  146. *函数        :    void DMA_WaitComplete(DMA_TypeDef *DMA, DMA_CHx_Type ChNo)   
  147. *功能        :    DMA通道传输完成 
  148. *参数        :    DMA,ChNo:通道号 
  149. *返回        :    无 
  150. *依赖        :    底层宏定义 
  151. *作者        :    肖仕刚 
  152. *时间        :    2013年05月16 
  153. *最后修改时间:    2013年05月16 
  154. *说明        :    - 
  155. *************************************************************************************************************************/  
  156. void DMA_WaitComplete(DMA_TypeDef *DMA, DMA_CHx_Type ChNo)    
  157. {    
  158.     while(!(DMA->RawIntTCStatus & (1 << ChNo)));    
  159. }  
  160.   
  161.   
  162.   
  163.   
  164.   
  165. /************************************************************************************************************************* 
  166. *函数        :    void CH_SwitchEnable(DMA_CH_TypeDef *ch,u8 flag) 
  167. *功能        :    DMA通道使能、禁能转换 
  168. *参数        :    DMA 
  169. *返回        :    无 
  170. *依赖        :    底层宏定义 
  171. *作者        :    肖仕刚 
  172. *时间        :    2013年05月16 
  173. *最后修改时间:    2013年05月16 
  174. *说明        :    - 
  175. *************************************************************************************************************************/  
  176. void CH_SwitchEnable(DMA_CH_Config *ch,u8 flag)  
  177. {  
  178.     if(flag&DMA_Enable)  
  179.         ch->Configuration    =   DMA_Enable<<0;      
  180.     else  
  181.         ch->Configuration    =   DMA_Disable<<0;  
  182. }  
  183.   
  184. /************************************************************************************************************************* 
  185. *函数        :    void CH_SetSDAddr(DMA_CH_Config *CH,u32 SAddr,u32 DAddr) 
  186. *功能        :    设置通道源地址,目的地址 
  187. *参数        :    ch:通道,SAddr:源地址,DAddr:目的地址 
  188. *返回        :    无 
  189. *依赖        :    底层宏定义 
  190. *作者        :    肖仕刚 
  191. *时间        :    2013年05月16 
  192. *最后修改时间:    2013年05月16 
  193. *说明        :    - 
  194. *************************************************************************************************************************/  
  195. void CH_SetSDAddr(DMA_CH_Config *CH,u32 SAddr,u32 DAddr)  
  196. {  
  197.     CH->SrcAddr      =   SAddr;  
  198.     CH->DestAddr =   DAddr;  
  199.   
  200. }  
  201.   
  202. /************************************************************************************************************************* 
  203. *函数        :    void CH_SetLII(DMA_CH_Config *ch,u32 LIIAddr,u8 LM) 
  204. *功能        :    设置通道LII 
  205. *参数        :    ch:通道,LM:加载模式(0,1) 
  206. *返回        :    无 
  207. *依赖        :    底层宏定义 
  208. *作者        :    肖仕刚 
  209. *时间        :    2013年05月16 
  210. *最后修改时间:    2013年05月16 
  211. *说明        :    - 
  212. *************************************************************************************************************************/  
  213. void CH_SetLII(DMA_CH_Config *ch,u32 LIIAddr,u8 LM)  
  214. {  
  215.     ch->LII |= (LIIAddr<<2);   //设置下一个LII地址  
  216.     ch->LII |= (LM<<0);        //设置加载模式  
  217. }  
  218.   
  219. /************************************************************************************************************************* 
  220. *函数        :    void CH_SetControl0(DMA_CH_Config *ch) 
  221. *功能        :    通道控制器0配置 
  222. *参数        :    ch:通道 
  223. *返回        :    无 
  224. *依赖        :    底层宏定义 
  225. *作者        :    肖仕刚 
  226. *时间        :    2013年05月16 
  227. *最后修改时间:    2013年05月16 
  228. *说明        :    - 
  229. *************************************************************************************************************************/  
  230. void CH_SetControl0(DMA_CH_Config *ch)  
  231. {  
  232.     ch ->Control0    =   SRC_BURSTWIDTH  
  233.                     |   DEST_BURSTWIDTH  
  234.                     |   SRC_TRANWIDTH  
  235.                     |   DEST_TRANWIDTH  
  236.                     |   SRC_MASTERSEL  
  237.                     |   DEST_MASTERSEL  
  238.                     |   DEST_INCREMENT  
  239.                     |   SRC_INCREMENT  
  240.                     |   TERMCOUNT_INTEN ;   //功能设置  
  241. }  
  242.   
  243. /************************************************************************************************************************* 
  244. *函数        :    void CH_SetControl1(DMA_CH_Config *ch) 
  245. *功能        :    通道控制器1配置 
  246. *参数        :    ch:通道 
  247. *返回        :    无 
  248. *依赖        :    底层宏定义 
  249. *作者        :    肖仕刚 
  250. *时间        :    2013年05月16 
  251. *最后修改时间:    2013年05月16 
  252. *说明        :    - 
  253. *************************************************************************************************************************/  
  254. void CH_SetControl1(DMA_CH_Config *ch)  
  255. {  
  256.     ch ->Control1 |= (0x1FFFFFF & TRANSFER_SIZE);    //设置传输大小      
  257. //ch ->Control1 = TRANSFER_SIZE;  
  258.   
  259. }  
  260.   
  261. /************************************************************************************************************************* 
  262. *函数        :    void CH_SetConfiguration(DMA_CH_Config *ch) 
  263. *功能        :    通道配置寄存器 
  264. *参数        :    ch:通道 
  265. *返回        :    无 
  266. *依赖        :    底层宏定义 
  267. *作者        :    肖仕刚 
  268. *时间        :    2013年05月16 
  269. *最后修改时间:    2013年05月16 
  270. *说明        :    - 
  271. *************************************************************************************************************************/  
  272. void CH_SetConfiguration(DMA_CH_Config *ch)  
  273. {  
  274.     ch->Configuration    |=  ONENAND_MODESRC  
  275.                         |   DEST_PERIPHERAL  
  276.                         |   ONENAND_MODEDEST  
  277.                         |   FLOW_TYPE  
  278.                         |   ERROR_INTMASK  
  279.                         |   TERMCOUNT_INTMASK  
  280.                         |   LOCK_ENABLE  
  281.                         |   HALT;                       //配置寄存器功能设置  
  282. }  
  283. </span>  

文件:mian.C

[cpp]  view plain  copy
  1. <span style="font-size:18px;">/************************************************************************************************************* 
  2.  * 文件名:     main.c 
  3.  * 功能:      S3C6410 DMA测试函数 
  4.  * 作者:      肖仕刚 
  5.  * 创建时间:    2013年5月16日21:33 
  6.  * 最后修改时间   2013年5月16日 
  7.  * 详细:      基于DMA的串口初始化,发送,接收,配置等 
  8.  * 警告:      DMA测试过程中不要输出寄存器的值以免产生副作用 
  9. *************************************************************************************************************/  
  10. #include "dma.h"  
  11. #include "uart.h"  
  12. #include <stdio.h>  
  13.   
  14. //主函数  
  15. void main(void)  
  16. {  
  17.     u8 src[100] =   "1234567898765432123456987\n";  
  18.     u8 dest[100]=   "000000\n";  
  19.     u8 str[40];  
  20.   
  21.     UART_Init();  
  22.       
  23.     //使能DMA系统时钟  
  24.     DMA_EnableCLK();  
  25.   
  26.     //开启DMA  
  27.     DMA_SwitchEnable(DMAC0,0x01);  
  28.       
  29.     //清除先前传输结束中断标志位  
  30.     DMA_ClearTCStatus(DMAC0);  
  31.   
  32.     //清除先前错误中断标志位  
  33.     DMA_ClearErrorStatus(DMAC0);  
  34.       
  35.       
  36.     //设置通道源地址和目的地址   
  37.     CH_SetSDAddr(&DMAC0->Channel[DMA_CH1],(u32)src,(u32)dest);  
  38.       
  39.     //设置通道控制信息  
  40.     CH_SetControl0(&DMAC0->Channel[DMA_CH1]);  
  41.       
  42.     //设置通道传输大小  
  43.     CH_SetControl1(&DMAC0->Channel[DMA_CH1]);  
  44.   
  45.     //设置通道配置信息  
  46.     CH_SetConfiguration(&DMAC0->Channel[DMA_CH1]);  
  47.   
  48.     //使能通道开始工作  
  49.     CH_SwitchEnable(&DMAC0->Channel[DMA_CH1],0x1);  
  50.       
  51.     //延时  
  52.     Delay(5000);  
  53.   
  54.     sprintf((char *)str,"DMACCH_ EnbldChns:0x%X---\n",DMAC0->EnbldChns);  
  55.     UART_SendStr((char *)str);  
  56.   
  57.     UART_SendStr((char *)src);  
  58.     UART_SendStr((char *)dest);  
  59.       
  60.     UART_SendStr((char *)"Test Complete!!\n");  
  61.       
  62. }  
  63. </span>  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值