ARM裸机篇-串口UART实验

发布者:as233632621最新更新时间:2019-10-22 来源: 51hei关键字:ARM  串口  UART实验 手机看文章 扫描二维码
随时随地手机看文章

串口应该都很熟悉了,具体通信原理我就不提了,这个百度上都很多讲的,然后就直接看函数了。

void Uart_SendByte(int data)//这个函数是发送整型数据,参数为data

{

    if(whichUart==0)//这个是选中串口0

    {

        if(data=='')//然后判断数据不为空

        {

      /*寄存器的原始宏定义,

      #define rUTRSTAT0   (*(volatile unsigned *)0x50000010) //UART 0 Tx/Rx status*/

            while(!(rUTRSTAT0 & 0x2));/*这个就是查询串口0的状态寄存器,第1位是发送缓冲器是否为空

            第二位是Transmit buffer empty

            0 = The buffer register is not empty

            1 = Empty     这里检查为0的话就是还没发送完全,当置1的时候表示发完了,程序继续执行*/

            Delay(10);                 //because the slow response of hyper_terminal

            WrUTXH0('');

        }

        while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.

        Delay(10);

        WrUTXH0(data);

    }

    else if(whichUart==1)

    {

        if(data=='')

        {

            while(!(rUTRSTAT1 & 0x2));

            Delay(10);                 //because the slow response of hyper_terminal

            rUTXH1 = '';

        }

        while(!(rUTRSTAT1 & 0x2));   //Wait until THR is empty.

        Delay(10);

        rUTXH1 = data;

    }   

    else if(whichUart==2)

    {

        if(data=='')

        {

            while(!(rUTRSTAT2 & 0x2));

            Delay(10);                 //because the slow response of hyper_terminal

            rUTXH2 = '';

        }

        while(!(rUTRSTAT2 & 0x2));   //Wait until THR is empty.

        Delay(10);

        rUTXH2 = data;

    }      

}


搞了这么久我还不知道如何确定ARM的大端或是小端格式,这个是在启动代码里设置的,现在还没看,mini2440的串口代码和华恒2410的串口发送代码一样的。注释如上。


主函数中的关键代码:

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

*   Function Name               :   Main()

*   Create Date                 :   2011/12/10

*   Author/Corporation          :   涛行天下

*

*   Description                 :   Find a proper thread in thread array

*

*   Param                       :   ThreadNo : someParam description

                                    ThreadStaus : someParam description

*

*

*   Global Variable             :   DISP_wuiSegmentAppID

*   File Static Variable                :   naucThreadNo

*   Function Static Variable        :   None

*   

*----------------------------------------------------

*   Revision History

*   No.         Date          Revised by                 Item       Description

*   V0.0           2011/12/10     涛行天下          ...         ....

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

void Main(void)

{

    U8 count_num = 0;

    char *mode;

    int i;

    U8 key;

    U32 mpll_val = 0 ;

    //U32 divn_upll = 0 ;


    #if ADS10   

//  __rt_lib_init(); //for ADS 1.0

    #endif


    Port_Init();//端口初始化


    Isr_Init();//中断初始化


    i = 2 ; //don't use 100M!

        //boot_params.cpu_clk.val = 3;

    //确定频率

    switch ( i )

    {

        case 0: //200

            key = 12;

            mpll_val = (92<<12)|(4<<4)|(1);

            break;

        case 1: //300

            key = 13;

            mpll_val = (67<<12)|(1<<4)|(1);

            break;

        case 2: //400

            key = 14;

            mpll_val = (92<<12)|(1<<4)|(1);

            break;

        case 3: //440!!!

            key = 14;

            mpll_val = (102<<12)|(1<<4)|(1);

            break;

        default:

            key = 14;

            mpll_val = (92<<12)|(1<<4)|(1);

            break;

    }


    //init FCLK=400M, so change MPLL first

    ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);

    ChangeClockDivider(key, 12);

    cal_cpu_bus_clk();


    consoleNum = 0; // Uart 1 select for debug.选择串口号

    Uart_Init( 0,115200 );//初始化串口参数以及时钟源

    Uart_Select( consoleNum );//选择串口号


    Beep(2000, 100);//蜂鸣器


    Uart_SendByte('');//打印信息

    Uart_SendByte('H');

    while(1)

    {

        Uart_SendByte(count_num);

        Uart_SendByte(' ');

        count_num ++;

        Delay(500);

    }

从而让ARM一直向PC机发送从0-255数据,在PC机中显示结果如下:
 
这个看不了十六进制的数,我搞了个串口助手来显示:
 
上面那个是用mini2440实现的,那个通过UBOOT可以直接烧写程序,不过到了华恒的板子我就不知道为啥了,这个苦闷了我好久,今天在进入PPCBOOT中利用erase命令把那个linux系统檫除了,然后进入ppcboot命令行形式才可以jtag调试,不知道为啥,这次终于进了一次调试结果出来了。
 
 
下面出一张计数的图,感觉下成就感吧,虽然底层函数还没完全弄懂!
 
