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

发布者:少年不识愁滋味最新更新时间:2016-05-18 来源: eefocus关键字:S3C2440  Mini  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  Mini  DMA方式  Uart串口通信 引用地址:S3C2440 Mini 2440 DMA方式实现Uart串口通信

上一篇:单片机中应用观察者模式
下一篇:STM32 DMA详解——一串口为例

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

ZigBee-CC2530单片机 - DMA方式复制数据
程序源码 #include ioCC2530.h #include stdio.h #define LED1 P1_0 // P1_0定义为P1_0 #define LED2 P1_1 // P1_0定义为P1_1 #define SW1 P1_2 //SW1端口宏定义 enum SYSCLK_SRC { RC_16MHz,XOSC_32MHz }; /**************************************************************/ #pragma bitfields = reversed //使用大端格式 typedef struct { uns
[单片机]
STM32F4学习笔记4——STM32的AD用DMA方式时的请注意初始化顺序
我突然意识到我的数据好像一直没有错位,看到这个我又试验了一下,发现把DMA_Cmd(DMA1_Channel1, ENABLE);放置到哪儿都是一样的啊~~~ 这个是原帖部分: STM32的AD用DMA方式时的请注意初始化顺序 珍情岁月(84848098) 17:19:23 DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_Result; DMA_InitStructure.DMA_DIR
[单片机]
U-boot 在 mini2440-S3C2440 上的移植(1)-开发环境搭建-交叉编译工具链的安装
编译U-boot给mini2440时,要编译出能在ARM平台上使用的可执行文件-bin,首先要在ubuntu 中安装交叉编译工具链,因为我使用的是友善之臂的开发板,所以我使用的已经制作好的工具链,当然也可以自己制作工具链:如基于GCC和glibc制作工具链,可以使用cross tools编译; 我使用的工具链的版本是arm-linux-gcc-4.3.3版本,下载地址:下载地址 1.在pc端下载好以后,将压缩包用xftp传输到Ubuntu;当然也可以用其他软件上传;上传后把它放在根目录下的/usr/local文件夹中新建一个arm文件夹,然后把压缩包复制到这个文件夹;注意先建好文件夹再上传,可以减少很多工作量; 一定要上传压缩包,
[单片机]
U-boot 在 <font color='red'>mini</font><font color='red'>2440</font>-S3C<font color='red'>2440</font> 上的移植(1)-开发环境搭建-交叉编译工具链的安装
JZ2440下载程序到开发板的3种方法
1. 使用mount命令进行挂载 ①开发板必须要和虚拟机、电脑在同一个网段内(相互可以ping通) ②将要下载到开发板的程序放到指定目录,这个目录需要在/etc/exports中指定,否则无法被挂载 ②然后在开发板上执行以下命令,要下载的程序就在开发板的/mnt目录里了 mount -t nfs -o nolock,vers=2 192.168.1.100:/design/tools /mnt 2.利用SecureCRT上传、下载文件 ①下载rzsz-3.48.tar.gz: http://download.csdn.net/detail/pcli_218/3347536 ②解压文件包,命令如下 tar zxf rzsz-3
[单片机]
JZ<font color='red'>2440</font>下载程序到开发板的3种方法
linux2.6.32.2 mini2440平台移植-- ADC 驱动移植
1.2.1 关于 S3C2440 的 ADC 和触摸屏接口 Linux-2.6.32.2 内核并没有提供支持 S3C2440 的 ADC 驱动程序,因此我们自行设计了一个,这个驱动比较简单,属于字符设备,。在 S3C2440 芯片中,AD 输入和触摸屏接口使用共同的 A/D 转换器,见S3C2440芯片手册第 16 章节,如图。 1.2.2 在内核中添加 ADC 驱动 在 S3C2440 芯片中,AD 输入和触摸屏接口使用共同的 A/D 转换器,因此,ADC 驱动和触摸屏驱动若想共存,就必须解决共享 A/D 转换器 资源这个问 题,因此在 ADC 驱动程序中声明了一个全局的 ADC_LOCK 信号量。 (1)将
[单片机]
linux2.6.32.2 <font color='red'>mini</font><font color='red'>2440</font>平台移植-- ADC 驱动移植
S3C2440 2440init.s分析第一篇(一)
S3C2440 2440init.s分析第一篇(一) 在网上转的,收集起来,下次要查看的时候方便点。 s3c2440启动文件分析 s3c2440启动文件分析 ;========================================= ; NAME : 2440INIT.S ; DESC: C start up codes ; Configure memory, ISR ,stacks ; Initialize C-variables ; HISTORY: ; 2002.02.25:kwtark: ver 0.0 ; 2002.03.20:purnna
[单片机]
s3c2440的PWM应用
PWM(Pulse Width Modulation) 脉宽调制,它是利用微控制器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量、通信、功率控制与变换等许多领域。 s3c2440芯片中一共有5个16位的定时器,其中有4个定时器(定时器0~定时器3)具有脉宽调制功能,因此用s3c2440可以很容易地实现PWM功能。下面就具体介绍如何实现PWM功能。 1、PWM是通过引脚TOUT0~TOUT3输出的,而这4个引脚是与GPB0~GPB3复用的,因此要实现PWM功能首先要把相应的引脚配置成TOUT输出。 2、再设置定时器的输出时钟频率,它是以PCLK为基准,再除以用寄存器TCFG0配置的prescaler参数,和用
[单片机]
首部全电动Mini亮相车展 锂电池提供动力
能元科技(e-one)近日宣布,搭载该公司锂离子动力电池的第一款全电动汽车BMW Mini E于LA车展(LA Autoshow)中首度亮相,获得业界好评。该款全电动汽车所采用之电池芯及电池组由能元南科厂所提供。 能元科技表示,锂电池具有工作电压高、能量密度大、寿命长及环保等优点,行驶过程中不会排放废气,不但环保、减碳、省电,更减少汽油的使用量,特别是面对全球电动汽车市场技术逐渐成熟及各国政府设立相关基础建设,汽车大厂全面换用充电式锂电池将是未来的一大趋势。 能元此次提供给BMW Mini E全电电动汽车使用的动力系统,每台车均搭载5,000多颗能元18650锂电池芯。该电池芯外观与一般笔电用锂电池大小相同,最大功
[汽车电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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