对S3C2440裸板程序设计(无操作系统)的抽象

发布者:WanderlustSoul最新更新时间:2016-03-03 来源: eefocus关键字:S3C2440  裸板程序  无操作系统 手机看文章 扫描二维码
随时随地手机看文章
          在嵌入式领域中,几乎所有的设备控制和各种协议控制都在同一个嵌入式CPU当中,非常有利于对CPU Core和设备进行抽象。如果能对CPU Core和设备的各种控制进行抽象,人们在移植OS或者开发驱动程序时就没有必要对CPU进行非常深入的了解,不必要了解某个寄存器的某个位是控制什么的,也没有必要了解怎样初始化某个控制寄存器等等。

        在利用控制器编写裸板应用程序时,编程人员只需要了解该控制器的初始化顺序以及初始化的内容而不需要了解初始化的具体细节就能完成应用程序。显然可以大大的提高工作效率,并且对于硬件的具体细节设置是在应用程序中最容易出错的地方,而利用控制器则可以大大的减少出错的可能性。
        ARM是功能更加强大的单片机,在学习裸机程序设计的过程中,发现ARM比一般的单片机集成了更多的外设(一般的单片机只集成了串口,还有四组IO端口),包含更多的GPIO,有更多的寄存器,通过寄存器的设置和启用来控制相关引脚,从而控制相关设备。S3C2440内部集成了硬件控制器,各种驱动协议用硬件控制器产生,我们只需配置对应硬件控制器的寄存器即可产生相应的驱动时序。 高端ARM学习以软件编程为主(即理解为主),其资源丰富,很少需要需要扩展外设,学习重点在于如何配置寄存器以及如何编写应用程序。

        设置相应的控制寄存器,读写相应的数据寄存器就可以。学习裸板程序开发的重点是理解各种接口协议的原理,这样就可以很好的理解控制器的初始化顺序以及初始化的内容。

        下面以S3C2440的I2C控制器为例来讲解。下面的程序是基于中断模式,I2C协议的讲解可以查看我以前的博客。I2C协议中规定:接收器接收到一个字节(地址或数据)后,要发送一个ACK,发送器接收到ACK后可以接着发送数据或结束数据传输。接收器(这里我们是S3C2440的I2C控制器)收到ACK后会产生一个中断,在中断处理程序中可以继续发送程序或者结束传输。理解了I2C协议的基本原理,编写程序就水到渠成。

