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

RT-Thread串口驱动移植实战:从S3C2440硬件到设备框架详解 串口通信是嵌入式系统中最基础且关键的调试与数据交互接口,其工作原理涉及硬件UART控制器、时钟配置、中断处理以及数据缓冲机制。在实时操作系统(RTOS)中,串口驱动需要对接统一的设备驱动框架,以实现硬件无关的API调用和资源管理,这对提升系统可移植性和模块化至关重要。RT-Thread作为一款国产开源RTOS,其设备驱动模型通过标准化的操作集(如rt_serial_ops)将硬件操作抽象为open、read、write等接口,极大简化了外设开发。在嵌入式开发实践中,针对特定芯片(如ARM9架构的S3C244 阅读详情

转自:http://blog.youkuaiyun.com/fengyaqi123/article/details/7833300

参考一下


搞了好久,终于完成了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;
}
14_Linux内核裁剪及编译 经过对内核的认识和对裁剪配置项的了解,接下来实际操作。针对 S3C2440 开发板进行裁剪 Linux 内核。 阅读详情

相关推荐

mini2440裸机试炼之——DMA直接存取 实现Uart(串口)通信

mini2440裸机试炼之——DMA直接存取 实现Uart(串口)通信

DMA原理解析

DMA原理解析

ZhY_Rening的博客 9105

红外图像和可见光图像异源图像配准问题研究

本文旨在研究一种具有高准确率和鲁棒性的融合图像障碍物检测技术,通过把红外和可见光图像进行图像配准和融合,获取高质量的异源融合图像,根据融合图像的特点采用有效的障碍物检测算法,将图像中的障碍物准确检出。......

G_redsky的博客 1万+

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

搞了好久,终于完成了DMA方式实现串口通信。使用DMA不是很难,主要是DCONn的配置比较麻烦以及几种模式的理解。 DMA service mode:single service&Whole service。前一模式下,一次DMA请求完成一项原子操作,并且transfer count的值减1。后一模式下,一次DMA请求完成一批原子操作,直到transfer count等于0表示完成一次整

2584

保姆级教程:用YOLOv5+ROS2 Humble搞定奥比中光Dabai DCW深度相机的3D物体定位

本教程详细介绍了如何使用YOLOv5模型和ROS2 Humble系统,结合奥比中光Dabai DCW深度相机实现3D物体定位。从环境配置、模型部署到深度数据融合,提供完整的实战指南,帮助开发者快速掌握三维坐标提取技术,适用于机器人开发和计算机视觉应用。

weixin_26765363的博客 270

01 AUTOSAR CP标准文档阅读指南

01 AUTOSAR CP标准文档阅读指南

汽车软件工程师 | 好奇博主 | 处女座 1134

S3C2410:DMA介紹(精)

(2008-02-25 21:40)   之所以要介绍DMA,因为它对性能太重要了!只有活用了DMA,CPU的性能才能上去!S3c2410有四个DMA,每个DMA支持工作方式基本相同,但支持的source Dest可能略有不同,具体见Datasheet。 这里具体DMA CONTROL寄存器(DCON)的配置说明,进而引出DMA的各种工作方式。 Atomic transfer:指的是

shangyaowei的专栏 656

文献综述三大痛点用AI轻松解决!借助Gemini 3 Pro搞定检索难、阅读慢、框架乱问题(附 AI 提示词)

4)“漏斗式”结构:先介绍宏观领域的研究现状,再缩小范围,聚焦于与你课题直接先关的子领域,深入探讨与你研究变量直接相关的文献, 指出前人没做过、没做全或结论有矛盾的地方,再顺势提出你的研究课题,这种结构逻辑最清晰,能直接引导读者发现你研究的必要性。想要有针对性的搜到相关文献,必须先把模糊的研究题目拆解成精准的检索语言,这个时候就需要建立一个关键词矩阵,如核心词、同义词、学术术语、上下位词,以及对应的英文表达。请围绕【我的研究主题/关键词】,检索近5年发表的高被引的中英文文献,优先选择顶刊综述/论文。

智能AI让学术科研更容易 277

DMA基本概念及linux2440下DMA驱动程序编写与测试

