第六章 部件工作原理与编程示例.ppt_第1页
第六章 部件工作原理与编程示例.ppt_第2页
第六章 部件工作原理与编程示例.ppt_第3页
第六章 部件工作原理与编程示例.ppt_第4页
第六章 部件工作原理与编程示例.ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

1、ARM 应用系统设计第六章 部件工作原理和编程示例,佘黎煌 东北大学信息科学与工程学院 电子信息工程研究所,第六章 部件工作原理和编程示例,GPIO编程示例 UART编程示例 TIMER编程示例,GPIO的控制,利用GPIO 口控制连接在GPIO 引脚上的LED 灯的亮灭 1. 通过AXD Debugger 的命令行调试功能,直接通过JTAG 接口修改W90P710 处理器内部端口寄存器的值. 2. C 语言源程序,实现通过GPIO 口控制LED12、LED13 按照设定的时间间隔闪烁。,GPIO的控制,GPIO复选控制寄存器,GPIO上拉电阻和方向配置,GPIO输出控制寄存器,AXD Deb

2、ugger控制,AXD Debugger控制,AXD Debugger控制,设定GPIO5 和GPIO6 引脚为输出模式,并使能内部上拉电阻 Debug setmem 0 xFFF83054 0 x30003,32 使GPIO5 和GPIO6 引脚输出电平为高。此时,LED12、LED13 应熄灭。 Debug Setmem 0 xFFF83058 0 x3,32 使GPIO5 和GPIO6 引脚输出电平为低。此时,LED12、LED13 应点亮。 Debug Setmem 0 xFFF83058 0 x0,32,C语言-地址定义,void GpioInit() outpw(REG_GPIO_

3、CFG5,0 x0); / 设置PORT5_0, PORT5_1 为GPIO5,GPIO6 方式 outpw(REG_GPIO_DIR5,0 x30003); / 设置GPIO5,GPIO6 引脚内部上拉,/ 并将这两个引脚设为输出模式 void SetGpio(INT16 value) outpw(REG_GPIO_DATAOUT5,value); int main (void) INT16 value = 0 x3; GpioInit(); while(1) value = (value ,通过AXD调试软件做地址重映射,建立一个文本文件setmap.txt, setmem 0 xfff0

4、1000 0 x000530C1,32 ;EBICON setmem 0 xfff01004 0 x10040084,32 ;ROMCON setmem 0 xfff01008 0 x000010E4,32 ;SDCONF0 setmem 0 xfff0100c 0 x00000000,32 ;SDCONF1 setmem 0 xfff01010 0 x0000014B,32 ;SDTIME0 setmem 0 xfff01014 0 x0000014B,32 ;SDTIME1 将SDRAM的基地址配置为0 x0,FLASH的基地址配置为0 x8000000,AXD调试在SDRAM中进行 De

5、bug obey c:setmap.txt,C语言-寄存器访问,#define GPIO_BA 0 xFFF83000 /* GPIO Control */ #define REG_GPIO_CFG5(GPIO_BA+0 x0050)/* GPIO port5 configuration Register */ #define REG_GPIO_DIR5(GPIO_BA+0 x0054)/* GPIO port5 direction control Register */ #define REG_GPIO_DATAOUT5(GPIO_BA+0 x0058)/* GPIO port5 data

6、out Register */ #define REG_GPIO_DATAIN5 (GPIO_BA+0 x005c)/* GPIO port5 data input Register */ #define outpw(port,value) (*(UINT32 volatile *) (port)=value) #define inpw(port) (*(UINT32 volatile *) (port) outpw(REG_GPIO_CFG5,0 x0); / 设置PORT5_0, PORT5_1 为GPIO5,GPIO6 方式,UART 编程示例,UART工作原理 UART控制寄存器介绍

7、UART编程实现,需要掌握的内容,如何设定UART的波特率,奇偶校验位和停止位? UART的接受发送是如何实现? UART接收和发送中断是如何设计?,UART工作原理,W90P710的异步串口通信模块包含4个UART模块和相关的逻辑电路 通用异步收发器(UART)将计算机外部来的串行数据转换为并行数据。从UART接收引进(SIN)得到的字符位被相继地移入接收FIFO。 UART也可以将由计算机内部传送过来的并行数据转换为输出的串行数据流。这些输出字符被驱动程序写入发送FIFO,然后再被依次移到UART发送引脚(SOUT)。,W90P710的UART功能,W90P710的异步串行通信模块包含4个

8、UART模块和相关的逻辑电路。,UART工作原理,UART工作原理,通用异步收发器(UART)将计算机外部来的串行数据转换为并行数据。从UART接收引脚(SIN)得到的字符位被相继地移入接收FIFO。驱动程序通过读取接收FIFO获得输入的字符。 UART也可以将由计算机内部传送过来的并行数据转换为输出的串行数据流。这些输出字符被驱动程序写入发送FIFO,然后再被依次移到UART发送引脚(SOUT)。,UART的控制寄存器,UART的接收和发送寄存器,UART波特率的设置,波特率 = 晶振器时钟信号 / (16 (波特率除数 + 2),UART,数据位,校验位和停止位的设置,UART中断功能的设

9、置,接收中断,发送中断,状态错误中断,UART中断发生,识别接收和发送中断,状态错误中断,接收中断(常用),接收超时中断,发送中断(常用),UART 缓冲(FIFO)控制,例7.4:编写一段C 语言源程序,以中断方式实现通过PC 与目标板进行串口通信,完成控制LED1LED8 指示灯状态的功能。 将GPIO5 和GPIO6 引脚配置为UART0 模式,通过PC 上的超级终端程序向UART0 口送入“L”或“R”的字符,程序通过判断从UART0 口接收到的字符是“L”或“R”来决定控制LED1 LED8 以流水灯方式闪亮的运行方向。,UART工程,七种异常向量表,32种中断向量表,以及完成异常发

10、生到进入C语言函数的流程,及异常返回,ARM的启动的初始化代码,包括各种异常模式堆栈的初始化或内存重映射等.最终切到用户模式后,进入主函数(main),各种异常或中断的C语言函数,所有的31个中断功能函数实现.,UART功能子函数,EBI功能子函数,主函数循环,实现流程,UART初始化 UART接收的实现 UART发送的实现 INT8 rcv_buf100 = 0; / UART0数据接收缓冲区 INT8 sen_buf100 = 0; / UART0数据发送缓冲区 INT8 rcv_num = 0; /接收计数 INT8 send_num = 0; /发送计数 INT8 strlenth=0

11、;,UART通讯主程序,set.datab = 8; set.stopb = 1; set.parity = 0; Uart0Init(115200, set); / 串口初始化 while (1) if(rcv_bufrcv_num-1 = 0 x0D) / 判断接收新数据是否结束 if(rcv_buf0 != R ,UART通讯主程序,if(roll_flag =ROLL_LEFT) / LED 向左滚动 led_num+; if(led_num = 8) led_num = 0; Set_EBILED(0 x80led_num); / 给LED 发数据 Delay(1000000); i

12、f(roll_flag =ROLL_RIGHT) / LED 向右滚动 led_num+; if(led_num=8) led_num = 0; Set_EBILED(0 x01led_num); / 给LED 发数据 Delay(1000000); return 0; ,UART初始化,1. 通过设置寄存器UART_DLL设置波特率除数低位 ,通过设置寄存器UART_DLM设置波特率除数高位 2 通过设置寄存器UART_LCR设置奇偶校验位、资料位和停止位 3 通过设置寄存器UART_FCR的来几个字节产生接受中断 4 打开寄存器UART_IER的接收器数据就绪中断、发送保持寄存器为空时中断

13、和接收线路状态变化中断.,UART初始化(1),INT8 Uart0Init (INT32 baud, UARTMODE set) INT32 Divisor; outpw(REG_GPIO_CFG5,0 x05); / 设置I/O连接到UART0 outpw(REG_GPIO_DIR5,0 x30000); / 设置RX0,TX0引脚上拉 outpw(REG_UART0_FCR,0 x01); / 使能FIFO,并设置触发点为1字节 outpw(REG_UART0_IER,0 x01); / 允许接收中断,UART初始化(2),/* 设置串口波特率 */ outpw(REG_UART0_LC

14、R,0 x80); / DLAB = 1 此时可存取除数因子寄存器REG_UART_LSB_0和REG_UART_MSB_0 Divisor = (APB_SYSTEM_CLOCK 4) / baud); if(APB_SYSTEM_CLOCK % (baud * 16) (baud * 16) / 2) Divisor+; Divisor -= 2; outpw(REG_UART0_LSB,(INT8)Divisor); outpw(REG_UART0_MSB,(INT8)(Divisor 8);,UART初始化(3),/* 设置串口模式 */ Divisor = set.datab - 5

15、; / 设置字长 if(set.stopb = 2) Divisor |= 0 x04; / 判断是否为2位停止位 if(set.parity != 0) set.parity = set.parity - 1; Divisor |= 0 x08; /* 设置奇偶校验 */ Divisor |= set.parity 4; / 设置奇偶校验 outpw(REG_UART0_LCR,Divisor); / DLAB = 0 此时可存取接收缓冲器(RBR),发送保持寄存器(THR)和中断使能寄存器(IER),UART初始化(4),/* 使能UART0中断 */ outpw(REG_AIC_SCR9

16、,0 x41); / 设置UART0中断优先级为IRQ第一级中断 outpw(REG_AIC_MECR,0 x200); / 使能串口中断 return (1); ,UART中断的实现(接收),*/ void UART0_Handler(void) INT8 m=0; if(inpw(REG_UART0_IIR) ,UART中断的实现(发送),else if(inpw(REG_UART0_IIR) / 如果发送结束则关发送中断 ,UART发送函数,void uart0Write(INT8 *string) INT8 lenth; strlenth = strlen(char *)string)

17、; / strlenth为一全局变量将在中断服务中用到 for(lenth = 0; lenth strlenth; lenth+) sen_buflenth = *string+; outpw(REG_UART0_TX,sen_buf0); / 发送第一个数据 outpw(REG_UART0_IER,0 x03); / 允许接收中断和发送中断 ,使用EBI总线外扩led,控制采用数据总线锁存的驱动方式,CPU 的数据总线低8 位连接到锁存器74HC273 的信号输入端,CPU 外部总线接口(EBI)的nECS0 片选信号连接到锁存器的锁存控制信号,这样当CPU 访问BANK0 的任一地址空间

18、时,数据总线低8 位的数据就将被锁存器锁存后输出,作为控制8 个LED 灯的发光状态的控制信号,使EBI 的BANK0 地址空间为0 x0900 00000 x093F FFFF。往这个地址空间的任一地址写0 xFF,8 个LED 灯都灭;写0 x00,则8 个LED 灯都点亮。,外扩I/O BANK配置寄存器,基地址为EXT0CON 的31:19左移18,相当把低19位清0,整个数右移1位; 0 x02040084的 基地址为多少?,4M开始的地址应该为什么数?,EXTCON的初始化,及LED控制,#define EBI_BA 0 xFFF01000 /* EBI Control */ #d

19、efine REG_EXT0CON (EBI_BA+0 x018) /* External I/O 0 control */ #define EBI_EXT0_VALUE 0 xF0078003 #define EBILED_ADDRESS 0 x78000000 #define readb(addr) (*(UINT8 volatile *)(addr) #define writeb(addr,x) (*(UINT8 volatile *)(addr) = (UINT8 volatile)x void Init_EBILED(INT32 Value) outpw(REG_EXT0CON, E

20、BI_EXT0_VALUE); Set_EBILED(Value); void Set_EBILED(INT32 Value) writeb(EBILED_ADDRESS, Value); ,流水灯功能的实现,if(roll_flag =ROLL_LEFT) / LED 向左滚动 led_num+; if(led_num = 8) led_num = 0; Set_EBILED(0 x80led_num); / 给LED 发数据 Delay(1000000); if(roll_flag =ROLL_RIGHT) / LED 向右滚动 led_num+; if(led_num=8) led_nu

21、m = 0; Set_EBILED(0 x01led_num); / 给LED 发数据 Delay(1000000); ,第六章 部件工作原理和编程示例,GPIO编程示例 UART编程示例 TIMER编程示例,定时器功能设计,定时器是如何定时? 如何设计定时器的分频? 定时中断的设计?,定时器功能,W90P710计时器模块包括2个信道,TIMER0和TIMER1,允许用户容易地实现一个计数计划。每个信道有独立的时钟资源。输入时钟被一个8bit分频器分频并且随后被一个24bit减计数器引用。当计数器减数到0时,如果中断启动了的话定时器将声明一个中断请求。一个普通的软件计数器计划是用来设置一个软件

22、计数器,并在每一个中断发生时加1给它。 一个普通的定时器控制器有以下几个特征: 与AMBA APB接口兼容 兩个带一个8bit分频计数器/24bit减计数器和一个中断申请的信道 对每个信道的独立时钟资源 最大不中断时间 = (1 / 25 MHz) * (256) * (224), if TCLK = 25 MHz,定时器的工作方式,在使能计数器中断前,驱动应该设置操作模式、分频器和计数器。定时器支持一次性模式、周期模式和翻转模式给用户来执行计数计划。 在一次性模式下,中断信号一旦被产生将不会再次产生除非定时器以后被重新使能。 在周期模式下,中断信号被周期性地产生。 在翻转模式下,中断信号在每个50%周期由低到高或由高到低转换时被产生。,定时器逻辑框图,例7.5:编写一段C 语言源程序,实现通过TIMER0 中断,控制LED1 有规律亮灭的功能。,定时器产生中断间隔的设定,定时器中断的频率取决于以下等式: Freq. = Crystal clock / (pre-scaler+1) * counter) 对于W90P710,晶振时

温馨提示

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

评论

0/150

提交评论