[cpp] view plain copy
 
 print?
  1. //===================================================================  
  2. //       SMDK2440 IIC configuration  
  3. //  GPE15=IICSDA, GPE14=IICSCL  
  4. //  "Interrupt mode" for IIC block  
  5. //===================================================================   
  6.   
  7. //******************[ Test_Iic ]**************************************  
  8. void Test_Iic(void)  
  9. {  
  10.     unsigned int i,j,save_E,save_PE;  
  11.     static U8 data[256];  
  12.   
  13.     Uart_Printf("\nIIC Test(Interrupt) using AT24C08\n");  
  14.   
  15.     save_E   = rGPECON;                 //保存以前的值  
  16.     rGPECON |= 0xa00000;                //GPE15:IICSDA , GPE14:IICSCL   
  17.   
  18.     pISR_IIC = (unsigned)IicInt;        //设置中断处理函数  
  19.     rINTMSK &= ~(BIT_IIC);              //打开IIC中断  
  20.   
  21.       //Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt, Transmit clock value Tx clock=IICCLK/16  
  22.       // If PCLK 50.7MHz, IICCLK = 3.17MHz, Tx Clock = 0.198MHz  
  23.     rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);//第四位为1,SCL线被拉低,传输被中断  
  24.   
  25.     rIICADD  = 0x10;                    //2440 slave address = [7:1]  
  26.     rIICSTAT = 0x10;                    //IIC bus data output enable(Rx/Tx)使能接收/发送功能  
  27.     rIICLC = (1<<2)|(1);               // Filter enable, 15 clocks SDA output delay       added by junon  
  28.       
  29.     Uart_Printf("Write test data into AT24C08\n");  
  30.   
  31.     for(i=0;i<256;i++)  
  32.         Wr24C080(0xa0,(U8)i,i);  
  33.              
  34.     for(i=0;i<256;i++)  
  35.         data[i] = 0;  
  36.   
  37.     Uart_Printf("Read test data from AT24C08\n");  
  38.       
  39.     for(i=0;i<256;i++)  
  40.         Rd24C080(0xa0,(U8)i,&(data[i]));   
  41.   
  42.         //Line changed 0 ~ f  
  43.     for(i=0;i<16;i++)  
  44.     {  
  45.         for(j=0;j<16;j++)  
  46.             Uart_Printf("%2x ",data[i*16+j]);  
  47.         Uart_Printf("\n");  
  48.     }  
  49.     rINTMSK |= BIT_IIC;      
  50.     rGPECON = save_E;  
  51. }  
  52.   
  53.   
  54. //*************************[ Wr24C080 ]****************************  
  55. void Wr24C080(U32 slvAddr,U32 addr,U8 data)  
  56. {  
  57.     _iicMode      = WRDATA;  
  58.     _iicPt        = 0;  
  59.     _iicData[0]   = (U8)addr;  
  60.     _iicData[1]   = data;  
  61.     _iicDataCount = 2;  
  62.       
  63.     rIICDS   = slvAddr;                 //0xa0  
  64.     rIICSTAT = 0xf0;                    //MasTx,Start主机发送器 发出S信号  
  65.       //Clearing the pending bit isn't needed because the pending bit has been cleared.  
  66.       
  67.     while(_iicDataCount!=-1);//等待数据数据发送完毕  
  68.   
  69.   
  70.   
  71.   
  72. //开始一次新的传输,不过只发送设备地址,等待应答,以证明上次传输完成。而下次Wr24C080的时候会重新开始,这次的传输并没有写入数据  
  73.     _iicMode = POLLACK;  
  74.   
  75.     while(1)  
  76.     {  
  77.         rIICDS     = slvAddr;  
  78.         _iicStatus = 0x100;  
  79.         rIICSTAT   = 0xf0;              //MasTx,Start  
  80.         rIICCON    = 0xaf;              //Resumes IIC operation.   
  81.              
  82.         while(_iicStatus==0x100)    ;//等待数据数据发送完毕,状态寄存器改变了就可以了  
  83.              
  84.         if(!(_iicStatus&0x1))     //接收到的最后一位为0 (接收到ACK信号)  
  85.             break;           //When ACK is received  判断最后一位的状态  
  86.     }  
  87.     rIICSTAT = 0xd0;                    //Stop MasTx condition   
  88.     rIICCON  = 0xaf;                    //Resumes IIC operation.   
  89.     Delay(1);                           //Wait until stop condtion is in effect.  
  90.        //Write is completed.  
  91. }  
  92.           
  93. //**********************[ Rd24C080 ] ***********************************  
  94. void Rd24C080(U32 slvAddr,U32 addr,U8 *data)  
  95. {  
  96.     _iicMode      = SETRDADDR;  
  97.     _iicPt        = 0;  
  98.     _iicData[0]   = (U8)addr;  
  99.     _iicDataCount = 1;  
  100.   
  101.     rIICDS   = slvAddr;  
  102.     rIICSTAT = 0xf0;                    //MasTx,Start    
  103.       //Clearing the pending bit isn't needed because the pending bit has been cleared.  
  104.     while(_iicDataCount!=-1);  
  105.   
  106.     _iicMode      = RDDATA;  
  107.     _iicPt        = 0;  
  108.     _iicDataCount = 1;  
  109.       
  110.     rIICDS        = slvAddr;  
  111.     rIICSTAT      = 0xb0;               //MasRx,Start  
  112.     rIICCON       = 0xaf;               //Resumes IIC operation.     
  113.     while(_iicDataCount!=-1);  
  114.   
  115.     *data = _iicData[1];  
  116. }  
  117.   
  118.   
  119. //-------------------------------------------------------------------------  
  120. void __irq IicInt(void)  
  121. {  
  122.     U32 iicSt,i;  
  123.       
  124.     rSRCPND = BIT_IIC;          //Clear pending bit  
  125.     rINTPND = BIT_IIC;  
  126.     iicSt   = rIICSTAT;   
  127.       
  128.     if(iicSt & 0x8){}           //When bus arbitration is failed.  
  129.     if(iicSt & 0x4){}           //When a slave address is matched with IICADD  
  130.     if(iicSt & 0x2){}           //When a slave address is 0000000b  
  131.     if(iicSt & 0x1){}           //When ACK isn't received  
  132.   
  133.     switch(_iicMode)  
  134.     {  
  135.        case POLLACK:  
  136.            _iicStatus = iicSt;  
  137.            break;  
  138.   
  139.        case RDDATA:  
  140.            if((_iicDataCount--)==0)  
  141.            {  
  142.                _iicData[_iicPt++] = rIICDS;  
  143.               
  144.                rIICSTAT = 0x90;                 //Stop MasRx condition   
  145.                rIICCON  = 0xaf;                 //Resumes IIC operation.  
  146.                Delay(1);                        //Wait until stop condtion is in effect.  
  147.                                                 //Too long time...   
  148.                                                 //The pending bit will not be set after issuing stop condition.  
  149.                break;      
  150.            }        
  151.            _iicData[_iicPt++] = rIICDS;         //The last data has to be read with no ack.  
  152.   
  153.            if((_iicDataCount)==0)  
  154.                rIICCON = 0x2f;                  //Resumes IIC operation with NOACK.    
  155.            else   
  156.                rIICCON = 0xaf;                  //Resumes IIC operation with ACK  
  157.                break;  
  158.   
  159.         case WRDATA:  
  160.             if((_iicDataCount--)==0)  
  161.             {  
  162.                 rIICSTAT = 0xd0;                //Stop MasTx condition   
  163.                 rIICCON  = 0xaf;                //Resumes IIC operation.  
  164.                 Delay(1);                       //Wait until stop condtion is in effect.  
  165.                        //The pending bit will not be set after issuing stop condition.  
  166.                 break;      
  167.             }  
  168.             rIICDS = _iicData[_iicPt++];        //_iicData[0] has dummy.  
  169.             for(i=0;i<10;i++);                  //for setup time until rising edge of IICSCL  
  170.                 
  171.             rIICCON = 0xaf;                     //resumes IIC operation.  
  172.             break;  
  173.   
  174.         case SETRDADDR:  
  175. //          Uart_Printf("[ S%d ]",_iicDataCount);  
  176.             if((_iicDataCount--)==0)  
  177.                 break;                          //IIC operation is stopped because of IICCON[4]      
  178.             rIICDS = _iicData[_iicPt++];  
  179.             for(i=0;i<10;i++);                  //For setup time until rising edge of IICSCL  
  180.             rIICCON = 0xaf;                     //Resumes IIC operation.  
  181.             break;  
  182.   
  183.         default:  
  184.             break;        
  185.     }  
  186. }  

