ARM笔记: UART程序

发布者:幸福的时光最新更新时间:2017-11-17 来源: eefocus关键字:ARM笔记  UART程序 手机看文章 扫描二维码
随时随地手机看文章

UART程序:
一、head.S文件的编写 作用是启动代码

@******************************************************************************

@ File:head.S

@ 功能:初始化,系统模式的栈

@******************************************************************************       

   

.extern     main

.text 

.global _start 

_start:

     

    b   Reset

 

Reset:                  

    ldr sp, =4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈

    bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启

    bl  clock_init          @ 设置MPLL,改变FCLK、HCLK、PCLK

    bl  memsetup            @ 设置存储控制器以使用SDRAM

   bl  inituart                  @编写的inituart()串口初始化函数 在init.c中

    bl  copy_steppingstone_to_sdram     @ 复制代码到SDRAM中

    ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行

on_sdram:

 

    msr cpsr_c, #0xdf       @ 进入系统模式

    ldr sp, =0x34000000     @ 设置系统模式栈指针,

     

    

    

    ldr lr, =halt_loop      @ 设置返回地址

    ldr pc, =Main           @ 调用main函数

halt_loop:

    b   halt_loop

二、init.c 文件  其中声明了一些需要使用的函数及实现 

 

#include "2440addr.h"

 

void disable_watch_dog(void);

void clock_init(void);

void memsetup(void);

void copy_steppingstone_to_sdram(void);

void inituart(void);

void disable_watch_dog(void)

{

    rWTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可

}

#define S3C2410_MPLL_200MHZ     ((0x5c<<12)|(0x04<<4)|(0x00))

#define S3C2440_MPLL_200MHZ     ((0x5c<<12)|(0x01<<4)|(0x02))

void clock_init(void)

{

    // LOCKTIME = 0x00ffffff;   // 使用默认值即可

    rCLKDIVN  = 0x03;            // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1

    

__asm__(

    "mrc    p15, 0, r1, c1, c0, 0\n"         

    "orr    r1, r1, #0xc0000000\n"          

    "mcr    p15, 0, r1, c1, c0, 0\n"        

    );

    

    if ((rGSTATUS1 == 0x32410000) || (rGSTATUS1 == 0x32410002))

    {

        rMPLLCON = S3C2410_MPLL_200MHZ;  

    }

    else

    {

        rMPLLCON = S3C2440_MPLL_200MHZ;  

    }       

}

void memsetup(void)

{

    volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;

    

    

    p[0] = 0x22011110;     //BWSCON

    p[1] = 0x00000700;     //BANKCON0

    p[2] = 0x00000700;     //BANKCON1

    p[3] = 0x00000700;     //BANKCON2

    p[4] = 0x00000700;     //BANKCON3  

    p[5] = 0x00000700;     //BANKCON4

    p[6] = 0x00000700;     //BANKCON5

    p[7] = 0x00018005;     //BANKCON6

    p[8] = 0x00018005;     //BANKCON7

    

     

    p[9]  = 0x008C04F4;

    p[10] = 0x000000B1;     //BANKSIZE

    p[11] = 0x00000030;     //MRSRB6

    p[12] = 0x00000030;     //MRSRB7

}

void copy_steppingstone_to_sdram(void)

{

    unsigned int *pdwSrc  = (unsigned int *)0;

    unsigned int *pdwDest = (unsigned int *)0x30000000;

    

    while (pdwSrc < (unsigned int *)4096)

    {

        *pdwDest = *pdwSrc;

        pdwDest++;

        pdwSrc++;

    }

}

 

void inituart(void)

{

rGPBCON = 0x015551;

rGPBUP  = 0x7ff;

rGPBDAT = 0x1e0;

   

rGPHCON = 0x00faaa;                //使用UART0功能

rGPHUP  = 0x7ff;

 

rULCON0 = 0x3;                        //设置UART0无奇偶校验,一位停止位,8位数据

rUCON0 = 0x245;                //PCLK为时钟源,接收和发送数据为查询或中断方式

rUFCON0 = 0;                     //

rUMCON0 = 0;                    //

rUBRDIV0 = 26;  

}

