初始化DMA控制器

1.设置源地址

DISRC(0x4B000000)设置为发送数据的源地址,DISRCC0(0x4B0000004)设置为内存AHB总线,目的地址增长

2.设置目的地址

DIDST0(0x4B00000C)设置为发送数据的目的地址,DIDSTC0设置中断模式为数据减为0,设置串口APH总线,目的地址不增长

3.设置DMA控制寄存器

DCON0(0x4B000010)设置请求源为中断(26-24位),设置DMA请求源为硬件(23位),关闭重载(22位),设置发送数据长度(19-0位)

4.打开DMA传输

DMASKTRIG0(0x4B000020)设置为打开(1位)

/********************************************************************
*名称:dma
*作者:D
*时间:2015.11.17
*功能:直接存储访问控制器
********************************************************************/ /********************************************************************
* 宏定义
********************************************************************/
#define DISRC0 ( (*(volatile unsigned long *)0x4B000000) ) //DMA0初始化源地址寄存器
#define DISRCC0 ( (*(volatile unsigned long *)0x4B000004) ) //DMA0初始化源地址控制寄存器
#define DIDST0 ( (*(volatile unsigned long *)0x4B000008) ) //DMA0初始化目的地址寄存器
#define DIDSTC0 ( (*(volatile unsigned long *)0x4B00000C) ) //DMA0初始化目的地址控制寄存器
#define DCON0 ( (*(volatile unsigned long *)0x4B000010) ) //DMA0控制寄存器
#define DMASKTRIG0 ( (*(volatile unsigned long *)0x4B000020) ) //DMA0掩码触发寄存器 /********************************************************************
*名称:memcopy
*参数:
src 源地址
dst 目的地址
len 数据长度
*返回:
none
*功能:内存数据复制
*********************************************************************/
void memcopy(const char *src, char *dst, int len){
//初始化源地址和目的地址
DISRC0 = (unsigned long)src; //地址转换为32位无符号类型
DISRCC0 = 0; //LOC[1]:0 AHB, INC[0]:0 Increment
DIDST0 = (unsigned long)dst;
DIDSTC0 = 0; //CHK_INT[2]:0 TC reaches 0, LOC[1]:0 AHB, INC[0]:0 Increment //初始化DMA控制寄存器
//DMD_HS[31]:1 Handshake SYNC[30]:1 HCLK, INT[29]:0 Disable interrup, SERVMODE[27]:1 Whole service, SWHW_SEL[23]:1, RELOAD[22]:1 turned off reload, TC[19:0]:len
DCON0 = (1<<31)|(1<<30)|(1<<27)|(1<<22)|(len&0xFFFFF); //打开DAM传输
DMASKTRIG0 = (1<<1)|(1<<0);
}
/********************************************************************
*名称:uartsend
*参数:
adr 内存地址
len 数据长度
*返回:
none
*功能:使用DMA发送数据到串口
*********************************************************************/
void uartsend(const char *adr, int len){
//设置串口为DMA工作模式
UCON0 = (0x2<<2)|(0x2<<0); //设置recevi mode[1:0]:10 DMA mode, transmit mode[3:2]:10 DMA mode, clock selection[11:10]:00 PCLK
//注意:在串口初始化时已经初始化为了轮询模式,因为这里要使用DMA所以设置为DMA模式
//串口打印函数仍然使用轮询模式实现,设置成DMA模式后并没有恢复为轮询模式 //初始化源地址和目的地址
DISRC0 = (unsigned long)adr; //地址转换为32位无符号类型
DISRCC0 = 0; //LOC[1]:0 AHB, INC[0]:0 Increment
DIDST0 = (unsigned long)&UTXH0; //取UTXH0寄存器地址
DIDSTC0 = (1<<1)|(1<<0); //CHK_INT[2]:0 TC reaches 0, LOC[1]:1 APB, INC[0]:1 Fixed //初始化DMA控制寄存器
//DMD_HS[31]:1 Handshake SYNC[30]:0 PCLK, INT[29]:0 Disable interrup, SERVMODE[27]:0 Single service, SWHW_SEL[23]:1, RELOAD[22]:1 turned off reload, TC[19:0]:len
DCON0 = (1<<31)|(0<<30)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(len&0xFFFFF); //注意:DMD_HS设置为Demand和Handshake模式串口都可以正常,推荐的是Handshake,可以预防意外情况
//SERVMODE必须设置为Single模式,因为串口初始化时没有使用FIFO,如果使用Whole,只能收到最后一个字符 //打开DAM传输
DMASKTRIG0 = (1<<1); //设置ON_OFF[1]:1 turn on
}

