《ARM Cortex嵌入式系统开发教程》课件第4章_第1页
《ARM Cortex嵌入式系统开发教程》课件第4章_第2页
《ARM Cortex嵌入式系统开发教程》课件第4章_第3页
《ARM Cortex嵌入式系统开发教程》课件第4章_第4页
《ARM Cortex嵌入式系统开发教程》课件第4章_第5页
已阅读5页,还剩355页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章LPC1700系列处理器4.1GPIO接口4.2定时器4.3看门狗4.4UART串口通信4.5ADC/DAC4.6实时时钟4.7其它接口

基本接口技术

LPC1700系列嵌入式处理器具有丰富的外设接口,以满足不同应用场合的需要。处理器中内嵌1个10/100M以太网介质询问控制器(MAC),1个带4KB端点RAM的USB2.0全速device/host/OTG控制器,4个UART串行口,2个CAN通道,1个SPI接口,2个同步串行口(SSP),3个I2C接口和1个I2S接口。为了支持上述串行通信接口,LPC1700系列处理器采用了一些特殊的部件,主要包括1个片上4MHz内置高精度时钟发生器;共计64KB的片内RAM,32KB的本地SRAM,2个共AHB总线模块使用的16KBSRAM,该SRAM用以支持以太网、USB、DMA存储器等模块操作。除了上述串行通信控制器外,LPC1700系列处理器还具有4个32位的定时器,1个看门狗,1个正交编码器接口,1个RTC,1个增强12位8通道的ADC和10位DAC,2个PWM单元,4根外部中断引脚,以及多至70条的快速GPIO引脚。所有这些接口及特性使得LPC1700系列处理器特别适合于电子测量、工业控制总线、白色家电、报警系统以及电机控制系统等应用场合。

本章选取实际应用中所使用的基本外设接口进行介绍,使读者对LPC1700系列处理器的应用有一个初步了解。LPC1700系列处理器的高级通信接口将在下一章介绍。

4.1.1特性

LPC1700嵌入式处理器共有5个通用输入/输出端口,即GPIO接口,占用P0~P4共70根引脚。这些引脚一般与其它外围设备模块引脚复用,所以在某些应用场合不是所有GPIO引脚都能使用。4.1GPIO接口

1.数字I/O端口

LPC1700嵌入式处理器采取以下方法加速GPIO端口的操作速度:GPIO寄存器被安排在外设AHB总线寻址空间,以实现高速的I/O时序;屏蔽寄存器允许将某些端口位作为一组进行操作,而其它位不变;所有GPIO寄存器都可按字节、半字和字寻址;整个端口值可用一条指令写入;GPIO寄存器可由GPDMA进行访问。

其它特性还包括:位电平置位和清零寄存器允许用一条指令置位清零一个端口的任意位;所有GPIO寄存器支持Cortex-M3位带操作;GPIO寄存器可由GPDMA控制器进行访问,允许对GPIO进行DMA数据操作,使之与DMA请求同步;单个端口的方向可控制;所有I/O口在复位后默认为上拉输入。

2.中断信号产生端口

LPC1700端口0和端口2的每根引脚都可以产生中断信号。每个中断信号可编程设置为上升沿触发、下降沿触发或脉冲触发。每个使能的中断可作为唤醒信号,用于把某个模块从省电模式中唤醒。用户软件通过操作GPIO寄存器,可以挂起上升沿中断、下降沿中断和GPIO总中断。边沿检测是异步的,因此可以在没有时钟的情况下(例如掉电模式)操作。由于这种特性,就无需电平触发中断。

端口0和端口2的中断信号与VIC的外部中断3共享同一个中断通道。4.1.2应用场合

通用输入/输出端口GPIO引脚可以用于驱动LED或其它指示设备,用于控制片外设备,用于探测数字输入信号和检测电平跳变,还可以用于唤醒某个在省电模式中的外围模块。4.1.3引脚描述

GPIO引脚描述如表4.1所示。

表4.1GPIO引脚描述4.1.4寄存器描述

由于LPC1700嵌入式处理器要求与基于ARM7内核的LPC2300系列产品相兼容,故该处理器只实现了5个32位通用I/O端口中的部分通用引脚功能。具体细节见“引脚功能选择寄存器”章节。

表4.2的GPIO地址映射寄存器反映了所有GPIO口可用的增强型GPIO特性(快速GPIO特性,局部总线可访问寄存器)。这些寄存器位于AHB总线寻址空间,以便进行高速的读写时序。它们支持字节、半字和字的不同大小的数据访问。屏蔽寄存器允许访问一个GPIO端口的一组位,而不影响其它位。

表4.2GPIO寄存器地址映射表

表4.3GPIO中断寄存器地址映射特性1.GPIO端口方向控制寄存器(FIO[0/1/2/3/4]DIR-0x2009C0[0/2/4/6/8]0)

该32位寄存器用于控制已配置为GPIO的引脚的输入/输出方向。在实际应用中应根据引脚的功能正确设置其输入/输出方向。快速GPIO端口方向控制寄存器的特征如表4.4所示。

表4.4快速GPIO端口方向控制寄存器的特征

除了只能按32位访问的FIOxDIR寄存器外,每个快速GPIO端口可以通过几个8位和16位寄存器控制。表4.5列出的寄存器虽然功能与FIOxDIR相同,但使用这些寄存器用户程序能更快更容易地访问物理端口。

表4.5快速GPIO方向控制8位和16位寄存器续表2.GPIO端口输出置位寄存器(FIO[0/1/2/3/4]SET-0x2009C0[1/3/5/7/9]8)

该寄存器用于在GPIO的输出引脚产生高电平输入。对应位写1,则对应引脚输出高电平,写0无效。如果引脚被配置位为输入或其它功能,则写1也无效。对该寄存器执行读操作,返回前一次对该寄存器写入的值,而对外部引脚状态无影响。

读FIOxSET寄存器返回该寄存器的值,该值由前一次对FIOxSET和FIOxCLR(或前面提到的FIOxPIN)的写操作确定,它不反映任何外部环境对I/O引脚的影响。对FIOSET寄存器的访问是否有效要根据FIOMASK寄存器的对应位的状态而定。快速GPIO端口输出置位寄存器特性如表4.6所示。

表4.6快速GPIO端口输出置位寄存器

除了只能按32位访问的FIOxSET寄存器外,每个快速GPIO端口可以通过几个8位和16位寄存器控制。表4.7列出的寄存器虽然功能与FIOxSET相同,但使用这些寄存器用户程序能更快更容易地访问物理端口。