三、uart.c   这个程序是使用查询方式实现的串口通信

#include"2440addr.h"

void Main(void)

{

       char ch;

               //设置波特率,PCLK为50MHz,波特率为115.2kHz

   

while(!(rUTRSTAT0 & 0x2));       //等待并判断发送缓存是否为空

       rUTXH0 = 0xaa;                         //是空,则发送0xAA字节

 

while(1)

{

              while(!(rUTRSTAT0 & 0x1)); //等待并判断接收缓存是否准备好

 

 ch = rURXH0;                     //接收一个字节数据

              

              while(!(rUTRSTAT0 & 0x2));      //等待并判断发送缓存是否为空

              

              rUTXH0 = ch;                     //发送一个字节数据

 

switch(ch)             //根据所接收数据的不同,执行不同的程序

              {

       case 0x11:              //灭LED

                           rGPBDAT |= 0x1e0;

       break;

                                 case 0x22:             //亮LED

                             rGPBDAT &= 0x1f;

                     break;

       case 0x33:             //蜂鸣器不响

                               rGPBDAT &= 0x1e0;

                           break;

                                case 0x44:             //蜂鸣器响

                                     rGPBDAT |= 0x1;

                                     break;

                                default:                 //LED灭,蜂鸣器不响

                                     rGPBDAT = 0x1e0;

                                     break;

}

}

}

四、uart.lds  这个文件具体的作用不太清楚,个人感觉应该是段的声明和入口地址之类的作用。

SECTIONS {

    . = 0x30000000;

    .text          :   { *(.text) }

    .rodata ALIGN(4) : {*(.rodata)} 

    .data ALIGN(4) : { *(.data) }

    .bss ALIGN(4)  : { *(.bss)  *(COMMON) }

}

五、Makefile 

objs := head.o uart.o init.o

uart.bin: $(objs)

arm-linux-ld -Tuart.lds -o uart_elf $^

arm-linux-objcopy -O binary -S uart_elf $@

arm-linux-objdump -D -m arm uart_elf > uart.dis

%.o:%.c

arm-linux-gcc -Wall -O2 -c -o $@ $<

%.o:%.S

arm-linux-gcc -Wall -O2 -c -o $@ $<

clean:

rm -f uart.bin uart_elf uart.dis *.o

有了上面五个文件,在Linux下面,直接使用命令即可生成 uart.bin文件,烧写到NAND FLASH里面,再从NAND FLASH 启动就可以运行了。利用串口调试工具即可进行数据通信。


关键字:ARM笔记  UART程序 引用地址:ARM笔记: UART程序

上一篇:ARM筆記:定时器中断的应用
下一篇:ARM笔记: UART学习笔记

推荐阅读最新更新时间:2024-03-16 15:45

