S3C2440 Mini 2440 DMA方式实现Uart(串口)通信

发布者:upsilon30最新更新时间:2016-07-11 来源: eefocus关键字:S3C2440  DMA方式  Uart(串口)通信 手机看文章 扫描二维码
随时随地手机看文章
搞了好久,终于完成了DMA方式实现串口通信。使用DMA不是很难,主要是DCONn的配置比较麻烦以及几种模式的理解。

 

DMA service mode:single service&Whole service。前一模式下,一次DMA请求完成一项原子操作,并且transfer count的值减1。后一模式下,一次DMA请求完成一批原子操作,直到transfer count等于0表示完成一次整体服务。具体对应DCON[27]。

 

DMA DREQ/DACK PROTOCOL:DMA请求和应答的协议有两种,Demond mode 和 Handshake mode。两者对Request和Ack的时序定义有所不同:

在Demond模式下,如果DMA完成一次请求后如果Request仍然有效,那么DMA就认为这是下一次DMA请求,并立即开始下一次的传输;

在Handshake模式下,DMA完成一次请求后等待Request信号无效,如果Request无效,DMA会无效ACK两个时钟周期,再等待下一次Request。

 


/***********************************************************************

功能:用DMA方式实现串口传输,
        将字符串数据通过DMA0通道传递给UTXH0,然后在终端
        显示。数据传输完后,DMA0产生中断,LED1亮。
************************************************************************
Mini2440 调试通过
2012-08-05      
*********************************************************************/
#include "2440addr.h"
#define MDIV 92
#define SDIV 1
#define PDIV 1
#define HDIVN 2
#define PDIVN 1
#define PCLK_  50000000
#define Led1_on() {rGPBDAT&=(~(1<<5)); }


char  *SendBuffer = "Hello world!" ;    //source data


/*****************LED 初始化************************************/
void Led_init()
{
    rGPBCON &=~((3<<10) | (3<<12) | (3<<14) | (3<<16)|(3<<0));
    rGPBCON |=((1<<10) | (1<<12) | (1<<14) | (1<<16)|(1<<0));
    rGPBUP &=~((1<<5) | (1<<6) | (1<<7) | (1<<8)|(1<<0));
    rGPBDAT =0xfffe;
}


/*****************UART0  io口初始化****************************/
void Uart0_io_init()      //uart io port
{
    rGPHCON =0xa0; //gph2,gph3 used for txd0,rxd0.
    rGPHUP=0x0;       //enable the pull up function 
}


/***************************UART0配置****************************/
void Uart0_init(int bandrate)
{
    rULCON0 |=0x3;                    //8-bit data ,1bit stop
    rUCON0  |=((1<<0) | (1<<3) | (2<<10) );   //used pclk as the clock,  transmit use DMA mode  ,  receive use  polling mode
    rUBRDIV0=(int)(PCLK_/(bandrate*16))-1 ;    //bandrate is 115200


}


/***************************时钟配置********************************************/
void Clk_init( )
{
    rCLKCON |=(1<<10);                                     //enable uart0 used pclk
    rLOCKTIME=0xffff;                                        //locktime
    rCLKCON |=(1<<13);                                      //gpio enable pclk                          
    rCLKDIVN =((PDIVN<<0) | (HDIVN<<1));    //1:4:8
    rMPLLCON |=((MDIV<<12) | (PDIV<<4) | (SDIV<<0));   // f_out=400MHZ
 //__asm{
                // mrc   p15, 0, r1, c1, c0, 0
               //  orr     r1, r1, #0xc0000000
                  //mcr p15, 0, r1, c1, c0, 0
        //   }
}


/*****************************DMA初始化***************************************/
void Dma_init()
{
    rGPBCON |=((1<<19)|(1<<21));              //GPB9,10 used for nXDACK0,nXDREQ0
    rDISRC0=(U32)SendBuffer;                    //source data address
    rDISRCC0 |=((0<<1)|(0<<0));                 //address increment , the source is in the AHB
    rDIDST0=(U32)UTXH0;                          //destination  is UTXH0
    rDIDSTC0 |=((0<<2)|(1<<1)|(1<<0));        //address not change ,  APB  ,   enable interrupt
   
  
    rDCON0 |=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(0<<20)|(12);   
   //Handshake mode, PCLK synchronization ,enable dma interrupt , unit transfer ,  single service , 
   //UART0 is the request source, H/W request mode  ,disable auto reload ,  Byte transmit  ,12 Byte data
    rDMASKTRIG0=(0<<2)|(1<<1)|(0<<0);  //start dma transmit
}