表4.7快速GPIO端口输出置位8位和16位寄存器3.GPIO端口输出清除寄存器(FIO[0/1/2/3/4]CLR-0x2009C0[1/3/5/7/9]C)

该寄存器用于在GPIO的输出引脚产生低电平输出。对应位写1,则对应引脚输出低电平并且清除FIOSET寄存器中对应位,写0无效。如果引脚被配置位为输入或其它功能,则写1也无效。

对FIOCLR寄存器的访问是否有效要根据FIOMASK寄存器的对应位的状态而定。快速GPIO端口输出清除寄存器特性如表4.8所示。

表4.8快速GPIO端口输出清除寄存器特性

除了只能按32位访问的FIOxCLR寄存器外,每个快速GPIO端口可以通过几个8位和16位寄存器控制。表4.9列出的寄存器虽然功能与FIOxCLR相同,但使用这些寄存器用户程序能更快更容易地访问物理端口。

表4.9快速GPIO端口输出清除8位和16位寄存器4.GPIO端口引脚值寄存器(FIO[0/1/2/3/4]PIN-0x2009C0[1/3/5/7/9]4)

该寄存器只提供那些被配置为数字功能的引脚端口值。寄存器保存了端口引脚的逻辑值,而无论引脚被配置位输入或输出,亦或配置为数字功能模块。比如,某个端口引脚可以配置为GPIO输入、输出,UART输入,PWM输出等功能。但该端口所有引脚的逻辑状态可以在FIOPIN寄存器中读出。如果引脚被设置为模拟功能,引脚的状态则不能被有效读到。例如引脚被配置为A/D输入,则该引脚在FIOPIN中的值无效。

写入FIOPIN寄存器的值保存在端口的输出寄存器中,省去了分别写FIOSET和FIOCLR寄存器的步骤。使用该寄存器时要特别注意,因为一旦一个值写入,整个端口引脚的状态都被更新了。如某端口所有引脚配置为GPIO输出,则向FIOXPIN写入0x0000FFFF时,端口的高16根引脚变为低电平输出,低16根引脚变为高电平输出。对FIOPIN寄存器的访问是否有效要根据FIOMASK寄存器的对应位的状态而定。快速GPIO端口引脚值寄存器特性如表4.10所示。

表4.10快速GPIO端口引脚值寄存器特性

除了只能按32位访问的FIOxPIN寄存器外,每个快速GPIO端口可以通过几个8位和16位寄存器控制。表4.11列出的寄存器虽然功能与FIOxPIN相同,但使用这些寄存器用户程序能更快更容易地访问物理端口。

表4.11快速GPIO端口引脚值8位和16位寄存器续表5.快速GPIO端口屏蔽寄存器(FIO[0/1/2/3/4]MASK-0x2009C0[1/3/5/7/9]0)

该寄存器属于快速GPIO端口寄存器组。它用于允许或禁止通过写FIOPIN、FIOSET和FIOCLR寄存器来控制端口引脚状态的操作。屏蔽寄存器也能用于屏蔽对FIOPIN寄存器的读操作。

如果寄存器中某位为0,则允许读或写操作对应端口引脚;如果寄存器中某位为1,则无法通过写操作改变引脚状态;如果读取FIOPIN寄存器,该引脚的当前状态也不会反映出来。快速GPIO端口屏蔽寄存器特性如表4.12所示。

表4.12快速GPIO端口屏蔽寄存器特性

除了只能按32位访问的FIOxMASK寄存器外,每个快速GPIO端口可以通过几个8位和16位寄存器控制。表4.13列出的寄存器虽然功能与FIOxMASK相同,但使用这些寄存器用户程序能更快更容易地访问物理端口。

表4.13快速GPIO端口屏蔽8位和16位寄存器6.GPIO总中断状态寄存器(IOIntStatus-0x40028080)

该只读寄存器保存了支持中断的GPIO端口产生的中断请求。寄存器每位代表一个端口。GPIO总中断状态寄存器特性如表4.14所示。

表4.14GPIO总中断状态寄存器特性7.GPIO上升沿中断使能寄存器(IO[0/2]IntEnR-0x400280[9/B]0)

该读写寄存器每位使能对应GPIO端口引脚为上升沿触发中断。GPIO上升沿中断使能寄存器特性如表4.15所示。

8.GPIO下降沿中断使能寄存器(IO[0/2]IntEnF-0x400280[9/B]4)

该读写寄存器每位使能对应GPIO端口引脚为下降沿触发中断。GPIO下降沿中断使能寄存器特性如表4.16所示。

表4.15GPIO上升沿中断使能寄存器特性

表4.16GPIO下降沿中断使能寄存器特性9.GPIO上升沿中断状态寄存器(IO[0/2]IntStatR-0x400280[8/A]4)

该读写寄存器每位表示对应端口各引脚的上升沿中断状态。GPIO上升沿中断状态寄存器特性如表4.17所示。

表4.17GPIO上升沿中断状态寄存器特性

10.GPIO下降沿中断状态寄存器(IO[0/2]IntStatF-0x400280[8/A]8)

该读写寄存器每位表示对应端口各引脚的下降沿中断状态。GPIO下降沿中断状态寄存器特性如表4.18所示。

表4.18GPIO下降沿中断状态寄存器特性

11.GPIO中断清除寄存器(IO[0/2]IntClr-0x400280[8/A]C)

该寄存器为只读,对每位写1则清除对应GPIO端口的任何中断状态。GPIO中断清除寄存器特性如表4.19所示。

表4.19GPIO中断清除寄存器4.1.5使用注意事项

下面通过两个例子说明使用GPIO接口应注意的事项。

例4.1

顺序访问FIOSET和FIOCLR控制GPIO引脚。

GPIO输出引脚由端口对应的FIOSET和FIOCLR寄存器确定。最后一次访问FIOSET或FIOCLR寄存器决定引脚最终输出状态。

【程序4.1】顺序访问FIOSET和FIOCLR控制GPIO引脚。

FIO0DIR=0x00000080; //端口0引脚7配置位输出

FIO0CLR=0x00000080; //该引脚输出低电平

FIO0SET=0x00000080; //该引脚输出高电平

FIO0CLR=0x00000080; //该引脚输出低电平

例4.2

写FIOPIN寄存器从端口0输出二进制数据。

在实际应用时,先写入FIOSET然后再写入FIOCLR,这样引脚先输出0(低电平),一个小延迟后输出1(高电平)。有的应用系统可以忍受这样的延迟,但有些系统却要求在一个端口同时输出一个由0、1混合的二进制内容。所以通过对FIOPIN寄存器的操作就可以实现这一要求。下列代码保持端口0的引脚16~31和0~7不变,同时在引脚8~15输出0xA5,无论之前引脚为何值。