ARM笔记:外部中断
一、概念 中断分为两大类:外部中断和内部中断。 1、外部中断:S3C2440的24个外部中断占用GPF0~GPF7(EINT0~EINT7)、 GPG0~GPG15(EINT8~EINT23)。使用这些引脚作为中断输入时,必须将引脚配置为EINT模式,配置方法可参考datasheet。 2、内部中断:内部中断包括DMA中断、UART中断、IIC中断等等由内部外设触发的中断。 3、相关寄存器:S3C2440中断控制涉及到10个寄存器-- SRCPND、INTMOD、INTMSK、PRIORITY、INTPND、INTOFFSET、SUBSRCPND、INTSUBMSK、EINT
[单片机]
<font color='red'>ARM</font><font color='red'>笔记</font>:外部中断
Exynos4412裸机程序UART收发数据
Exynos4412 UART 的特性 Exynos4412 中UART,有4 个独立的通道,每个通道都可以工作于中断模式或DMA 模式,即 UART 可以发出中断或 DMA 请求以便在UART 、CPU 间传输数据。UART 由波特率发生器、发送器、接收器和控制逻辑组成。 使用系统时钟时,Exynos4412 的 UART 波特率可以达到 4Mbps 。波特率可以通过编程进行 。 Exynos4412 UART 的通道 0有 256 字节的发送 FIFO 和 256 字节的接收FIFO ;通道 1、4有 64 字节的发送 FIFO 和 64 字节的接收FIFO;通道 2、3有 16 字节的发送FIFO 和 16 字节 的接收 F
[单片机]
Exynos4412裸机<font color='red'>程序</font>之<font color='red'>UART</font>收发数据
ARM汇编语言学习笔记(五)给c语言传递参数和获取返回值
一、目的 如何给c函数传参 如何获取c函数的返回值 二、如何传参 我们通过给寄存器值来传递参数 在代码中体现为: 先给寄存器r0一个值,然后bl调用函数led_on mov r0, #4 bl led_on 这是led_on int led_on(int which) { return 0; } 三、如何获取返回值 同样我们直接看r0的值就可以啦。
[单片机]
<font color='red'>ARM</font>汇编语言学习<font color='red'>笔记</font>(五)给c语言传递参数和获取返回值
单片机下串口(UART)协议包接收程序
代码编写在51单片机上,用于从接收缓冲区中提取有用数据(协议包)。基本逻辑亦可用于其他语言,其他情况下的接收程序。 数据的转移主要分了3步,接收缓冲区=》待处理数据=》有用数据。 接收缓冲区提取到待处理数据:由于可能下一个包马上就要过来,所以应把数据提取出来再做处理,以免直接处理的过程中收到新的数据造成混乱。 待处理数据提取到有用数据:例如在某些环境下,会收到其他协议的包(由其他程序处理),或者带有地址区分是否发给本机的包,所以需要设置一些条件来提取真正有用的数据。 单片机串口UART在接收中断程序中写入接收缓冲区,一定时间没有收到数据则标志为接收空闲(完成一个包的接收)。 本段代码先判断串口处于接收空闲状态,
[单片机]
C8051F330串口UART0示例程序
//**************************************************************************** // 功能:C8051F330串口UART0示例程序 //**************************************************************************** //使用F330,串口为P0.4(TX0),P0.5(RX0); //----------------------------------------------------------------------------- // UART0.c //--------
[单片机]
ARM学习笔记010之Gcc编译新问题
之前的除法除不出来还没有解决,现在又有以下问题(在不添加raise函数的情况下): 网上说的原因是: I'm getting the relocation truncated to fit: R_ARM_PC24 against symbol error message when linking, what does this mean? You will get this error message when you are calling an external function that is too far for the ARM's branch and link instruction to r
[单片机]
<font color='red'>ARM</font>学习<font color='red'>笔记</font>010之Gcc编译新问题
ARM Cortex-M3 学习笔记(4-2)
最近在学ARM Cortex-M3,找了本号称很经典的书 An Definitive Guide to The ARM Cortex-M3 在看。这个系列学习笔记其实就是在学习这本书的过程中做的读书笔记。 第四章 指令系统 数据传送类指令 寄存器到寄存器传送:MOV 指令、MVN指令 MOV R8, R3; R8 = R3 MVN R8, R3; R8 = -R3 学过微机原理的都应记得,x86中一条MOV 指令存储器和寄存器间的任意传送。ARM 中是不行的,这也是CISC和RISC 内核的一个比较明显的区别。 存储器到寄存器传送:LDRx 指令、LDMxy指令 寄存器到存储器:STRx 指令、STMxy指令 LDRx 指令
[单片机]
ARM 的异常处理学习笔记
ARM 的异常处理 这部分比较不好理解。 当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断指令的下条指令处执 行。在进入异常中断处理程序时,要保存被中断程序的执行现场,从异常中断处理程序退出时,要恢复被中断程序的执行现场。 1、引起异常的原因 (1)、指令执行引起的异常 软件中断、未定义指令(包括所要求的协处理器不存在是的协处理器指令)、预取址中止(存储器故障)、数据中止。 (2)、外部产生的中断 复位、FIQ、IRQ。 2、ARM中异常中断的种类 (1)、复位(RESET) a、当处理器复位引脚有效时,系统产生复位
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
发布文章
设计资源 培训 开发板 精华推荐

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

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

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