转自:http://blog.techbulo.com/tech/artical/1462.html 1、基本概念 DMA即Direct Memory Access(直接存储器存取),那么为什么要引入这么个东东呢?它的作用又是什么呢?我们通过一个例子来说明: 比 如当我们要往内存里面拷贝一块很大的数据时,由于CPU同一时间只能做一件事情,这样在一段很长的时间里就不能再处理其它

8113

9篇2章2节:GBD 数据库的数据申请详解

无论您是初入公共卫生领域的学生、资深的科研工作者,还是政策决策者,GBD数据库都将成为您数据分析与决策支持中不可或缺的重要工具。

MD Code 2599

SAP Fiori Launchpad Tile,UI5 应用,和 PFCG Role 的对应关系

问题:已经看到了SAP Fiori Launchpad上的某个tile,如何反推后台需要配置哪个PFCG Role才能看到该tile? 这个问题是今天一个朋友在微信上问我的。因为我最近忙着学习一个新的SAP产品,所以这个问题也没有时间展开来写,本文就只做概要介绍。 下图是一个Gateway系统上打开的SAP CRM Fiori Launchpad: 如何弄清楚后台用户配置了哪个PFCG Role之后,才能看到Sales Representative(CRM)这个Group下的tile? 既然当前我使用的用

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1520

32.Linux-2440下的DMA驱动(详解)

DMA(Direct Memory Access) 即直接存储器访问, DMA 传输方式无需 CPU 直接控制传输,通过硬件为 RAM 、I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。   学了这么多驱动,不难推出DMA的编写套路: 1)注册DMA中断,分配缓冲区 2)注册字符设备,并提供文件操作集合fops   -&gt; 2.1)file_op...

weixin_34332905的博客 327

AI视频生成模型训练:从数据准备到部署全流程

咱们这次的目的就像是要建造一座超级厉害的AI视频生成魔法城堡。范围呢,就是从收集建造城堡的材料(数据准备)开始,到把城堡搭建起来(模型训练),再到让城堡能供大家使用(模型部署),涵盖了整个过程的方方面面。接下来我们会先给大家介绍一些重要的术语,就像认识冒险途中的关键道具一样。然后引入一个有趣的故事,带大家进入AI视频生成的奇妙世界,解释核心概念以及它们之间的关系。接着会详细讲解核心算法原理、数学模型和公式,还会有项目实战,带大家亲自体验代码的魅力。

小白菜的博客 399

【mini2440】S3C2440的串口

1. 基本电路 2. 相关寄存器 2.1 引脚 2.2 框图 2.3 串口 3. 相关代码 S3C2440A 中的时钟控制逻辑可以产生必须的时钟信号,包括 CPU 的 FCLK,AHB 总线外设的 HCLK 以及 APB 总线外设的 PCLK。S3C2440A 包含两个锁相环(PLL):一个提供给 FCLK、HCLK 和 PCLK,另一个专用于USB 模块(48MHz)。 工作频率 FCLK 最高 400MHz。提供给 ARM920T 的时钟。 HCLK 最高 136MHz。提供给用于 ARM92

Kshine2017的博客 1220

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

UART配置流程

比如我们选择使用PCLK,即50M,波特率为9600,那么公式计算的结果就是324.52,取整得325,把这个数存到UBRDIVn波特率就设置好了,简直不要太方便。如果我们把uart的时钟设置为FCLK,那么uart的实际工作频率就由该寄存器的[15:12]决定,有兴趣的读者可以自行尝试。uart状态寄存器是用来查询uart的状态的,第2比特可用于判断数据是否发送完毕,类似于51的RI,同理,第1比特和第2比特的区别在于一个是位移寄存器为空,另外一个是位移寄存器不一定为空。

m0_72137961的博客 2503

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

裸机系列——2440串口通信

2011-04-04串口通信还没弄完,等到全部弄完了在一起做一个总结,首先每天先记录一下现在的学习心得。串口调试有几天了,发现串口调试还是比较难的,以后不管是调其他的什么器件都要遵循先容易的把最简单的框架弄好,再一步步的增加功能,一开始我试想一步就把把串口通信弄完,直接写一个基于FIFO的中断串口通信,我承认我失败了,弄了好久没一点结果。弄串口通信还是先写一个不用FIFO的直接用查询的程序,然后再加中断,最后写FIFO的中断程序。今天我写了是不用FIFO的中断程序,有几点要注意的地方。1. 一定要先把手册看