现在总结这些步骤吧,最开始在上电的时候不要立马启动系统,先要进入PPCBOOT模式命令行,然后再启动AXD调试器。
 
通过H-JATG软件可以看到是小端格式的,但是具体怎么设置暂时还不清楚,

#define WrUTXH0(ch) (*(volatile unsigned char *)0x50000020)=(unsigned char)(ch)


rUTXH0即是写UTXH0的意思,UTXH0是第一个串口的发送缓冲寄存器!

2011/12/13日

还是阿南的程序给力啊,华恒板子带的程序没啥用

2011/12/21日

感慨日子过的飞快啊!可是我却没啥长进,先上程序吧:


;//呼叫主应用程序

    b UART

UART

    ldr r0, =GPHCON ;//设置RxD0,TxD0引脚

    ldr r1, =0x2afaaa

    str r1, [r0]

     

    ldr r0, =GPHUP

    ldr r1, =0x7ff

    str r1, [r0] ;    // The pull up function is disabled GPH[10:0]



    ldr r0, =UFCON0 ;//禁用FIFO

    ldr r1, =0x0

    str r1, [r0]

   

    ldr r0, =UMCON0  ;//禁用AFC

    ldr r1, =0x0

    str r1, [r0]

     

    ldr r0, =ULCON0 ;//设置线寄存器

    ldr r1, =0x3   ; //UART LINE CONFIG  正常模式,无奇偶校验,一个停止位,8个数据位

    str r1, [r0]

     

    ldr r0, =UCON0 ;//设置Uart0控制器

    ldr r1, =0x245;//RX边沿触发,TX电平触发,禁用延时中断,使用RX 错误中断,正常操作模式,中断请求或表决模式

    str r1, [r0]

     

    ldr r0, =UBRDIV0 ;//设置波特率为115200

    ldr r1, =0x1a    ;//int(50700000 / 16 / 115200) - 1 = 26

    str r1, [r0]

     

    mov r1, #100

Delay

    sub r1, r1, #0x1

    bne Delay

     

    ;//开中断

    ldr r0, =INTMSK

    ldr r1, [r0]

    and r1, r1, #0xefffffff

    str r1, [r0]

     

    MOV R5 , #127 ;//设置要打印的字符的个数

    MOV R1 , #0x0 ;//设置要打印的字符

LOOP  

   LDR R3 , =UTRSTAT0

   LDR R2 , [R3]

   TST R2 ,#0x04 ;//判断发送缓冲区是否为空

   BEQ LOOP      ;//为空则执行下边的语句,不为空则跳转到LOOP

   LDR R0 , =UTXH0

   

   STR R1 ,[R0] ;//向数据缓冲区放置要发送的数据

   ADD R1, R1, #1

   SUB R5 ,R5, #0x01 ;//计数器减一

   CMP R5 ,#0x0

   BNE LOOP

   

LOOP2   B LOOP2


这个紧跟随这启动代码后面的一部分用汇编编的串口发送程序,设置相关寄存器,然后往PC端发送数据。


关键字:ARM  串口  UART实验 引用地址:ARM裸机篇-串口UART实验

上一篇:ARM一些总结
下一篇:关于ARM的21个常用概念

推荐阅读最新更新时间:2024-11-20 18:30