【程序4.2】使用32位快速GPIO寄存器。

FIO0MASK=0xFFFF00FF;

FIO0PIN=0x0000A500;

【程序4.3】使用16位快速GPIO寄存器。

FIO0MASKL=0x00FF;

FIO0PINL=0xA500;

【程序4.4】使用8位快速GPIO寄存器。

FIO0PIN1=0xA5;写FIOSET/FIOCLR寄存器与写FIOPIN寄存器有以下区别:

(1)对FIOSET/FIOLCR寄存器写1可以很方便地改变引脚状态,而只有对寄存器位写1的引脚状态被改变,其它引脚保持不变。但如果要在GPIO端口同时输出0和1混合的二进制数值时则不能用FIOSET/FIOCLR寄存器。

(2)写FIOPIN寄存器则可以在并行GPIO同时输出需要的二进制数值。写入FIOPIN寄存器的二进制数据将影响所有被配置为输出的引脚状态:写入数据0引脚输出低电平;写入数据1引脚输出高电平。为了只改变端口中某几根引脚状态,应用程序必须将FIOPIN内容读出并和一个屏蔽码相与,屏蔽码中的0位引脚将被设置,1位引脚将保持不变。最后这个结果或上一个需要输出的内容,再保存入FIOPIN寄存器。例4.2就是这样一种情况,端口0的15至8引脚输出0xA5,其它引脚保持不变。4.1.6应用举例

本例使用端口2的P2.0~P2.7共8根引脚控制8盏LED灯。当引脚输出高电平时点亮LED灯,输出低电平熄灭LED灯。

1.GPIO端口寄存器相关宏定义

为了方便用户使用GPIO端口的寄存器,在头文件中定义了GPIO端口的结构体类型以及5个端口的结构体指针宏。具体程序如代码清单4.5所示。

【程序4.5】GPIO端口寄存器相关宏定义。

typedefstruct //结构体中寄存器的安排严格按照寄存器地址的先后顺序

{

union{

_IOuint32_tFIODIR;

struct{

_IOuint16_tFIODIRL;

_IOuint16_tFIODIRH;

};

struct{

_IOuint8_tFIODIR0;

_IOuint8_tFIODIR1;

_IOuint8_tFIODIR2;

_IOuint8_tFIODIR3;

};

};

uint32_tRESERVED0[3];

union{

_IOuint32_tFIOMASK;

};

union{

_IOuint32_tFIOPIN;

};

union{

_IOuint32_tFIOSET;

};

union{

_Ouint32_tFIOCLR;

};

}LPC_GPIO_TypeDef;

//各个端口寄存器基地址宏定义

#defineLPC_GPIO_BASE(0x2009C000UL)

#defineLPC_GPIO0_BASE(LPC_GPIO_BASE+0x00000)

#defineLPC_GPIO1_BASE(LPC_GPIO_BASE+0x00020)

#defineLPC_GPIO2_BASE(LPC_GPIO_BASE+0x00040)

#defineLPC_GPIO3_BASE(LPC_GPIO_BASE+0x00060)

#defineLPC_GPIO4_BASE(LPC_GPIO_BASE+0x00080)

//各个端口寄存器指针宏定义

#defineLPC_GPIO0((LPC_GPIO_TypeDef*)LPC_GPIO0_BASE)

#defineLPC_GPIO1((LPC_GPIO_TypeDef*)LPC_GPIO1_BASE)

#defineLPC_GPIO2((LPC_GPIO_TypeDef*)LPC_GPIO2_BASE)

#defineLPC_GPIO3((LPC_GPIO_TypeDef*)LPC_GPIO3_BASE)

#defineLPC_GPIO4((LPC_GPIO_TypeDef*)LPC_GPIO4_BASE)

2.LED灯初始化函数——LED_init()

LED_init()函数只是端口的简单设置,要是端口既有输出又有输入则可分别独立设置引脚方向。另外程序还定义了LED位数及屏蔽码。具体程序如代码清单4.6所示。

【程序4.6】GPIO端口初始化函数。

#defineLED_NUM8/*NumberofuserLEDs*/

constunsignedlongled_mask[]={1UL<<0,1UL<<1,1UL<<2,1UL<<3,1UL<<4,

1UL<<5,1UL<<6,1UL<<7};

voidLED_init(void){

LPC_GPIO2->FIODIR|=0x000000ff;//P2.0...P2.7OutputLEDsonPORT2definedasOutput

}

3.LED灯点亮函数——LedOn()

LedOn()函数中设置FIO2SET寄存器的某位为1,控制端口2引脚输出高电平,从而点亮LED灯。函数参数num为具体点亮LED灯的序号0~7。具体代码如代码清单4.7

所示。

【程序4.7】LED灯点亮函数。

voidLED_On(unsignedintnum){

LPC_GPIO2->FIOPIN|=led_mask[num];

}

4.LED灯熄灭函数——LedOff()

LedOff()函数中设置FIO2CLR寄存器的某位为1,控制端口2引脚输出低电平,从而熄灭LED灯。函数参数num为具体熄灭LED灯的序号0~7。具体代码如代码清单4.8所示。

【程序4.8】LED灯熄灭函数。

voidLED_Off(unsignedintnum){

LPC_GPIO2->FIOPIN&=~led_mask[num];

}

4.2.1特性

LPC1700嵌入式处理器具有4个32位可编程定时/计数器,除了外设基址之外操作完全相同。4个定时器最少有2个捕获输入和2个匹配输出,并且每个定时器有多个引脚可选择。定时器2引出了全部4个匹配输出。

4.2定时器定时/计数器对外设时钟(PCLK)周期或外部时钟进行计数,可选择产生中断或根据匹配寄存器的设定,在到达指定的定时值时执行其它动作(输出高/低电平、翻转或者无动作)。捕获输入用于在输入信号发生跳变时捕获定时器值,并可选择产生中断。

4个定时器可用作对内部事件进行计数的间隔定时器,或者通过捕获输入实现脉宽调制,也可以作为自由运行的定时器。

LPC1700定时器的主要特点有:

(1)带可编程32位预分频器的32位定时器/计数器。

(2)具有多达4路32位的捕获通道,当输入信号跳变时可取得定时器的瞬时值,也可选择使捕获事件产生中断。

(3)具有4个32位匹配寄存器:

●匹配时定时器继续工作,可选择产生中断;

●匹配时停止定时器,可选择产生中断;

●匹配时复位定时器,可选择产生中断。

