[国嵌攻略][059][2440-DMA程序设计]
初始化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程序设计]的更多相关文章
- [国嵌攻略][119][Linux中断处理程序设计]
裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的 ...
- [国嵌攻略][117][LED驱动程序设计]
LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() 1.编译/安装驱动 make cp leddev.ko ... ...
- [国嵌攻略][164][USB驱动程序设计]
USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.U ...
- [国嵌攻略][160][SPI驱动程序设计]
SPI Flash驱动 1.打开/drivers/mtd/devices/m25p80.c驱动文件.找到初始化m25p80_init函数,其中通过spi_register_driver来注册spi设备 ...
- [国嵌攻略][151][nandflash驱动程序设计]
初始化 打开/drivers/mtd/nand/s3c2410.c找到nand flash驱动程序代码,找到模块初始化函数s3c_nand_init,找到platform_driver中的probe函 ...
- [国嵌攻略][092][UDP网络程序设计]
server.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #inc ...
- [国嵌攻略][091][TCP网络程序设计]
server.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #inc ...
- [国嵌攻略][065][DM9000驱动程序设计]
移植代码:通过已有的可用的代码修改到新环境下运行. 代码编写: 初始化网卡 1.选中网卡 nLAN_CS BWSCON(0x48000000) DW4:01 16bit BANKCON4(0x4800 ...
- [国嵌攻略][143][LCD驱动程序分析]
LCD驱动程序分析 LCD驱动程序代码在/drivers/video/s3c2410fb.c文件中,在该驱动的s3c2410fb_init中注册了平台驱动,该驱动的初始化代码在s3c24xxfc_pr ...
随机推荐
- HBase0.98使用ReplicationAdmin管理集群同步
公司datalink平台负责从各种数据源读取数据并同步到其他的同步或者异构数据源,最近增加的HBase的reader利用到了Hbase的Replication特性. 正常情况下,我们配置HBase的R ...
- Java 多线程笔记
资料来源于网络,仅供参考学习. 1.A Java program ends when all its threads finish (more specifically, when all its ...
- 《MYSQL》----字符串的复杂函数,检索的七-天-排-重
接到了一个新的需求,拿到需求的时候瞬间有点头大,因为实在是有些棘手. 我们这个系统本身是个接口系统,总接口数大概在200个左右.外部会有很多用户在 不同的时间拿着不同参数去调我们的这些接口,用户的调集 ...
- S2 深入.NET和C#编程 一: 深入C#.NET框架
深入C#.NET框架 1..NET框架 之一 推荐一个代码管理平台,博客发布平台 git 之前的复习: 学习的网站: git github.com 2.类和对象的关系 Dept de ...
- Jenkins 学习笔记(三):我们的JAVA 项目是这么发布的
发布拓扑 1. 拓扑图 2. 流程说明: Git 插件从 Git Server 上面拉取源代码. Maven 插件将源代码安装我们设定的指令进行编译打包,存放于项目的 WorkSpace. Publi ...
- 前端开发chrome console的使用 :评估表达式 – Break易站
本文内容来自:chrome console的使用 :评估表达式 – Break易站 从 DevTools 控制台使用它的某个评估功能查看页面上任意项目的状态. DevTools 控制台让您可通过特定方 ...
- promise 和 async 的用法
promise // 先构造一个 promise 函数 // resolve 和 reject 都是一个函数 // resolve 在成功时调用 // reject 在失败时调用 function p ...
- 北斗卫星同步时钟(NTP网络时钟服务器)成功投运世界级工程港珠澳大桥
北斗卫星同步时钟(NTP网络时钟服务器)成功投运世界级工程港珠澳大桥 北斗卫星同步时钟(NTP网络时钟服务器)成功投运世界级工程港珠澳大桥 本文由北京华人开创科技公司提供 原址在 http://www ...
- flask WTForms源码分析及自定义WTForms
首先我们来创建一个From类 from wtforms.form import Form from wtforms import StringField from wtforms.validators ...
- 移动端吸顶(iOS与安卓)
有的时候经常会遇到移动端吸顶效果,开始我也只是上网查了一下,分别有iOS和android两种样式,如下: /*!*Android*!*/ .head { position: fixed; top: 0 ...