/**********************DMA中断初始化***************************************/
void Dma_eint()
{
  rINTMSK &=~(1<<17);  //open the dma0 interrupt
}


/************************DMA中断服务函数*********************************/
void __irq Dma_isr()
{
    rSRCPND|=(1<<17);   //clear the srcpnd
    rINTPND |=(1<<17);   //clear the int pnd
    Led1_on();
}



int Main()
{     
      Clk_init();  
      Led_init();
      Uart0_io_init();
      Uart0_init(115200);
      Dma_eint();
      pISR_DMA0=(U32) Dma_isr;
      Dma_init();    
      while(1)
      {
       ;
      }  
      return 0;
}
关键字:S3C2440  DMA方式  Uart(串口)通信 引用地址:S3C2440 Mini 2440 DMA方式实现Uart(串口)通信

上一篇:对S3C2440读取NAND Flash的总结
下一篇:2440初始化存储器原理(接上一篇)

推荐阅读最新更新时间:2024-03-16 14:59

iic裸机与linux通信,裸机系列——S3C2440IIC通信
经过一周左右的时间终于是把IIC弄的个差不多了,我只能说对于每一个程序都要认真对待,每个程序的编写都是一种进步。对于IIC,给我的感觉是这个东西单片机的时候也知道,但是没有调出来,现在RAM裸机编程正好好好的学习的一下,但是虽然对于2440的IIC驱动只需要配置好寄存器和把握好时序就可以了,但是我还是经过了很多的一段痛苦的时期,不过现在回想看看,都是一种成长的经历,让人值得骄傲。因为我坚持过来了。好的,说正点的,首先IIC编程依然感谢乐于奉献的赵老师,他的博客地址很多详细的介绍我就不多说了,赵老师的博客讲得很详细,和以前一样讲一下自己的体会和问题。 1.AT24C08芯片,是一款EEPROM,8K,不过是8Kbit,1024X
[单片机]
基于ARM处理器S3C2440的无线监控系统设计
  无线网络技术在近一两年开始全面普及,无论是在家庭用户还是企业用户中,我们都能看到无线技术的影子。 认识无线监控,相信大家对有线监控系统比较了解,有线监控系统主要由网络摄像机、云台、视频服务器、监控终端等设备组成。而无线监控系统所需要的设备则比较简单,它只需要无线网络摄像机、无线AP、监控终端等设备组成,如果需要远距离无线监控,还要增加户外无线网桥等设备。   在此提出一种基于嵌入式Windows CE5.O的无线视频监控系统。解决了传统视频监控系统成本高、体积大、传输距离有限、功耗大、安装不方便等问题。该系统的设计将为无线视频监控提供一种新的思路、方法和技术路线;在安防、远程教育、远程视频会议、医疗系统等无线视频领域具有广阔