(4)具有多达4个对应于匹配寄存器的外部输出,具有下列特性:

●匹配时设置为低电平;

●匹配时设置为高电平;

●匹配时翻转;

●配时无动作。4.2.2应用场合

LPC1700定时器主要运用于以下场合:

(1)对内部事件计数的内部计数器。

(2)通过捕获输入实现脉冲宽度调制器。

(3)普通定时器。

4.2.3定时器结构

定时器逻辑框图如图4.1所示。

图4.1定时器逻辑框图4.2.4引脚功能描述

定时/计数器相关引脚在表4.20中列出。

表4.20定时/计数器引脚描述软件可以在引脚选择寄存器中选择多个引脚用作CAP或MAT功能,详情请参见第3.2节相关内容。当有多个引脚用作匹配输出时,所有引脚状态完全相同;当有多个引脚用作捕获输入时,只有序号最低的引脚有效。需要注意的是,在不使用器件引脚的情况下匹配功能也可以在内部使用。4.2.5寄存器功能描述

表4.21列出了定时/计数器的所有寄存器。寄存器详细功能描述在本节后面给出。

表4.21定时/计数器寄存器列表续表1.中断寄存器(T[0/1/2/3]IR-0x40004000、0x40008000、0x40090000及0x40094000)

中断寄存器中4个位用于匹配中断,2个位用于捕获中断。如果有中断产生,IR中的对应位置1,否则为0。向对应的IR位写入1会复位中断,写入0无效。清除定时器匹配中断也会清除对应的DMA请求,中断寄存器的位描述如表4.22所示。

表4.22中断寄存器的位描述2.定时器控制寄存器(T[0/1/2/3]TCR-0x40004004、0x40008004、0x40090004及0x40094004)

定时器控制寄存器用于控制定时/计数器的操作,定时器控制寄存器的位描述如表4.23所示。

表4.23定时器控制寄存器的位描述3.计数控制寄存器(T[0/1/2/3]CTCR-0x40004070、0x40008070、0x40090070及0x40094070)

计数控制寄存器(CTCR)用来选择定时器或计数器模式,计数器模式下可选择计数的引脚和边沿。计数控制寄存器的位描述如表4.24所示。

当选择工作在计数器模式时,在每个PCLK时钟的上升沿对CAP输入(由CTCR位3:2选择)进行采样。比较完CAP输入的2次连续采样结果后,可以识别下面四个事件中的一个:上升沿、下降沿、任一边沿或选择的CAP输入的电平无变化。只要识别到的事件与CTCR寄存器中位1:0选择的事件相对应,定时器计数器寄存器加1。

计数器的外部时钟源的操作受到一些限制。由于PCLK时钟的2个连续的上升沿用来识别CAP选择输入的一个边沿,所以CAP输入的频率不能大于1/2个PCLK时钟。因此,这种情况下同一CAP输入的高/低电平持续时间不能小于1/(2*PCLK)。

表4.24计数控制寄存器的位描述4.定时器计数器寄存器(T[0/1/2/3]TC-0x40004008、0x40008008、0x40090008及0x40094008)

当预分频计数器到达计数的上限时,32位定时器计数器加1。如果TC在到达计数上限之前没有被复位,它将一直计数到0xFFFFFFFF,然后翻转到0x00000000。该事件不会产生中断。如果需要,可用匹配寄存器检测溢出。5. 预分频寄存器(T[0/1/2/3]PR-0x4000400C、0x4000800C、0x4009000C及0x4009400C)

32位预分频寄存器指定预分频计数器的最大值。TC每经过PR+1个PCLK加1。

6.预分频计数器寄存器(T[0/1/2/3]PC-0x40004010、0x40008010、0x40090010及0x40094010)

预分频计数器寄存器使用某个常量来控制PCLK的分频。预分频计数器每个PCLK周期加1,当其到达预分频寄存器PR中保存的值时,定时器计数器TC加1,预分频计数器PC在下个PCLK周期复位。这样就使得当PR=0时,每个PCLK周期TC加1;当PR=1时,每两个PCLK周期TC加1,依此类推。

7.匹配寄存器(MR0-MR3)

每个定时器有4个匹配寄存器,共16个。匹配寄存器值连续与定时器计数值相比较,当两个值相等时自动触发相应动作(产生中断,复位定时器计数器或停止定时器)。具体执行什么动作由MCR寄存器控制。

8.匹配控制寄存器(T[0/1/2/3]MCR-0xE0004014、0xE0008014、0xE0070014及0xE0074014)

匹配控制寄存器用于控制在发生匹配时所执行的操作。匹配控制寄存器的位描述如表4.25所示。

表4.25匹配控制寄存器的位描述9.捕获寄存器(CR0-CR1)

每个定时器最少有个两个捕获寄存器。每个捕获寄存器都与一个器件引脚相关联。当引脚发生特定的事件时,可将定时器计数值装入该寄存器。捕获控制寄存器的设定决定捕获功能是否使能以及捕获事件在引脚的上升沿、下降沿或是双边沿发生。

10.捕获控制寄存器(T[0/1/2/3]CCR-0x40004028、0x4E0008028、0x40090028及0x40094028)

当发生捕获事件时,捕获控制寄存器用于控制将定时器计数值是否装入4个捕获寄存器中的一个以及是否产生中断。同时设置上升沿和下降沿也是有效的配置,这样会在两种沿触发时均捕获事件。捕获控制寄存器的位描述如表4.26所示。其中,“n”代表定时器的编号0或1。

表4.26捕获控制寄存器的位描述11.外部匹配寄存器(T[0/1/2/3]EMR-0x4000403C、0x4000803C、0x4009003C及0x4009403C)

外部匹配寄存器提供对外部匹配引脚的控制和查看外部匹配引脚的电平状态。外部匹配寄存器的位描述如表4.27所示。其中,“n”代表定时器编号0、1、2或3;“m”代表匹配引脚编号0或1。

表4.27外部匹配寄存器的位描述续表每个定时器中的匹配0和1的匹配事件都可以引起一个DMA请求,详情请参考第4.7.1节相关内容。

外部匹配引脚输出选择如表4.28所示。

表4.28外部匹配引脚输出选择4.2.6应用举例

本例介绍采用查询方式和中断方式用定时器T0产生固定延时,并控制LED灯规律闪烁。

1.定时器寄存器相关宏定义

为了方便用户使用定时器相关寄存器,在头文件中定义了定时器寄存器的结构体类型以及4个定时器的结构体指针宏。具体程序如代码清单4.9所示。

【程序4.9】定时器寄存器相关宏定义。

typedefstruct //结构体中寄存器的安排严格按照寄存器地址的先后顺序

{

_IOuint32_tIR;

_IOuint32_tTCR;

_IOuint32_tTC;

_IOuint32_tPR;

_IOuint32_tPC;

_IOuint32_tMCR;

_IOuint32_tMR0;

_IOuint32_tMR1;

_IOuint32_tMR2;

_IOuint32_tMR3;

_IOuint32_tCCR;

_Iuint32_tCR0;

_Iuint32_tCR1;

uint32_tRESERVED0[2];

_IOuint32_tEMR;

uint32_tRESERVED1[12];

_IOuint32_tCTCR;

}LPC_TIM_TypeDef;

//APB1与APB2总线基地址宏定义

#defineLPC_APB0_BASE(0x40000000UL)

#defineLPC_APB1_BASE(0x40080000UL)

//定时器T0~T3基地址宏定义

#defineLPC_TIM0_BASE(LPC_APB0_BASE+0x04000)

#defineLPC_TIM1_BASE(LPC_APB0_BASE+0x08000)

#defineLPC_TIM2_BASE(LPC_APB1_BASE+0x10000)

#defineLPC_TIM3_BASE(LPC_APB1_BASE+0x14000)

//定时器T0~T3结构体指针宏定义

#defineLPC_TIM0((LPC_TIM_TypeDef*)LPC_TIM0_BASE)

#defineLPC_TIM1((LPC_TIM_TypeDef*)LPC_TIM1_BASE)

#defineLPC_TIM2((LPC_TIM_TypeDef*)LPC_TIM2_BASE)

#defineLPC_TIM3((LPC_TIM_TypeDef*)LPC_TIM3_BASE)

2.查询方式使用定时器

用查询方式使用定时器可以提供非常准确的延时时间,但在该方式中处理器被独占,系统效率低,所以在实际应用中不宜大量使用这种方式。函数delayMs使用定时器0或1产生毫秒级的延时。函数共有两个参数:timer_num为定时器序号;delayInMs为延时时间,单位为毫秒。由于定时器时钟由Fpclk提供,当预分频寄存器PR设为0时,计数Fpclk个时钟周期为1秒,所以延时要以毫秒为基本单位就可以设置MR寄存器为Fpclk/1000的整数倍。对Fpclk的设置请参阅系统时钟设置相关章节。具体代码如程序清单4.10所示。

【程序4.10】定时器延时函数。

voiddelayMs(uint8_ttimer_num,uint32_tdelayInMs)

{

if(timer_num==0)

{

LPC_TIM0->TCR=0x02; //复位定时器T0

LPC_TIM0->PR=0x00; //设置预分频为0

LPC_TIM0->MR0=delayInMs*(Fpclk/1000-1); //设置毫秒级的匹配值

LPC_TIM0->IR=0xff; //清全部中断标志

LPC_TIM0->MCR=0x04; //设置匹配时停止定时器

LPC_TIM0->TCR=0x01; //启动定时器

//处理器查询T0匹配标志位

while(LPC_TIM0->TCR&0x01);

}

elseif(timer_num==1)

{

…… //定时器T1相同操作

}

return;

}

3.中断方式使用定时器

在实际应用中,一般要求处理器间隔固定时间作相应处理,如定时读取外部数据或刷新数码管显示等,这时使用定时器中断功能就非常有必要,并且在这种方式下定时器与处理器可以并行工作,等计数完成,定时器通过中断通知处理器转而执行中断服务程序。这样的使用方式可以提高系统的效率。程序首先要初始化使用的定时器,init_timer()函数执行内容包括设置定时器的匹配寄存器MRn和匹配控制寄存器MCRn,还有安装定时器中断服务函数等。该函数有两个参数:timer_num为初始化定时器序号,TimerInterval为Fpclk周期数也即定时器中断间隔时间。具体代码如程序4.11所示。

【程序4.11】定时器初始化函数。

uint32_tinit_timer(uint8_ttimer_num,uint32_tTimerInterval)

{

if(timer_num==0)

{

timer0_counter=0;

LPC_TIM0->MR0=TimerInterval; //设置匹配值

LPC_TIM0->MCR=3; //定时器T0匹配时产生中断并复位TC

NVIC_EnableIRQ(TIMER0_IRQn); //使能定时器T0中断

return(1);

}

elseif(timer_num==1)

{

……

}

return(0);

}随后程序使能定时器。这时定时器开始计数,直到TC与MR匹配产生中断,同时复位TC开始新一轮计数。定时器使能函数的程序代码如程序4.12所示,定时器服务函数的程序代码如程序4.13所示。

【程序4.12】定时器使能函数。

voidenable_timer(uint8_ttimer_num)

{

if(timer_num==0)

{

LPC_TIM0->TCR=1; //计数器使能

}

else

{

LPC_TIM1->TCR=1;

}

return;

}

【程序4.13】定时器中断服务函数。

voidTIMER0_IRQHandler(void)

{

LPC_TIM0->IR=1; //清定时器T0中断标志

timer0_counter++; //中断服务

return;

}4.2.7重复中断定时器(RIT)概述

LPC1700嵌入式处理器包含了一个32位重复中断定时器(RIT),用于提供在规定时间间隔产生中断的通用方法,而且不需要使用标准的定时器。RIT专门用于重复产生与操作系统中断无关的中断,但在系统有其它需要时,它可用作Cortex-M3系统节拍定时器的备用定时器。4.2.8RIT寄存器描述

重复中断定时器寄存器列表如表4.29所示。

表4.29重复中断定时器寄存器列表1.比较寄存器(RICOMPVAL-0x400B0000)

比较寄存器的位描述如表4.30所示。

表4.30比较寄存器的位描述2.屏蔽寄存器(RIMASK-0x400B0004)

屏蔽寄存器的位描述如表4.31所示。

表4.31屏蔽寄存器的位描述3.控制寄存器(RICTRL-0x400B0008)

控制寄存器的位描述如表4.32所示。

表4.32控制寄存器的位描述4.计数器寄存器(RICOUNTER-0x400B000C)

计数器寄存器的位描述如表4.33所示。

表4.33计数器寄存器的位描述4.2.9RIT操作

处理器复位后,计数器从0开始递增计数。只要计数值与RICOMPVAL的值相等,中断标志就被置位。通过向RIMASK中对应的位写入1可将其余的任意位或者几个位(组合位)从本次比较中删除。如果RITENCLR位为低(默认状态),比较值相等时只会设置中断标志,而不影响计数器值,计数器继续运行,当计数值达到FFFFFFFFH时,在下个时钟沿将翻转回0然后继续计数;如果RITENCLR位置位,比较值相等时还可以使计数器复位到0,则在下个时钟沿计数重新开始。向RITEN位写入0可以停止计数。当硬件断开时(BREAK引脚有效且置位RITENBR位),计数也会停止。位RITEN和RITENBR在复位后都会被置位。

向RITINT位写入1可清除中断标志。软件随时可以通过写RICOUNTER向计数器装入任意值,还可以通过软件随时读取RICOUNTER计数器、RICOMPVAL寄存器、RIMASK寄存器和RICTRL寄存器的值。

4.3.1功能描述

使用看门狗(WD,WatchDog)是在系统进入错误状态后,为了防止程序异常导致系统崩溃,使系统能在一段合理时间内复位系统。看门狗使能后,如果用户软件在看门狗预设的时间内没有“喂狗”(或叫重装)看门狗定时器,系统将被复位。4.3看门狗看门狗包括一个4分频的预分频器和一个32位计数器。时钟通过预分频器输入定时器,定时器进行递减计数。定时器递减的最小值为0xFF。如果设置一个小于0xFF的值,系统会将0xFF装入计数器。因此看门狗最小间隔时间为WDCLK×256×4,最大间隔时间为WDCLK×232×4,两者都是WDCLK×4的倍数。

看门狗应按以下顺序使用:①设置WDTC寄存器设定看门狗重装常数;②通过WDMOD寄存器设定工作模式;③通过向WDFEED寄存器先写0xAA后写0x55序列使能看门狗;④看门狗应在计数器下溢出前重新装入常数,以避免复位或中断发生。

当看门狗计数器下溢后将重新从0x0开始计数,这与外部复位时情况相同。看门狗超时标志位WDTOF可以用于检测判断看门狗是否引起了复位条件。WDTOF标志必须使用软件清除。

看门狗时钟模块使用两个时钟源:PCLK和WDCLK。PCLK被APB总线使用来访问看门狗寄存器;WDCLK被看门狗定时器用作计数时钟。

LPC1700处理器看门狗具有以下一些特性:

(1)如果没有周期性重装,则产生片内复位;

(2)支持调试模式;

(3)由软件使能,但要求禁止硬件复位或看门狗复位/中断;

(4)错误/不完整的喂狗时序会导致复位/中断(如果使能);

(5)指示看门狗复位标志;

(6)带内部预分频器的可编程32位定时器;

(7)可选择WDCLK×4倍数的时间周期:从WDCLK×256×4到WDCLK×232×4。

看门狗时钟WDCLK可以选择RTC时钟、内部RC晶振或APB总线设备时钟PCLK。这样系统可以根据不同省电环境的要求选择看门狗使用的时钟源。而且看门狗定时器在使用内部时钟源时不需要外部晶振,以提高系统的可靠性。4.3.2看门狗结构

看门狗功能结构框图如图4.2所示。

图4.2看门狗逻辑框图4.3.3寄存器功能描述

看门狗共有5个寄存器,具体如表4.34所示。

表4.34看门狗寄存器列表1.看门狗模式寄存器(WDMOD-0x40000000)

WDMOD寄存器各位的描述如表4.35所示。该寄存器可通过WDEN和WDRESET的组合来控制看门狗的操作。

表4.35看门狗模式寄存器各位的描述一旦WDEN和/或WDRESET位置位,就无法使用软件将其清零。这两个标志由外部复位或看门狗定时器溢出清零。

当看门狗发生超时,看门狗超时标志WDTOF置位时,该标志由软件清零;中断标志WDINT置位时,任何复位都会使该位清零。只要看门狗中断被响应,它就可以在NVIC中禁止或不停地产生看门狗中断请求。看门狗中断的用途就是在不进行芯片复位的前提下允许在看门狗溢出时对其进行调试。在看门狗运行时根据不同时钟源可随时产生看门复位或中断。RTC晶振时钟与APB总线外设时钟可以在处理器休眠模式中使用,IRC可以在处理器深度休眠模式中使用。如果在休眠或深度休眠模式中出现看门狗中断,那么处理器被唤醒。看门狗操作模式的选择如表4.36所示。

表4.36看门狗操作模式选择

2.看门狗定时器常数寄存器(WDTC-0x40000004)

WDTC寄存器决定看门狗的超时值,各位描述如表4.37所示。当“喂狗”时序产生时,WDTC的内容将重新装入看门狗定时器,它是一个32位寄存器,低8位在复位时设置为1。写入一个小于0xFF的值会使0xFF装入WDTC,因此超时的最小时间间隔为WDCLK

×

256

×

4。

表4.37WDTC位描述3.看门狗喂狗寄存器(WDFEED-0x40000008)

WDFEED寄存器的各位描述如表4.38所示。向该寄存器写入0xAA,然后写入0x55会使WDTC的值重新装入看门狗定时器。如果设置好了看门狗的溢出模式,该操作还将启动看门狗运行。

置位WDMOD中的WDEN位之后,还必须完成一次有效的喂狗时序,然后看门狗才能产生复位。在看门狗真正启动之前,将忽略错误的“喂狗”;在看门狗启动后,如果向WDFEED寄存器写入0xAA之后的下一个操作不是向WDFEED寄存器写入0x55,而是访问任何一个看门狗寄存器,那么会立刻造成复位/中断。在“喂狗”时序中,一次对看门狗寄存器不正确访问之后的第二个PCLK周期将产生复位。

在“喂狗”时序过程中应禁止中断。如果在“喂狗”时序期间出现中断,那么将会产生一个中止条件。

表4.38看门狗喂狗寄存器的位描述4.看门狗定时器值寄存器(WDTV-0x4000000C)

WDTV寄存器用于读取看门狗定时器的当前值,各位描述如表4.39所示。当读出该数值时,锁定和同步的过程需要6个WDCLK和6个PCLK周期,所以WDTV寄存器的真实值比CPU读取出来的值要旧一些。

表4.39看门狗定时器值寄存器的位描述5.看门狗时钟源选择寄存器(WDCLKSEL-0x40000010)

该寄存器允许选择看门狗定时器的时钟源,各位描述如表4.40所示。可能的选择有内部RC晶振(IRC)、RTC晶振和APB总线外设时钟(PCLK)。

表4.40看门狗时钟源选择寄存器的位描述4.3.4操作举例

看门狗的应用较灵活,可以选择看门狗超时仅产生中断或产生系统复位中断。当系统只需看门狗产生中断时,设置WDEN位即可,一旦置位WDEN,则只有通过系统复位才能清零WDEN位。WDRESET位用于设置看门狗超时后复位定时器还是复位系统。WDRESET位一旦设置也需要系统复位后该位才能被复位。

1.看门狗初始化

程序4.14是一个使用看门狗产生普通中断的例子。产生系统复位中断只需再多设置WDRESET位即可。函数首先安装看门狗中断服务函数,然后设置WDCLKSEL寄存器,选择内部RC晶振为时钟源。由于内部RC晶振频率为4MHz,因此设置WDTC的值为4M-1。而看门狗时钟电路把时钟源4分频,所以这样看门狗超时时间设置为4s。接着再设置WDMOD寄存器的WDEN位。最后完成一个“喂狗”序列,使能看门狗定时器。

【程序4.14】看门狗初始化函数。

uint32_tWDTInit(void)

{

NVIC_EnableIRQ(WDT_IRQn); //使能看门狗中断

LPC_WDT->WDCLKSEL=0; //选择内部RC晶振为时钟源

LPC_WDT->WDTC=WDT_FEED_VALUE; //4秒后看门狗产生超时中断

LPC_WDT->WDMOD=WDEN; //仅产生超时中断

LPC_WDT->WDFEED=0xAA; //执行“喂狗”序列,使能看门狗

LPC_WDT->WDFEED=0x55;

return(TRUE);

}

2.看门狗“喂狗”函数

只要严格按照“喂狗”序列设置WDFEED寄存器就可以重置看门狗计数器。具体代码见程序4.15。

【程序4.15】看门狗“喂狗”函数。

voidWDTFeed(void)

{

LPC_WDT->WDFEED=0xAA; //“喂狗”序列

LPC_WDT->WDFEED=0x55;

return;

}

3.看门狗中断服务函数

在进入看门狗中断服务函数后先要清除中断标志,然后才进行相应操作。具体代码见程序4.16。

【程序4.16】看门狗中断服务函数。

voidWDT_IRQHandler(void)

{

LPC_WDT->WDMOD&=~WDTOF; //清除看门狗中断标志

wdt_counter++;

return;

}

4.4.1概述

LPC1700嵌入式处理器具有4个符合C’550工业标准的通用异步串行口(UART):UART0、UART1、UART2和UART3。其中,UART0、UART2和UART3除了寄存器地址不同以外功能相同。而UART1除了具有其它三个普通串口的功能外还增加了一个MODEM接口与RS-485/EIA-485模式,且不支持红外通信模式。本章主要介绍普通串口的功能及具体操作,有关UART1功能的描述请读者参阅相关用户手册。4.4UART串口通信普通串口具有以下一些特性:

(1)每个串口具有独立的16字节收发FIFO;

(2)寄存器位置符合C’550工业标准;

(3)接收器FIFO触发点可为1、4、8和14字节;

(4)内置波特率发生器;

(5)可用于精确控制波特率的小数分频器,并拥有以实现软件流控制的自动波特率检测能力和机制;

(6)支持DMA操作;

(7)

UART3包含了一个支持红外通信的IrDA模式。4.4.2UART结构

UART0、UART2和UART3的结构如图4.3所示。

图4.3UART结构框图

APB接口提供CPU或主机与UART之间的通信连接。

UARTn接收器模块UnRX监视串行输入线RXDn的有效输入;UARTn接收移位寄存器(UxRSR)通过RXDn接收有效字符。当UnRSR接收到一个有效字符时,它将该字符传送到UARTn接收缓冲寄存器FIFO中,等待CPU或主机通过主机接口访问。

UARTn发送器模块UnTX接收CPU或主机写入的数据并将数据缓存到UARTn发送保持寄存器FIFO(UnTHR)中。UARTn发送移位寄存器(UnTSR)读取UnTHR中的数据并将数据通过串行输出引脚TXDn发送。

UARTn波特率发生器模块UnBRG产生UARTn发送模块所需的时序。UnBRG模块时钟源为APB时钟(PCLK)。主时钟与UnDLL和UnDLM寄存器所指定的分频数相除得到UARTn发送模块使用的时钟,该时钟为16倍过采样时钟NBAUDOUT。

中断接口包含寄存器UnIER和UnIIR。中断接口可接收几个由UnTX和UnRX发出的单时钟宽度的使能信号。

UnTX和UnRX的状态信息保存在UnLSR中。UnTX和UnRX的控制信息保存在UnLCR中。4.4.3寄存器功能描述

每个UART包含的寄存器如表4.41所示。分频器锁存访问位(DLAB)包含在UnLCR7中,用于使能访问分频锁存寄存器DLLx与DLMx。

表4.41UART寄存器列表续表1.UART接收缓冲寄存器——UnRBR

UnRBR是UART接收FIFO的顶部字节,各位的功能描述如表4.42所示。UnRBR包含了最早接收到的字符,可通过总线接口读出。LSB(bit0)代表最早接收到的数据位。如果接收到的字符小于8位,则未使用的高位填充为0。

如果要访问UnRBR,UnLCR的分频锁存访问位(DLAB)必须为0。UnRBR为只读寄存器。

由于PE、FE和BI位与RBR的FIFO顶端字节相对应(即下次读RBR时读出的字节),因此,将接收的字节及其状态位成对读出的正确方法是先读U0LSR,再读U0RBR。

表4.42UART接收缓冲寄存器的位描述

2.UART发送保持寄存器——UnTHR

UnTHR是UART发送FIFO的顶部字节,各位的功能描述如表4.43所示。UnTHR包含了发送FIFO中最新的字符,可通过总线接口写入。LSB代表最先发送的位。

如果要访问UnTHR,UnLCR的分频锁存访问位(DLAB)必须为0。U0THR为只写寄存器。

表4.43UART发送保持寄存器的位描述3.UART分频锁存低位寄存器与高位寄存器——UnDLL/UnDLM

分频锁存是波特率发生器的一部分,它保存了用于产生波特率时钟的APB时钟PCLK分频值,波特率时钟必须是波特率的16倍,等式如下:

UnDLL和UnDLM寄存器一起构成一个16位除数,UnDLL包含除数的低8位,UnDLM包含除数的高8位。值0x0000被看做0x0001,因为除数是不允许为0的。

当访问UART分频锁存寄存器时,分频锁存访问位(DLAB)必须为1。分频锁存寄存器各位的功能描述如表4.44及表4.45所示。

表4.44分频锁存低位寄存器的位描述表4.45分频锁存高位寄存器的位描述4.UART中断使能寄存器——UnIER

UnIER用于使能5个UART中断源,各位功能描述如表4.46所示。

表4.46中断使能寄存器的位描述5.UART中断标志寄存器——UnIIR

