ARM嵌入式UART初始化程序解释
- 格式:pdf
- 大小:770.88 KB
- 文档页数:13
ARM处理器系统初始化过程在嵌入式系统中,ARM处理器是最常用的处理器之一。
ARM处理器的系统初始化过程可以分为硬件初始化和软件初始化两个阶段。
本文将介绍ARM处理器系统初始化的具体流程。
硬件初始化在系统上电后,ARM处理器进入硬件初始化阶段。
主要任务是对处理器的外设进行初始化。
1.初始化时钟系统:ARM处理器的时钟系统是处理器运行的根底,因此在初始化过程中需要设置适当的时钟频率和时钟源。
这可以通过配置PLL〔Phase Locked Loop〕或者外部晶振来实现。
2.使能缓存:缓存是提高处理器性能的关键。
在初始化过程中,需要配置L1缓存和L2缓存的大小、映射方式等参数,并使能它们。
3.配置中断控制器:中断是处理器与外设交互的一种方式。
在初始化过程中,需要配置中断控制器,使其能够正确地响应外设发出的中断请求。
4.初始化外设:根据系统的需求,初始化各个外设,包括串口、SPI、I2C等外设。
这些外设的初始化过程涉及到设备的存放器配置、中断使能等操作。
5.设置存储器映射:ARM处理器通过存储器映射来访问外部存储器。
在初始化过程中,需要设置存储器映射表,使处理器能够正确地访问外部存储器。
软件初始化在硬件初始化完成后,ARM处理器进入软件初始化阶段。
主要任务是加载和运行操作系统及应用程序。
1.复位处理器:在软件初始化过程中,可以选择复位处理器,将处理器重新置于初始状态。
这通常通过将Reset引脚拉低来实现。
2.加载引导程序:引导程序是系统启动的第一段代码,其功能是加载操作系统的核心代码。
在软件初始化过程中,需要将引导程序加载到适当的内存位置,并设置处理器的执行起点。
3.初始化操作系统:一旦引导程序加载完成,操作系统开始初始化。
这包括初始化内核数据结构、初始化设备驱动程序、启动任务调度器等。
4.加载应用程序:在操作系统初始化完成后,可以选择加载应用程序。
应用程序的加载可以通过文件系统来实现,将应用程序从存储设备读取并加载到内存中。
嵌⼊式试题集(含答案)---内容简单-不够详尽1、ARM微处理器有7种⼯作模式,它们分为两类⾮特权模式、特权模式。
其中⽤户模式属于⾮特权模式2、ARM⽀持两个指令集,ARM核因运⾏的指令集不同,分别有两个状态ARM 、Thumb,状态寄存器CPSR的T 位反映了处理器运⾏不同指令的当前状态3、ARM核有多个寄存器,其中⼤部分⽤于通⽤寄存器,有⼩部分作为专⽤寄存器,R15 寄存器⽤于存储PC,R13通常⽤来存储SP 。
ARM处理器有两种总线架构,数据和指令使⽤同⼀接⼝的是冯诺依曼,数据和指令分开使⽤不同接⼝的是哈佛结构4、ARM微处理器复位后,PC的地址通常是0x0 ,初始的⼯作模式是Supervisor 。
5、ARM微处理器⽀持虚拟内存,它是通过系统控制协处理器CP15 和MMU(存储管理部件)来进⾏虚拟内存的存储和管理。
当系统发⽣数据异常和指令领取异常时,异常处理程序透过嵌⼊式操作系统的内存管理机制,通过MMU交换物理内存和虚拟内存的页⾯,以保证程序正常执⾏。
6、编译链接代码时,有两种存储代码和数据的字节顺序,⼀种是⼩端对齐,另⼀种是⼤端对齐。
7、构建嵌⼊式系统开发环境的⼯具链有多种,其中开放源码的⼯具链是GNU⼯具链,ARM公司提供的⼯具链是ADS⼯具链计算机有CISC和RISC两种类型,以ARM微处理器为核⼼的计算机属于RISC类型,其指令长度是定长的8、⽬前使⽤的嵌⼊式操作系统主要有哪些?请举出六种较常⽤的。
Windows CE/Windows Mobile、VxWork、Linux、uCos、Symbian、QNX任选六9、Boot Loader在嵌⼊式系统中主要起什么作⽤?完成哪些主要的⼯作?答:Boot Loader是在嵌⼊式系统复位启动时,操作系统内核运⾏前,执⾏的⼀段程序。
通过Boot Loader,初始化硬件设备,建⽴内存和I/O空间映射图,为最终加载操作系统内核调整好适当的系统软硬件环境。
ARM学习报告001 杜云海 duyunhai@ARM映象文件及执行机理ARM学习报告0012004-5-7这几天为了弄清楚ARM系统是如何运行相应的可执行程序可谓费尽心机,整个五一假期都没有休息,其中由于烧写flash的软件出了些问题,使得理解ARM映象文件及执行机理更加曲折,不过还好在自己的努力和论坛上兄弟的帮助下,终于还是成功了。
作为进入ARM系统设计的重要一步,我觉得这个过程是应该写下来的,既是为了自己的总结,也为了后来进入ARM的人可以少走些弯路。
我的开发板配置如下:l CPU:S3C4510B芯片(ARM7TDMI核)l FLASH:1片16×1M位数据宽度的FLASH,共2M 字节Flash(MX29LV160BTC),速度70/90ns;16位模式。
l 内存SDRAM:2片4M ×16位数据宽度的SDRAM(HY57V651620B TC-10S)构成,共16M 字节SDRAM。
2片16位拼做32位使用,共用一个片选。
l 简易JTAG调试,两个串口,一个以太网口从我个人的学习经过认为,初学者最难突破的应该是以下三个方面。
所以,本文基本上从这三个方面来阐述。
l ARM映象文件(包括axf文件和bin文件)的生成和组成l 映象文件下在flash中的状态和运行时的状态(加载域和运行时域)l 地址重映射remap本文基本围绕附录给出的那个串口发送程序MySComm4510b002.mcp而展开的。
这个程序的初始化和地址重映射部分参考了twentyone的程序(http://bbs.edw.com.cn/dispbbs.asp?boardID=20&ID=27980&page=1),串口发送部分参考了sofa的程序(那我自己写了什么呢?J)。
首先我们应该建立这样一种概念,对于一个裸机(Flash里什么都没有)来说,所有的细节都得自己设置,不要指望芯片或开发工具可以为你做些什么!所以从第一条指令开始,你就必须负责所有的工作。
单片机串口初始化程序1.引言1.1 概述概述:单片机串口(Universal Asynchronous Receiver/Transmitter,简称UART)是一种常见的通信接口,可以通过串口与其他设备进行数据的传输和通信。
在单片机系统中,串口的初始化是非常重要的步骤,它不仅决定了串口通信的可靠性和稳定性,还影响了单片机整体系统的性能和功能。
本文将详细介绍单片机串口初始化的程序,包括串口的基本概念、串口初始化的重要性以及实现串口初始化的方法。
通过阅读本文,读者将了解到串口初始化的必要性,了解如何在单片机系统中进行串口初始化,从而为后续的串口通信提供完善的基础。
在正式进行串口初始化之前,我们需要先了解串口的基本原理和工作原理。
串口是一种异步的通信接口,它使用起停位、数据位、校验位和波特率等参数来进行通信。
单片机通过串口与外部设备进行数据的传输和接收,可以实现与计算机、传感器、LCD显示屏等设备的数据交互。
串口初始化的重要性不容忽视。
在单片机系统中,串口通常用于与其他设备进行数据的传输和通信。
如果串口初始化不正确或不完善,可能会导致数据传输错误、通信失败甚至系统崩溃。
因此,正确地初始化串口成为了保证系统正常运行和稳定通信的关键步骤。
针对串口初始化,本文将介绍一种常用的实现方法。
这种方法需要设置串口的参数,包括波特率、数据位、校验位和停止位等。
同时,还需要配置单片机的引脚和时钟等相关参数,使其能够正确地与外部设备进行串口通信。
本文将通过代码实例的方式,详细介绍串口初始化的具体步骤和方法,供读者参考和借鉴。
总之,本文将全面介绍单片机串口初始化的程序。
通过此文,读者将深入了解串口的基本概念和工作原理,认识到串口初始化的重要性,并学习到一种常用的串口初始化实现方法。
希望本文能为读者提供有益的知识和帮助,为单片机系统的开发和应用提供参考和指导。
1.2文章结构1.2 文章结构本文旨在介绍单片机串口初始化程序的相关知识和实现方法。
WinCEWinCE1WinCEWinCE1ARM9硬件接口学习之五UARTARM9硬件接口学习之五 UART在没有引入UART之前,由于没有OS,我们写程序烧到开发板内执行后,并不能在程序的运行过程中打印一些提示信息告诉我们程序究竟运行了如何或者提供接口让用户去控制程序的运行路径,最后也只能通过物理现象去判断程序是否执行成功。
使用串口我们便可以实现开发板最基本的数据的发送和接收,实现同开发板的交互,控制程序的运行,并且在程序运行中打印出一些信息进行debug。
实际上bootloader和kernel的控制台(nfs模式)都是通过uart实现的。
由此我们可以发现uart在实际开发中是非常重要的。
1. s3c2410串口基础S3C2410A UART详细的规格说明请参考s3c2410的datasheet。
这里我只分析和试验相关的部分重点。
1) S3c2410的uart默认使用的系统时钟是PCLK。
这和计算uart的波特率有关。
之前在CLOCK的学习中我也提到过,具体可以看里面那张clock block digram./u2/60011/showart_474430.html2)UART的功能模块及数据传输流程每一个uart都包含一个波特率发生器(Baudrate Generator),发送器(Transmitter),接收器(Receiver)以及一个控制逻辑(Control Unit)。
如下图:11-1。
波特率发生器使用的时钟可以为PCLK(默认)或者UEXTCLK(主要是为了达到更高的波特率,默认使用PCLK最高为230.4k bps)。
发送器和接受器分别包括一个16-byte的FIFO以及一个数据移位器(data shifter)。
数据通过发送引脚(TxDn)和接收引脚(RxDn)进行发送和接收。
发送数据时,CPU通过内部总线将要发送的数据写入Transmit buffer,对程序员来讲即将数据写入Transmit Holding Register(若使用FIFO Mode也是写入这个寄存器,硬件内部会自动判断)。
ARM裸机编程系列--UART串口设置之输入输出字符S5PV210 UART相关说明通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来传输串行数据。
发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出;接收数据时,UART检测另一根电线的信号,将串行收集在缓冲区中,CPU即可读取UART获得这些数据。
在S5PV210中,UART提供了4对独立的异步串口I/O端口,有4个独立的通道,每个通道可以工作于DMA模式或者中断模式。
其中,通道0有 256byte的的发送FIFO和256byte的接收FIFO,通道1有64byte的的发送FIFO和64byte的接收FIFO,而通道2和3只有16byte的的发送FIFO和16byte的接收FIFO。
S5PV210的uart结构图如下:S5PV210的uart结构图UART使用标准的TTL/CMCOS逻辑电平来表示数据,为了增强数据抗干扰能力和提高传输长度,通常将TTL/CMOS逻辑电平转换为RS-232逻辑电平,查看原理图可知Mini210S使用的是MAX3232SOP芯片,使用的是TX0和DX0:搜索“XuTXD0”,可知:通过设置UART相关寄存器,我们就可以驱动UART工作,达到发送和接收字符的目的。
程序例子:(完整代码见链接)/*main.c*/int main(){char c;uart_init(); // 初始化串口while (1){c = getc (); // 接收一个字符cputc(c+1); // 发送字符c+1}return 0;}在main函数中,先会调用uart_init()初始化UART,然后使用getc接收PC发过来的字符,再调用putc()将该字符+1回复给PC。
/*uart.c*/void uart_init(){// 1 配置引脚用于RX/TX功能GPA0CON = 0x22222222;GPA1CON = 0x2222;// 2 设置数据格式等UFCON0 = 0x1; // 使能FIFOUMCON0 = 0x0; // 无流控ULCON0 = 0x3; // 数据位:8, 无校验, 停止位: 1UCON0 = 0x5; // 时钟:PCLK,禁止中断,使能UART发送、接收 // 3 设置波特率UBRDIV0 = UART_UBRDIV_VAL; // 35UDIVSLOT0 = UART_UDIVSLOT_VAL; // 0x1}上述代码共有3个步骤,下面我们来一一讲解每一个步骤:第一步配置引脚用于RX/TX功能参考UART引脚连接图,我们需要设置GPA0CON和GPA1CON 寄存器使GPA0和GPA1引脚用于UART功能。
嵌入式写uart程序
在嵌入式系统中,UART(Universal Asynchronous Receiver/Transmitter)是一种常用的串行通信接口。
它用于实现与外部设备之间的数据传输。
以下是一个简单的嵌入式 UART 程序示例,用于发送数据:
```c
#include <stdio.h>
#include <uart.h>
int main() {
// 初始化 UART 接口
uart_init();
// 要发送的数据
char message[] = "Hello, UART!\n";
// 发送数据
uart_send(message, strlen(message));
// 等待数据发送完成
uart_wait_send_done();
return 0;
}
```
在上述示例代码中,我们首先初始化 UART 接口。
然后,我们定义要发送的数据,并使用`uart_send`函数将数据发送到 UART 接口。
最后,我们使用`uart_wait_send_done`函数等待数据发送完成。
请注意,这只是一个简单的示例程序,实际的 UART 编程可能涉及更多的细节,例如设置波特率、数据位数、奇偶校验等。
具体的实现方式可能因所使用的嵌入式平台和编译器而有所不同。
如果你需要更详细的 UART 编程示例或帮助,请提供更多的上下文信息,例如所使用的嵌入式平台、编译器以及具体的需求。
这样我可以提供更具体的帮助和示例代码。
UART初始化程序解释
姓名:xxx
学号:20185228000
0x4004 8080) 位描述
复位值
允许I/O 配置模块的时钟0 12允许UART 的时钟0
0x4004 8098) 位描述
复位值
0x00
DIV 的值为0x0 可以关
UART相关寄存器配置
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); // 使能IOCON时钟LPC_IOCON->PIO1_6 &= ~0x07;
LPC_IOCON->PIO1_6 |= 0x01; //把P1.6脚设置为RXD
LPC_IOCON->PIO1_7 &= ~0x07;
LPC_IOCON->PIO1_7 |= 0x01; //把P1.7脚设置为TXD
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16); // 禁能IOCON时钟
LPC_SYSCON->UARTCLKDIV = 0x1;//时钟分频值为1
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);//允许UART时钟
复位值0
00x4000 800C)
0x4000 800C)
复位值
0奇校验。
发送字符和附带的校验位中1 的个数为奇数Array
偶校验。
发送字符和附带的校验位中1 的个数为偶数
0x4000 800C)
复位值
0 U0LCR[6] 为高电平有效时,输出
复位值UART除数锁存LSB寄存器与U0DLM寄存器一0x010
0x4000 8000 当DLAB = 1) 位域描述
UART 除数锁存是UART 波特率发生器的一部分,并且保持使用的值,与分数分频器一起对UART_PCLK 时钟分频来产生波特率时钟,波特率时钟是波特率的16 倍。
U0DLL 和U0DLM 寄存器一起构成一个16 位除数,其中U0DLL 包含除数的低8 位,U0DLM 包含除数的高8 位;值0x0000 被看作是0x0001,因为除数是不允许为0。
当访问UART 除数锁存寄存器时,U0LCR 中的除数锁存访问位(DLAB)必须为1
复位值UART除数锁存MSB寄存器与U0DLL寄存器一0x000
0x4000 8004 当DLAB = 1) 位域描述
0x4000 8008, 只写) 位域描述
复位
值
U0FCR 控制UART0 RX 和TXFIFOs 的操作。
0x4000 8008, 只写) 位域描述
复位
值
U0FCR 控制UART0 RX 和TXFIFOs 的操作。
相关寄存器配置及波特率计算
LPC_UART->LCR = 0x83; //8位传输,1个停止位,无几偶校验,允许访问除数锁
; //计算该波特率要求的除数锁存寄
//写除数锁存器高位值
//写除数锁存器低位值
DLM 和DLL 为标准UART 波特率除数寄存器。
UART相关寄存器配置
void UART_init(uint32_t baudrate)
{
uint32_t DL_value;
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); // 使能IOCON时钟
LPC_IOCON->PIO1_6 &= ~0x07;
LPC_IOCON->PIO1_6 |= 0x01; //把P1.6脚设置为RXD
LPC_IOCON->PIO1_7 &= ~0x07;
LPC_IOCON->PIO1_7 |= 0x01; //把P1.7脚设置为TXD
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16); // 禁能IOCON时钟
LPC_SYSCON->UARTCLKDIV = 0x1;//时钟分频值为1
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);//允许UART时钟
LPC_UART->LCR = 0x83; //8位传输,1个停止位,无几偶校验,允许访问除数锁存器DL_value= SystemCoreClock/16/baudrate; //计算该波特率要求的除数锁存寄存器值LPC_UART->DLM = DL_value/ 256;//写除数锁存器高位值
LPC_UART->DLL = DL_value% 256;//写除数锁存器低位值
LPC_UART->LCR = 0x03; //DLAB置0
LPC_UART->FCR = 0x07; //允许FIFO,清空RxFIFO和TxFIFO
}
谢谢观看。