关键字:S3C2440  裸板程序  无操作系统 引用地址:对S3C2440裸板程序设计(无操作系统)的抽象

上一篇:深入分析S3C2440启动代码中大小端问题
下一篇:GPIO(二)C程序

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

s3c2440 移值u-boot-2016.03 第1篇 新建单板
目前除RC版外,最新的就是 u-boot-2016.03.tar.bz2 ,大概看了几个年份的u-boot 发现,现在 更像是 linux kernel 。有 menuconfig 。 对比2012年的版本,发现 原来在 start.S 中做的一些事情,被拆分了。 board 分的更加详细。 之前没有 J-LINK 根本无法烧写 NOR FLASH ,导致 u-boot 只能在 NAND FLASH 上,但是卡在 重定向这一处。用了点灯大法,串口调试,都不是很理想。 买了个J-LINKV9 ,一试,原来烧写,NOR FLASH 这么简单。 因为 u-boot 自带的 只有 2410 的 单板,而且是不支持 NAND FLASH 的
[单片机]
<font color='red'>s3c2440</font> 移值u-boot-2016.03 第1篇 新建单板
S3C2440系统中断
1.1 S3C2440系统中断 CPU和外设构成了计算机系统,CPU和外设之间通过总线进行连接,用于数据通信和控制,CPU管理监视计算机系统中所有硬件,通常以两种方式来对硬件进行管理监视: l 查询方式:CPU不停的去查询每一个硬件的当前状态,根据硬件的状态决定处理与否。好比是工厂里的检查员,不停的检查各个岗位工作状态,发现情况及时处理。这种方式实现起来简单,通常用在只有少量外设硬件的系统中,如果一个计算机系统中有很多硬件,这种方式无疑是耗时,低效的,同时还大量占用CPU资源,并且对多任务系统反应迟钝。 l 中断方式:当某个硬件产生需要CPU处理的事件时,主动通过一根信号线 告知 CPU,同时设置某个寄存器里对应的位,CPU一旦
[单片机]
<font color='red'>S3C2440</font>系统中断
S3C2440-裸机篇-02 | 安装和使用arm-linux-gcc交叉编译工具链
1.为什么需要交叉编译工具 宿主机运行的是标准Linux操作系统,编译出的程序却需要在目标机的Linux上跑,这就叫交叉编译,编译器叫做交叉编译器。 之前我们已经使用过gcc编译Linux本地主机的程序(Linux C语言编程(上篇) | gcc的使用),而我们现在需要的这个编译器的目标系统是ARM,不运行操作系统,仅运行裸机程序,需要在Linux主机上编译出可以运行在S3C2440@ARM920T芯片上跑的程序,所以不能使用这个编译器,需要使用arm-linux-gcc交叉编译器。 2.arm-linux-gcc的安装 arm-linux-gcc是ARM官方基于Linux平台的arm编译器,其特点有: 开源免费 支持
[单片机]
S3C2440-裸机篇-02 | 安装和使用arm-linux-gcc交叉编译工具链
基于DM9000AE的S3C2440嵌入式系统的以太网接口设计
本文介绍了一个基于三星ARM9芯片S3C2440嵌入式系统的以太网接口电路设计方案,采用了工业级以太网控制器DM9000AEP成功实现了嵌入式系统网络数据交换。论文在重点阐述了网络接口电路基础之上,对Windows CE系统控制软件部分DM9000AEP的驱动程序和注册表项进行了具体分析。 随着微电子技术和计算机技术的发展,嵌入式技术得到广阔的发展,已成为现代工业控制、通信类和消费类产品发展的方向。以太网在实时操作、可靠传输、标准统一等方面的卓越性能及其便于安装、维护简单、不受通信距离限制等优点,已经被国内外很多监控、控制领域的研究人员广泛关注,并在实际应用中展露出显著的优势。本文提出了一种基于DM9000AE网络接口芯片和32位
[单片机]
基于DM9000AE的<font color='red'>S3C2440</font>嵌入式系统的以太网接口设计
GNU ARM汇编--(十一)小结一下
对s3c2440的一部分做了学习,更深的了解了汇编以及arm体系,还有中断,调试底层汇编过程的最大感触就是仔细阅读datasheet,因为那是英文文档. 前面写的都是嵌入式底层比较基础的东西,后面要做的内容: 1.先裸机搞定iic,iic包括用控制器实现的和用GPIO模拟的,这样可以加深时序的理解. 2.spi也想看一下,虽然2440有spi,但是没有外设,这个比较麻烦. 3.搞清楚嵌入式系统中的存储系统,主要是内存(MMU)和flash 4.在前面的基础上可以整体上把握bootloader了 5.因为对linux的文件系统和设备模型有一定的了解,在3的基础上可以开始
[单片机]
S3C2440之触摸屏
触摸屏附着在显示器表面,根据触摸点在显示屏上对应坐标点的显示内容或图形符号进行相应操作。 其坐标识别原理如下图: 当手指触摸屏幕时,两个相互绝缘的导电层在触摸点处连接,顶层的5伏电压就会加到底层触摸点处,底层该点的电压会发生改变,控制器检测到该点的变化后,将该点的电压进行A/D转换,得到的值与5伏相比,再乘以该轴总长度即可得触摸点靠地那一端的坐标:X=L*V(I)/5 也就是说我们要得到触点坐标的话,只需要将触点的电压进行A/D转换再用公式计算一下便可。那么触摸屏驱动的重点应该是在什么时候,对什么地点的电压进行A/D转换。S3C2440中的A/D转换器便有这种功能: 如图所示为S3C2440中ADC与触摸屏的接口框架图
[单片机]
<font color='red'>S3C2440</font>之触摸屏
ARM裸机学习一:S3C2440的时钟体系
1.时钟的产生 S3C2440的系统时钟图如下: S3C2440A的主时钟源由外部时钟(EXTCLK)或者外部晶振(XTIPll)提供,输入时钟源由模式控制引脚OM3和OM2控制选择,在复位信号的上升沿参考OM3和OM2的引脚将OM 的状态在内部锁定 大致过程是:经过OM3和OM2引脚选择的外部时钟进入MPLL(锁相环)和UPLL进行倍频,经过MPLL得到FCLK直接供给给CPU,除此以外,FCLK还会经过HDIV和PDIV分频得到HCLK和PCLK,分别提供给APB总线和AHB总线。而经过UPLL的会产生UCLK供给USB。如图: 2.修改时钟频率的过程 1.上电后,复位芯片(nRESET)等待电源稳定再输出高电
[单片机]
ARM裸机学习一:<font color='red'>S3C2440</font>的时钟体系
基于S3C2440芯片和单片机设计压装数据采集系统的设计
引言 随着经济和社会的发展,我国的工业水平和信息技术水平也得到了飞速发展。其中工业中最为常见的零部件组装和装备压装监测设备也得到了不断的改进。压装的过程其实就是按规定的技术要求将零部件进行组培和连接,使之成为半成品或者成品的工艺过程。如图1所示,就是将两个零部件进行过盈无键组装配合,使之牢固结合在一起。工业中很多机械设备都是通过这种压装方式组合到一起的,包括火车轮对、轴承、汽车发动机、变速器、底盘等关键部件。压装的质量决定了以后产品的使用质量和人民的生命财产都息息相关。我们知道压装质量的评判标准,主要是根据压装过程中压力和位移的变化曲线来确定的。而压力位移曲线的获取这就需要由良好的运行稳定的数据采集系统来提供。基于此,本文提出一种
[单片机]
基于<font color='red'>S3C2440</font>芯片和单片机设计压装数据采集系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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