[单片机]
基于ARM处理器<font color='red'>S3C2440</font>的无线监控系统设计
讨论s3c2440的时钟与DMA
s3c2440的时钟与电源管理模块包括3个部分,时钟控制,USB控制和电源控制。时钟源如下图有两个,左边的是外部晶振提供,右边是外部时钟提供。 由这个表可以看出来时钟源的选择是在引导的时候由OM 引脚决定的。 如图,刚上电一小段时间后,FCLK=晶振时钟,等待4个时钟周期后,PLL锁存有效,自动插入一段PLL Lock Time,即PLL锁定时间,此时,FCLK停止震荡,CPU停止工作,Lock time的长短由寄存器LOCKTIME设定。PLL Lock Time之后,MPLL输出正常,CPU工作在新的FCLK下。 有两个PLL,一个是MPLL,一个是UPLL。MPLL分频得
[单片机]
讨论<font color='red'>s3c2440</font>的时钟与<font color='red'>DMA</font>
U-boot 在 mini2440-S3C2440 上的移植(2)
1.本文主要讲解U-boot 在 mini2440-S3C2440 上的移植,用到的版本为 U-boot-2009.11_tekkaman-master,下载地址: https://download.csdn.net/download/jinanhezhuang/20823342?spm=1001.2014.3001.5501 1.下载官方u-boot:下载地址: 2.用xftp软件将压缩包上传到ubuntu; 3.解压安装包;tar命令 4.建立开发板文件: 我们将在smdk2410基础上移植,为了不破坏原本的代码,在board目录下将smdk2410复制到board下新建的文件夹tekkaman中的mini2440中;将m
[单片机]
U-boot 在 mini2440-S3C2440 上的移植(2)
S3C2440开发板学习——openjtag下载BootLoader
首先,将oflash.exe和FTD2XX.dll放置于C:WindowsSystem32文件夹中,使Dos可以执行oflash命令; 其次,在DOS命令中进入BootLoader所在的文件夹,使用cd+绝对路径,选择uboot.bin的文件路径; 然后,执行oflash命令,选择eeprom、IC、address、下载程序(u-boot.bin)等参数; 最后,启动程序程序通过openjtag口,将程序下载到开发板。 注意问题: 1、nand/nor flash的异同。相似点:nor flash 和nand flash均属于eeprom,可以进行反复的程序擦拭和读写。区别点
[单片机]
S3C2440串口(1)
1.S3C2440串口概述 串口通讯一般要增加电平转换电路,原因是TTL/CMOS电平与RS232电平不一致: TTL/CMOS电平: CMOS电平: 常用的电平转换芯片是MAX3232。 S3C2440有3个独立的异步串口,可以选择工作在中断或DMA方式下。每个UART包括一个波特率发生器、发送器、接收器和一个控制单元。 UART有FIFO模式和非FIFO模式。FIFO模式下可以利用64字节的发送/接收缓冲寄存器,非FIFO模式下只使用了发送/接收缓冲寄存器中的1个字节。本篇入门级以非FIFO为例。 2.串口设置及相关寄存器 串口引脚是GPIO复用的。本篇UART只用3根引脚:TXD、RXD、GND。 TXD0 –
[单片机]
S3C2440看门狗解析
S3C2440A的看门狗定时器是用于当其由于噪声和系统错误引起的故障干扰时恢复控制器的工作。它可以被用作普通16位内部定时器来请求中断服务。看门狗定时器产生128个PCLK周期的复位信号 也就是说,在某些环境下,看门狗可以当做定时器使用,当他中断的时候并不发生复位,只发生中断,我看看图 看门狗的中断和复位信号是可以依靠wtcon来切断的(看门狗的时钟是无法切断的) 使用看门狗主要靠这几个寄存器 用来选择时钟源,分频系数,启动看门狗以及看门狗中断和复位的连接 流程基本上就是,第一次对wtcnt赋值之后启动看门狗,看门狗自动减,到达0的时候触发中断,如果连接了复位则触发复位 未连接则触发中断,另外, 看门狗定时
[单片机]
<font color='red'>S3C2440</font>看门狗解析
S3C2440 Nor Flash驱动(二十四)
1、Nor Flash硬件介绍: 从原理图中我们能看待NOR FLASH有地址线,有数据线,它和我们的SDRAM接口类似,能直接读取数据,但不能想SDRAM直接写入数据,需要有命令才行。 1.1 其中我们2440的地址线共有27根(LADDR0~26),为什么是27根? 因为2440共有7个bank内存块,每个bank=128M=(2^27)B,所以共有27根数据线 1.2 为什么Nor Flash的地址线A0是接在2440的LADDR1上? 因为Nor Flash的数据共有16位,也就是每个地址保存了2B数据,而我们的2440的每个地址是保存1B数据 比如: 当2440访问0x00地址时,就会读取到N
[单片机]
<font color='red'>S3C2440</font> Nor Flash驱动(二十四)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved