初始化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. bzoj 4446: [Scoi2015]小凸玩密室

    Description 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯 泡即可逃出密室.每个灯泡有个权值Ai,每条边也有个权值bi.点亮第1个灯泡不需要 ...

  2. Oracle数据库中插入日期型数据(to_date的用法)(转载)

    往Oracle数据库中插入日期型数据(to_date的用法) INSERT  INTO  FLOOR  VALUES  ( to_date ( '2007-12-20 18:31:34' , 'YYY ...

  3. lesson - 10 课程笔记

    CTRL+C CTRL+D :前者用于结束一个程序,后者用于结束终端输入. --符号 *:匹配任意长度的任意字符 ?:匹配任意一个字符 #: shell 中表注释 \: 脱意符号 []:任意属于字符组 ...

  4. 9.nginx使用redis用缓存

    需要使用到的第三方模块,因为在有道笔记上面,所以为办法直接给你们,需要的话给我私信或者邮件(913956964@qq.com) 1.编译安装,添加上述扩展插件 ./configure --prefix ...

  5. 从源码(编译)安装golang

    从源码安装golang 通常情况下,安装go只需要在官网(https://golang.org/dl/)下载适合系统的二进制发布包,按照安装说明进行安装即可. 对于Linux, Mac OS X和Fr ...

  6. Spring基础篇——Spring容器和应用上下文理解

    上文说到,有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走啊,走到哪里,需要另外的对象来协助了,就给Spring说,我想 ...

  7. 《精通Spring 4.X企业应用开发实战》读书笔记1-1(IoC容器和Bean)

    很长一段时间关注在Java Web开发的方向上,提及到Jave Web开发就绕不开Spring全家桶系列,使用面向百度,谷歌的编程方法能够完成大部分的工作.但是这种不系统的了解总觉得自己的知识有所欠缺 ...

  8. idea激活网站地址,亲测可用(windows7,idea 2016)

    help-register-license server,然后输入 http://idea.iteblog.com/key.php

  9. Linux系统使用-CentOS7 for Redis

    Redis系列(一):CentOS系统安装与环境配置 1.为什么使用虚拟机和CentOS 最近Redis比较 热门而且易于使用 而 Redisd对window支持并不好. 引用官方说明:http:// ...

  10. Wechat 微信端正确播放audio、video的姿势

    在开发微信项目时,有在项目中播放音频(audio)和视频(video)的需求: 在开发中,我们会遇到的问题 audio.video在Android和IOS系统上的兼容性: video播放完成后,跳出浏 ...