UnIIR提供状态代码用于指示一个挂起中断的中断源和优先级,各位功能描述如表4.47所示。在访问UnIIR过程中,中断被冻结。如果在访问UnIIR时产生了新的中断,该中断被记录,下次UnIIR访问可读出。

表4.47中断标志寄存器的位描述如果中断状态位是1,则没有中断挂起,并且中断标识位字段为0;如果中断状态位是0,并且在没有自动波特率中断挂起的情况下,可以通过中断标识位字段判断中断源以及中断服务程序应该执行的相应操作。在退出中断服务程序之前,必须读取UnIIR来清除中断。

UART的RLS中断(UnIIR[3:1]=011)是最高优先级的中断。只要UART的接收输入产生4个错误条件(溢出错误(OE)、奇偶错误(PE)、帧错误(FE)和间隔中断(BI))中的任意一个,该中断标志将置位。产生该中断的错误条件可通过查看UnLSR[4:1]得到,当读取UnLSR时清除中断。

UART的RDA中断(UnIIR[3:1]=010)与CTI中断(UnIIR[3:1]=110)共用第二优先级。当UART的接收FIFO到达UnFCR[7:6]所定义的触发点时,RDA被激活;当UART的接收FIFO的深度低于触发点时,RDA复位。当RDA中断激活时,CPU可读出由触发点所定义的数据块。

CTI中断(UnIIR[3:1]=110)为第二优先级中断。当UART接收的FIFO包含至少1个字符并且在接收3.5~4.5个字符的时间内没有发生UART接收FIFO动作时,该中断产生。UART接收FIFO的任何动作(读或写UARTRSR)都将清除该中断。当接收到的信息不是触发值的倍数时,CTI中断将清空UART的RBR。例如,如果外设想要发送一个105个字符的信息,而触发值为10个字符,那么前100个字符将使CPU接收10个RDA中断,而剩下的5个字符使CPU接收1~5个CTI中断(取决于服务程序)。UART的中断处理如表4.48所示。

表4.48UART的中断处理UART的THRE中断(UnIIR[3:1]=001)为第三优先级中断。当UART的THRFIFO为空并且满足特定的初始化条件时,该中断激活。这些初始化条件将使UART的THRFIFO被数据填充,以免在系统启动时产生许多THRE中断。当THRE=1已经有一个字符减去停止位的延时,并在上一次THRE=1事件之后,UnTHR中存在至多2个字符时,该初始化条件成立。在没有译码和服务THRE中断时,该延迟为CPU提供了将数据写入UnTHR的时间。如果UART的THRFIFO中曾经有两个或更多字符,而当前UnTHR为空时,THRE中断立即设置。当发生UnTHR写操作或UnIIR读操作并且THRE为最高优先级中断(UnIIR[3:1]=001)时,THRE中断复位。

6.UARTFIFO控制寄存器——UnFCR

UnFCR为只写寄存器,控制UART接收和发送FIFO的操作,各位的功能描述如表4.49所示。

表4.49UARTFIFO控制寄存器的位描述通过使用DMA,用户可选择操作UART的发送和/或接收。DMA模式由FCR寄存器中的DMA模式选择位决定。只有在FCR寄存器中的FIFO使能位置位时,该位才会有用。

1)

UART接收DMA

在DMA模式中,当接收FIFO有效字节数大于或等于触发点水平,或者在发生字符超时的情况下,接收DMA请求就会生效(详情请参考上文对RX触发点的描述)。接收DMA请求由DMA控制器清除。

2)

UART发送DMA

在DMA模式中,当发送FIFO变为未满时,发送DMA请求就会生效。发送DMA请求由DMA控制器清除。

7.UART线控制寄存器——UnLCR

UnLCR决定发送和接收数据字符的格式,各位的功能描述如表4.50所示。

8.UART线状态寄存器——UnLSR

UnLSR为只读寄存器,提供了UART发送和接收模块的状态信息,UART线状态寄存器的位描述如表4.51所示。

表4.50UART线控制寄存器的位描述表4.51UART线状态寄存器的位描述续表9.UART发送使能寄存器——UnTER

UnTER寄存器可以实现软件流控制。当TxEn=1时,只要数据可用,UARTn发送器就会一直发送数据,一旦TxEn变为0,UARTn就会停止数据传输。

UnTER还可实现软件和硬件流控制。当TxEn=1时,只要数据可用,UARTn发送器就会一直发送数据,一旦TxEn变为0,UARTn就会停止数据传输。表4.52描述了如何利用TxEn位来实现软件流控制。

表4.52UART发送使能寄存器的位描述10.UARTFIFO水平寄存器——UnFIFOLVL

UnFIFOLVL寄存器是一个只读寄存器,允许软件读取当前的FIFO水平状态。发送和接收FIFO的数据量(水平)均存放在该寄存器中,各位的功能描述如表4.53所示。

表4.53UARTFIFO水平寄存器的位描述4.4.4基本操作

LPC1700处理器的UART0、UART2和UART3具有完全相同的寄存器,只是基地址不同,UART的基本寄存器功能框图如图4.4所示。

图4.4UART寄存器功能框图其中,寄存器UnRBR与UnTHR是同一地址,但物理上是分开的,读操作时为UnRBR,写操作时为UnTHR。寄存器UnDLL与UnRBR、UnTHR,UnDLM与UnIER具有相同的地址。如果要访问UnDLM、UnDLL,分频器锁存访问位DLAB必须为1;若要访问UnRBR、UnTHR、UnIER,则分频器锁存访问位DLAB必须为0。UnDLM和UnDLL寄存器是波特率发生器的分频器锁存寄存器,用于设置合适的串口波特率;UnRBR为数据接收缓冲器,用于读取接收到的数据,若FIFO使能,串口接收到的数据会压入FIFO缓冲;UnTHR为发送保持寄存器,向此寄存器写入数据时,将会引起串口数据发送,若FIFO使能,数据将会压入FIFO缓冲。

如前所述,波特率的除数计算如下:

UnDLM、UnDLL=

通过线控制寄存器LCR可设置串口的工作模式,FCR则用于FIFO的使能或者复位操作。当接收或者发送数据的时候,会产生相应的线状态标志位(LSR),通过对IER进行设置,可实现串口的发送、接收、出错等中断。注意,IER中的位0为接收中断使能,位1为发送中断使能,位2为线状态中断使能(通信出错中断使能),若不使能相应的中断,对应的中断不会产生,此时可以通过LSR读取串口的状态,以判断串口操作是否完成或是否成功。UART模式寄存器的功能框图如图

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论