基于ARM和Linux交叉开发环境的搭建
摘要:交叉开发环境是嵌入式Linux开发的基础.后续的开发过程几乎都是基于此环境的。而ARM作为一种高性能、低成本的嵌入式RISC微处理器。已成为应用最广泛的嵌入式处理器。本文内容包括基于32位ARM920T核“GEC2410”开发板的硬件结构和嵌入式Linux交叉开发环境的概念和配置.开发工具的使用以及交叉调试器制作的方法。利用虚拟机在Windows操作系统下,为“GEC2410”开发板搭建了一个嵌入式Linux的运行平台。 关键词:交叉开发环境;ARM;Linux 0 引言 目前,随着ARM技术的日益成熟和广泛应用,基于ARM核的微处理器已经成为嵌入式市场的主流。而建立面向ARM构架的嵌入式操作系统也就成为当前研究的
[工业控制]
基于<font color='red'>ARM</font>和Linux交叉开发环境的搭建
智嵌物联ZQWL串口服务器成对使用模式演示
一、成对连接模式的两种拓扑 (1)智嵌物联串口服务器通过交换机连接 此种模式特点是,串口服务器都接到由交换机组成的局域网内(在一个网段内),用现有的网络布线取代原来的串口布线。网络拓扑如图0.1所示。 图0.1成对连接使用拓扑1 (2)串口服务器通过网线直接相连 此种模式特点是,两个串口服务器直接用网线相连,将原来的串口通讯线用网线替代。网络拓扑如图0.2所示 图0.2成对连接使用拓扑2 二、成对连接模式的具体使用步骤 为方便说明,现将串口服务器A记为A模块;串口服务器B记为B模块。以下说明如何将A模块的PORT1口与B模块的PORT1口通讯(其他情况,如A模块的PORT1和B模块的PORT2通讯、A模块的PORT2和B模
[嵌入式]
智嵌物联ZQWL<font color='red'>串口</font>服务器成对使用模式演示
未来汽车时代将比预期更早到来
当我们激动地谈论未来汽车的时候,你可能会认为完全自动驾驶汽车这个想法真大胆,在多向前迈几步,我们就能实现它。但事实上,我们还没有走到那一步,有些怀疑论者甚至认为前路困难重重,我们永远也不可能实现。但作为工程师,我们知道自动驾驶一定能够实现。问题的关键在于实现还需要多久、最佳路线是哪一条以及需要付出多少成本。 我们展开一张地图,看看可以如何从汽车电子设备的角度来实现这个目标。首先要知道把所有不同的元件组合在一起实现无缝连接的安全性能是一项很大的工程。好消息是,我们已经初窥门径:今天的先进驾驶辅助系统(ADAS)已经包括了紧急制动辅助、线控转向和防撞等功能。如果想实现在每一辆车上都配备这样的先进技术,相关系统必须先实现高性能、低成
[汽车电子]
Arm Linux 内核页表的段式映射
Linux启动之初,内核为自己建立的是段式内存映射,而不是页式映射。 映射表(PGD)从虚拟地址0xc0004000开始,每项4字节,每项对应1M内存空间,每项的高12位就是这1M内存的高12位地址。 一开始,内核不会为所有内存建立映射,只会映射必要的一部分,这部分代码在arch/arm/kernel/head.S中由汇编代码完成。 以S3C6410为例,下面是在刚刚进入start_kernel()后打印出来的一段内核映射表。注意内核自身的映射表项是从0xc0007000地址开始。因为从0xc0004000开始的是整个4G空间的表,内核内存只占最高的那1G,所以要加一个偏移量:3G/1M * 4bytes = 0x3000。
[单片机]
ARM笔记: ADC转换器
S3C2440的CMOS模拟数字转换器ADC可以对8通道模拟输入信号进行循环检测,S3C2440的ADC和触摸屏公用一个ADC转换器,所以学习ADC也是学习触摸屏的基础。 S3C2440ADC的主要特性如下: ●分辨率:10位 ●最大转换速率:500KSPS ●微分线性度误差:±1.0 LSB ●积分线性度误差:±2.0 LSB ●供电电压:3.3V ●模拟输入电压范围:0~3.3V ADC原理 ADC是一种将模拟信号转化为数字信号的方法,一般要经过采样、保持、量化、编码4个步骤。在实际电路中,有些过程是合并进行的,如采样和保持,量化和编码在转换过程中时同时实现的。由奈奎特采样定理可知,当采样
[单片机]
<font color='red'>ARM</font>笔记: ADC转换器
移动嵌入ARM7串口9位方式编程技术
1 主从式多机通信   所谓主从式多机系统,即在数个arm(或 单片机 )中,有一个是主机,其余的为从机。从机要服从主机的调度、支配,其拓扑结构如图1所示。      主机信息可以发到各个从机,从机发送的信息只能被主机接收,从机之间不进行通信。   51单片机串口不同寻常的特征是包括第9位方式(在串口模式2和模式3下)。它允许把在串行口通信增加的第9位用于标志特殊字节的接收。一般约定第9位为高时表示该字节为地址字节,第9位为低时为数据字节。第9位方式允许接收单片机信息,仅当字节具有一个第9位时才能被中断。用这种方式,主机首先广播1字节,并让其第9位为高,同时收到该字节的各个从机,只有地址相符的打开,以接收后面的数
[单片机]
移动嵌入<font color='red'>ARM</font>7<font color='red'>串口</font>9位方式编程技术
多版本STC单片机的CRC串口校验程序
单片机源程序如下: #include reg52.h #include intrins.h typedef unsigned char uchar8; typedef unsigned short uint16; typedef unsigned long uint32; bit Bee_flag = 0; bit Rx_start_flag; bit Rx_stop_flag; bit crc_flag = 0; uchar8 Rx_BUF ; uchar8 Rx_count; uint32 crcData; uint32 crcData_temp; uchar8 Rx_data_buf ; uchar8 T
[单片机]
基于ARM与MEMS器件的微惯性测量装置设计
   摘要 开发一种生物运动微惯性测量装置,以基于ARM7的LPC2129为核心处理单元,采用MEMS陀螺和MEMS加速度计为测量传感器。该装置实现了对SPC-III机器鱼尾鳍拍动参数的精确测量,为活体鱼尾鳍拍动参数测量实验打下了基础。    关键词 微惯性测量 LPC2129 MEMS器件 尾鳍拍动   在仿生推进机理的研究中,精确测量鱼类尾鳍拍动参数对于鱼类仿生推进机理研究及工程应用具有重要的意义;然而,目前研究者大多采用分析高速摄像机拍摄的图像获得参数的观测方法。这种方法受到环境与设备的限制,结果精确度较差。本设计是一种基于MEMS器件的生物运动微惯性测量装置。利用该装置实现了对SPC-III机器鱼尾鳍拍动参数的精确测量
[工业控制]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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