yimu13的专栏 3508

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Mini2440裸机开发之串口UART

一、S3C2440上的UART 1.1 串口概述 串口的使用位于S3C2440芯片手册的第11章。S3C2440A 的通用异步收发器(UART)配有3 个独立异步串行I/O端口,每个都可以是基于中断或基于DMA 模式的操作。换句话说,UART 可以通过产生中断或DMA 请求来进行CPU和UART之间的数据传输。 UART 通过使用系统时钟可以支持最高115.2Kbps 的比特率。如果是外部器件提...

Graceful_scenery的博客 244

mini2440系统引导(五)串口UART

S3C2440A 的通用异步收发器(UART)配有 3 个独立异步串行 I/O(SIO)端口,每个都可以是基于中断或基于 DMA 模式的操作。换句话说,UART 可以通过产生中断或 DMA 请求来进行 CPU 和 UART 之间的数据传输。UART 通过使用系统时钟可以支持最高 115.2Kbps 的比特率。 串口通信对数据格式有如下约定:规定有空闲位、起始位、资料位、奇偶校验位、停止位。...

weixin_30566111的博客 214

S3C2440 UART串口驱动(裸机)

[置顶] S3C2440 UART串口驱动 ++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.youkuaiyun.com/mr_raptor/article/details/6556133 ++++++++++++++++++++++++++++++++++++++++++ 1

tony的专栏 1537

uart串口发送---那些年我们一起玩mini2440(arm9)裸机

Uart工作原理:数据通信方式为:并行通信与串行通信两种:§并行通信:利用多条数据线将数据的各位同时传送。它的特点是:传输速度快,是用于短距离通信;§串行通信:利用一条数据线将数据一位位地顺序传送。特点是通信线路简单,利用简单的线缆就实现通信,低成本,是用于远距离通信。异步通信:ª异步通信:以一个字符为传输单位,通过两个字符间的时间间隔是不固定的,然而同一字符中的两个相邻位之间的时间间...

banbenggang9818的博客 195

一起学mini2440裸机开发(六)--UART原理与基础实验

我个人感觉UART也不算是很难,学过单片机的相信都用过UART,在这里还是说说它吧,并且在写基础实验并调试的时候,出现了一个问题,就是我们平时使用jlink调试程序都是基于在sdram中运行的,由于ram的掉电易失性,所以咱们的裸机程序根本就不能脱机工作,也即是说复位之后程序就没有了,当然,我知道可以利用以后学的知识将它下载到NAND Flash中去,这个以后再说。貌似还有一个办法,就是使用mdk

王文松的博客 4949

mini2440 development board UART Conclusion

一.概述: s3c2440A 提供三个独立异步串口端,每个端口可以在中断模式和DMA模式下操作,也就是讲UART可以产生一个中断或DMA请求用于CPU和UART之间的数据传输。 每一个串口UART都有一个64字节的发送FIFO,一个64字节的接收FIFO。 要实现UART与上位机之间的通信,必须遵循木一个协议,通过ULCON可以定义传输数据的位数,停止的位数,红外模式等。

u014379540的博客 656

mini2440硬件篇之UART

 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器。UART以全双工方式传输数据,最简单的连线只有2根,TxD用于发送,RxD用于接收,Gnd地。UART使用标准的TTL电平(0~3.3V或0~5V),表示高低电平,为了增加抗干扰能力,增加传输长度,通常将TTL电平转换为RS-232电平。

幕天席地的专栏 891

mini2440硬件篇之DMA

 1. 硬件原理 计算机系统中各种常用的数据输入/输出方法有查询方式(包括无条件及条件传送方式)和中断方式,这些方式适用于CPU与慢速及中速外设之间的数据交换。但当高速外设要与系统内存或者要在系统内存的不同区域之间进行大量数据的快速传送时,就在一定程度上限制了数据传送的速率。直接存储器存取(DMA)就是为解决这个问题提出的,采用DMA方式,在一定时间段内,由DMA控制器取代CPU,获得

幕天席地的专栏 1419
上一篇: S3C2440的DMA
下一篇: UCOS-II 中断与时钟问题总结(以UCOS2.25自带的X86例子)
shareCode
博客等级 码龄15年 125粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值