参考网址:

http://blog.sina.com.cn/s/blog_56dee71a0100dwik.html~type=v5_one&label=rela_nextarticle

[国嵌攻略][059][2440-DMA程序设计]的更多相关文章

  1. [国嵌攻略][119][Linux中断处理程序设计]

    裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的 ...

  2. [国嵌攻略][117][LED驱动程序设计]

    LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() 1.编译/安装驱动 make cp leddev.ko ... ...

  3. [国嵌攻略][164][USB驱动程序设计]

    USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.U ...

  4. [国嵌攻略][160][SPI驱动程序设计]

    SPI Flash驱动 1.打开/drivers/mtd/devices/m25p80.c驱动文件.找到初始化m25p80_init函数,其中通过spi_register_driver来注册spi设备 ...

  5. [国嵌攻略][151][nandflash驱动程序设计]

    初始化 打开/drivers/mtd/nand/s3c2410.c找到nand flash驱动程序代码,找到模块初始化函数s3c_nand_init,找到platform_driver中的probe函 ...

  6. [国嵌攻略][092][UDP网络程序设计]

    server.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #inc ...

  7. [国嵌攻略][091][TCP网络程序设计]

    server.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #inc ...

  8. [国嵌攻略][065][DM9000驱动程序设计]

    移植代码:通过已有的可用的代码修改到新环境下运行. 代码编写: 初始化网卡 1.选中网卡 nLAN_CS BWSCON(0x48000000) DW4:01 16bit BANKCON4(0x4800 ...

  9. [国嵌攻略][143][LCD驱动程序分析]

    LCD驱动程序分析 LCD驱动程序代码在/drivers/video/s3c2410fb.c文件中,在该驱动的s3c2410fb_init中注册了平台驱动,该驱动的初始化代码在s3c24xxfc_pr ...

随机推荐

  1. ubuntu12.04destdrop删除不必要的软件

    sudo apt-get -y --auto-remove purge unity unity-2d*  sudo apt-get -y purge empathy  sudo apt-get -y ...

  2. ES6 let和const命令(3)

    const 用来声明常量.一旦声明,就不能改变. const在声明必须初始化,只声明不赋值会出错 const的作用域与let一样,只在声明的块级作用域有效. const命令声明的常量也不提升,同样存在 ...

  3. 阅读MDN文档之StylingBoxes(五)

    目录 BoxModelRecap Box properties Overflow Background clip Background origin Outline Advanced box prop ...

  4. install pytorch

    1. install and update pip3 2. install numpy and scipy 3. install pytorch

  5. Java基础--二进制运算

    1. System.out.println((byte)0x8f); 结果是? 2.System.out.println((byte)(0xc5>>1)); 结果是? 3.System.o ...

  6. JS中事件绑定的三种方式

    以下是搜集的在JS中事件绑定的三种方式.   1. HTML onclick attribute     <button type="button" id="upl ...

  7. VC6.0 突然打不开dsw 工程文件的解决方案

    在vc编程中,经常遇到dsw工程文件无法打开,或者打开后看不到类和变量的问题.特别是把代码从一台电脑上copy到另一台电脑上以后,常常会碰到这种奇怪的问题.有时在编辑状态下也会发生成员变量或函数提示不 ...

  8. 使用ControllerAdvice注意事项,Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.bind.MethodArgumentNotValidException]

    前言 ControllerAdvice非常好用,可以把系统内部的异常统一处理.用起来也很简单.比如,http://www.cnblogs.com/woshimrf/p/spring-web-400.h ...

  9. 轻松逃脱某防火墙对ss的探测

    ss里面有些诡异的日志(我用的是ss-go) 2017/10/1* 1*:5*:19 error getting request  ***:***  ***:*** EOF 这种日志不多,一般新开一个 ...

  10. kali系统教程:创建热点

    1:把网卡改成混杂模式 sduo airmon-ng start wlan0 2:aircrack套件创建一个fake-ap airbase-ng -e fake-ap -c wlan0mon 此时, ...