第6章部件工作原理与编程示例(东北大学嵌入式课件)_第1页
第6章部件工作原理与编程示例(东北大学嵌入式课件)_第2页
第6章部件工作原理与编程示例(东北大学嵌入式课件)_第3页
第6章部件工作原理与编程示例(东北大学嵌入式课件)_第4页
第6章部件工作原理与编程示例(东北大学嵌入式课件)_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

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

文档简介

1、ARM 应用系统设计第六章 部件工作原理和编程示例佘黎煌东北大学信息科学与工程学院电子信息工程研究所第六章 部件工作原理和编程示例nGPIO编程示例编程示例nEBI编程n外部中断nIRQ编程nUART编程示例nTIMER编程示例GPIOnW90P710 处理器的GPIO 模块(General Purpose Input Output)提供了71 个可编程的通用输入/输出引脚,每个输入/输出引脚可以通过软件编程设置为输入模式、输出模式或特殊功能模式。GPIOn端口0: 5 引脚输入/输出端口n端口1: 10 引脚输入/输出端口n端口2: 10 引脚输入/输出端口n端口3: 8 引脚输入/输出端口

2、n端口4: 11 引脚输入/输出端口n端口5: 15 引脚输入/输出端口n端口6: 12 引脚输入/输出端口GPIO的控制n利用GPIO 口控制连接在GPIO 引脚上的LED 灯的亮灭n1. 通过AXD Debugger 的命令行调试功能,直接通过JTAG 接口修改W90P710 处理器内部端口寄存器的值.n2. C 语言源程序语言源程序,实现通过GPIO 口控制LED12、LED13 按照设定的时间间隔闪烁。GPIO的控制GPIO复选控制寄存器GPIO上拉电阻和方向配置GPIO输出控制寄存器AXD Debugger控制AXD Debugger控制AXD Debugger控制通过AXD控制n设

3、定GPIO5 和GPIO6 引脚为输出模式,并使能内部上拉电阻 Debug setmem 0 xFFF83054 0 x30003,32n使GPIO5 和GPIO6 引脚输出电平为高。此时,LED12、LED13 应熄灭。 Debug Setmem 0 xFFF83058 0 x3,32n使GPIO5 和GPIO6 引脚输出电平为低。此时,LED12、LED13 应点亮。 Debug Setmem 0 xFFF83058 0 x0,32C语言-寄存器访问n#define GPIO_BA 0 xFFF83000 /* GPIO Control */n#define REG_GPIO_CFG5(G

4、PIO_BA+0 x0050)/* GPIO port5 configuration Register */n#define REG_GPIO_DIR5(GPIO_BA+0 x0054)/* GPIO port5 direction control Register */n#define REG_GPIO_DATAOUT5 (GPIO_BA+0 x0058)/* GPIO port5 data out Register */n#define REG_GPIO_DATAIN5 (GPIO_BA+0 x005c)/* GPIO port5 data input Register */n#defin

5、e outpw(port,value) (*(UINT32 volatile *) (port)=value)n#define inpw(port) (*(UINT32 volatile *) (port)noutpw(REG_GPIO_CFG5,0 x0); / 设置PORT5_0, PORT5_1 为GPIO5,GPIO6 方式文件组织GPIO.C#include wblib.h“void GpioInit()outpw(REG_GPIO_CFG5,0 x0); / 设置PORT5_0, PORT5_1 为GPIO5,GPIO6 方式outpw(REG_GPIO_DIR5,0 x30003

6、); / 设置GPIO5,GPIO6 引脚内部上拉,/ 并将这两个引脚设为输出模式void SetGpio(INT16 value) outpw(REG_GPIO_DATAOUT5,value);Main.c#include #include wblib.h#include irq_handler.h#include main.hint main (void)INT16 value = 0 x3;GpioInit();while(1)value = (value&0 x3)0 x3;SetGpio(value);Delay(1000000);return 0;void Delay(IN

7、T32 t) do t-; while(t); 通过AXD调试软件做地址重映射 建立一个文本文件setmap.txt,nsetmem 0 xfff01000 0 x000530C1,32 ;EBICONnsetmem 0 xfff01004 0 x10040084,32 ;ROMCONnsetmem 0 xfff01008 0 x000010E4,32 ;SDCONF0nsetmem 0 xfff0100c 0 x00000000,32 ;SDCONF1nsetmem 0 xfff01010 0 x0000014B,32 ;SDTIME0nsetmem 0 xfff01014 0 x00000

8、14B,32 ;SDTIME1 将SDRAM的基地址配置为0 x0,FLASH的基地址配置为0 x8000000,AXD调试在SDRAM中进行 Debug obey c:setmap.txt第六章 部件工作原理和编程示例nGPIO编程示例nEBI编程编程n外部中断nIRQ编程nUART编程示例nTIMER编程示例nIRQ的控制n实现通过外部中断引脚INT 的中断信号控制LED1LED8指示灯状态的功能。n当没有外部中断输入时,LED1LED8 这8 个指示灯按设定的软件延时时间顺序循环点亮。当有外部中断信号输入时,程序进入中断处理程序,使指示灯按LED1LED4 先亮,接下来延时指定时间后LE

9、D1LED4 熄灭,LED5LED8 点亮。如此反复8 次之后,再恢复到申请中断之前的顺序循环点亮状态。使用EBI总线外扩ledn控制采用数据总线锁存的驱动方式,CPU 的数据总线低8 位连接到锁存器74HC273 的信号输入端,CPU 外部总线接口(EBI)的nECS0 片选信号连接到锁存器的锁存控制信号,这样当CPU 访问BANK0 的任一地址空间时,数据总线低8 位的数据就将被锁存器锁存后输出,作为控制8 个LED 灯的发光状态的控制信号,使使EBI 的的BANK0 地址空间为地址空间为0 x0900 00000 x093F FFFF。往。往这个地址空间的任一地址写这个地址空间的任一地址

10、写0 xFF,8 个个LED 灯都灭;写灯都灭;写0 x00,则则8 个个LED 灯都点亮。灯都点亮。External I/O write operation timingExternal I/O read operation timing外扩I/O BANK配置寄存器(GPIO.c)EXTCON的初始化,及LED控制n/#define EBI_BA 0 xFFF01000 /* EBI Control */n/#define REG_EXT0CON (EBI_BA+0 x018) /* External I/O 0 control */n/#define EBI_EXT0_VALUE 0 x

11、F0078003n/#define EBILED_ADDRESS 0 x78000000n/#define readb(addr) (*(UINT8 volatile *)(addr)n/#define writeb(addr,x) (*(UINT8 volatile *)(addr) = (UINT8 volatile)xn#include wblib.hnvoid Init_EBILED(INT32 Value)nn outpw(REG_EXT0CON, EBI_EXT0_VALUE);n Set_EBILED(Value);nnvoid Set_EBILED(INT32 Value)nn

12、 writeb(EBILED_ADDRESS, Value);nMain.c#include wblib.h#include irq_handler.h#include main.hint main (void)INT16 led_num=0;Init_EBILED(0 x0);while(1) if(led_num=8) led_num = 0; Set_EBILED(0 x01= 8)n led_num = 0;n Set_EBILED(0 x80led_num); / 给LED 发数据n Delay(1000000);nnif(roll_flag =ROLL_RIGHT) / LED 向

13、右滚动n led_num+;n if(led_num=8)n led_num = 0;n Set_EBILED(0 x01led_num); / 给LED 发数据n Delay(1000000);n第六章 部件工作原理和编程示例nGPIO编程示例nEBI编程n外部中断外部中断nIRQ编程编程nUART编程示例nTIMER编程示例0 x0000 00000 xFFFF FFFF用户程序中断服务程序异常向量表1.正在执行用户程序;2.外部中断0发生中断;3.AIC硬件将中断服务程序地址装入AIC_IPER寄存器;4.程序跳转至异常向量表中IRQ入口0 x0018处;5.执行指令跳转至AIC_IPE

14、R寄存器中的中断服务地址;6.中断服务程序执行完毕,返回被中断的用户程序继续执行被中断的代码。n图示IRQ中断的发生过程5.6 W90P710的中断控制器(AIC)n向量中断控制器概述 ARM7TDMI内核具有两个中断输入,分别为IRQ中断和FIQ中断。但是芯片内部有许多中断源,最多可以有32个中断输入请求。向量中断控制器的作用就是允许哪些中断源可以产生中断、可以产生哪类中断、产生中断后执行哪段服务程序。ARM7TDMI-SIRQFIQAIC中断请求输入0中断请求输入31. . .W90P710的中断控制器(AIC)nARM7TDMI处理器提供两种中断模式, 快速中断快速中断 (FIQ) 模式

15、用于紧急事件处理,而中断模式中断模式 (IRQ) 用于普通事件处理。n可以处理32个不同的中断源,可独立开启或屏蔽,每个中断源有一个唯一的中断号.n支持8个不同的优先级,当优先级为0时,表示处理的是FIQ中断,为17时,表示的是IRQ中断n支持的中断触发方式n低电平n高电平n下降沿触发n上升沿触发31个中断源及相应的中断号中断触发方式及优先级中断寄存器功能(AIC_IMR)中断寄存器功能(AIC_MECR)中断寄存器功能(AIC_MDCR)nIRQ的控制n实现通过外部中断引脚INT 的中断信号控制LED1LED8指示灯状态的功能。n当没有外部中断输入时,LED1LED8 这8 个指示灯按设定的

16、软件延时时间顺序循环点亮。当有外部中断信号输入时,程序进入中断处理程序,使指示灯按LED1LED4 先亮,接下来延时指定时间后LED1LED4 熄灭,LED5LED8 点亮。如此反复8 次之后,再恢复到申请中断之前的顺序循环点亮状态。中断的配置outpw(REG_AIC_SCR5,0 x81); / 中断控制寄存器设置,负边沿触发,优先级为1outpw(REG_AIC_MECR,0 x20); / 使能相应的中断源中断寄存器功能(AIC_MECR)文件组织包含的头文件信息(EBI.c)#include wblib.h#include EBI.h/#define outpw(port,value

17、) (*(UINT32 volatile *) (port)=value)/此宏定义在头文件“wblib.h”中已定义/#define writeb(addr,x) (*(UINT8 volatile *)(addr) = (UINT8 volatile)x)/此宏定义在头文件“wblib.h”中已定义LED控制代码(EBI.c)nvoid Init_EBILED(INT32 Value)nn outpw(REG_EXT0CON, EBI_EXT0_VALUE);n Set_EBILED(Value);nnvoid Set_EBILED(INT32 Value)nn writeb(EBILED

18、_ADDRESS, Value);nLED循环流动(main.c)#include #include wblib.h#include irq_handler.h#include main.hLED循环流动(main.c)int main (void)INT16 led_num=0;Init_EBILED(0 x0);outpw(REG_AIC_SCR5,0 x81); / 中断控制寄存器设置,负边沿触发,优先级为1outpw(REG_AIC_MECR,0 x20); / 使能相应的中断源while(1) if(led_num=8) led_num = 0; Set_EBILED(0 x01le

19、d_num); led_num+; Delay(1000000);return 0;irq_void nIRQ3_Handler(void)nnINT8 i;nfor(i=0;i=8;i+)nn Set_EBILED(0 x0F);n Delay(1000000);n Set_EBILED(0 xF0);n Delay(1000000);nn习题n编写一段C 语言源程序,通过外部中断nIRQ3控制LED1LED8 流水灯显示的流动方向。当中断被触发时改变灯的流动方向.Main.c#include #include wblib.h#include irq_handler.h#include ma

20、in.hINT8 roll_flag=0 x00;int main (void)INT16 led_num=0;Init_EBILED(0 x0);outpw(REG_AIC_SCR5,0 x81); / 中断控制寄存器设置,正边沿触发,优先级为1outpw(REG_AIC_MECR,0 x20); / 使能相应的中断源Main.cwhile(1)if(roll_flag =ROLL_LEFT) / LED 向左滚动向左滚动led_num+;if(led_num = 8) led_num = 0;Set_EBILED(0 x80led_num); / 给给LED 发数据发数据Delay(100

21、0000);if(roll_flag =ROLL_RIGHT) / LED 向右滚动向右滚动led_num+;if(led_num=8) led_num = 0;Set_EBILED(0 x01led_num); / 给给LED 发数据发数据Delay(1000000); return 0;irq_handler.cextern INT8 roll_flag;void nIRQ3_Handler(void) if(roll_flag =ROLL_LEFT) / LED 向左滚动roll_flag= ROLL_RIGHT;else roll_flag= ROLL_LEFT;第六章 部件工作原理和

22、编程示例nGPIO编程示例nEBI编程n外部中断nIRQ编程nUART编程示例编程示例nTIMER编程示例UART 编程示例nUART工作原理nUART控制寄存器介绍nUART编程实现需要掌握的内容n如何设定UART的波特率,奇偶校验位和停止位?nUART的接受发送是如何实现?nUART接收和发送中断是如何设计?UART工作原理nUART:Universal Asynchronous Receiver/Transmitter,通用异步接收/发送装置,UART是一个并行输入成为串行输是一个并行输入成为串行输出出 nW90P710的异步串口通信模块包含4个UART模块和相关的逻辑电路n通用异步收发

23、器(UART)将计算机外部来的串行数据转换为并行数据。从UART接收引进(SIN)得到的字符位被相继地移入接收FIFO。nUART也可以将由计算机内部传送过来的并行数据转换为输出的串行数据流。这些输出字符被驱动程序写入发送FIFO,然后再被依次移到UART发送引脚(SOUT)。 W90P710的UART功能模块号模块号串口类型串口类型FIFO长度长度 时钟信号源时钟信号源调制解调制解调器信调器信号号I/O引脚引脚设计目设计目标标0通用串口16字节15MN/ATxD0, RXD0通用串口1高速串口64字节15M, 30M, 43.6M, 48M, 60MCTS, RTSTXD1, RXD1, C

24、TS1, RTS1通用串口/蓝牙2通用串口16字节15MN/ATX2, RX2通用串口/红外线3通用串口16字节15MDTR, DSRTXD3, RXD3, DRT3, DSR3通用串口/微型打印机123:RS-232C 链路发送接收地微机终端123:UART工作原理UART工作原理n通用异步收发器(UART)将计算机外部来的串行数据转换为并行数据。从UART接收引脚(SIN)得到的字符位被相继地移入接收FIFO。驱动程序通过读取接收FIFO获得输入的字符。 UART也可以将由计算机内部传送过来的并行数据转换为输出的串行数据流。这些输出字符被驱动程序写入发送FIFO,然后再被依次移到UART发

25、送引脚(SOUT)。UART的控制寄存器UART0_RBR0 xFFF8.0000R接收缓冲寄存器(接收缓冲寄存器(DLAB = 0)没有定义UART0_THR0 xFFF8.0000W发送保持寄存器(发送保持寄存器(DLAB = 0)没有定义UART0_IER0 xFFF8.0004R/W中断允许寄存器(中断允许寄存器(DLAB = 0)0 x0000.0000UART0_DLL0 xFFF8.0000R/W波特率除数锁存器(波特率除数锁存器(DLAB = 1 1)0 x0000.0000UART0_DLM0 xFFF8.0004R/W波特率除数锁存器(波特率除数锁存器(MS)()(DLAB

26、 = 1 1)0 x0000.0000UART0_IIR0 xFFF8.0008R中断识别寄存器中断识别寄存器0 x8181.8181UART0_FCR0 xFFF8.0008WFIFO控制寄存器控制寄存器没有定义UART0_LCR0 xFFF8.000CR/W线路控制寄存器线路控制寄存器0 x0000.0000保留0 xFFF8.0010UART0_LSR0 xFFF8.0014R线路状态寄存器线路状态寄存器0 x6060.6060保留0 xFFF8.0018UART0_TOR0 xFFF8.001CR/W超时寄存器超时寄存器0 x0000.0000UART的接收和发送寄存器UART0_RB

27、R0 xFFF8.0000R接收缓冲寄存器(接收缓冲寄存器(DLAB = 0)没有定义UART0_THR0 xFFF8.0000W发送保持寄存器(发送保持寄存器(DLAB = 0)没有定义UART波特率的设置UART0_DLL0 xFFF8.0000R/W波特率除数锁存器(波特率除数锁存器(DLAB = 1 1)0 x0000.0000UART0_DLM0 xFFF8.0004R/W波特率除数锁存器(波特率除数锁存器(MS)()(DLAB = 1 1)0 x0000.0000波特率波特率 = 晶振器时钟信号晶振器时钟信号 / (16 (波特率除数波特率除数 + 2)UART,数据位,校验位和停

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

29、水灯方式闪亮的运行方向。UART工程七种异常向量表七种异常向量表,32种中断向量种中断向量表表,以及完成异常发生到进入以及完成异常发生到进入C语言函数的流程语言函数的流程,及异常返回及异常返回ARM的启动的初始化代码的启动的初始化代码,包括包括各种异常模式堆栈的初始化或各种异常模式堆栈的初始化或内存重映射等内存重映射等.最终切到用户模最终切到用户模式后式后,进入主函数进入主函数(main)各种异常或中断的各种异常或中断的C语言函数语言函数,所有的所有的31个中断功能函数实现个中断功能函数实现.UART功能子函数功能子函数EBI功能子函数功能子函数主函数循环主函数循环实现流程(uart.c)/U

30、ART初始化初始化/UART接收的实现接收的实现/UART发送的实现发送的实现n#include n#include UART0.hn#include wblib.hnINT8 rcv_buf100 = 0; / UART0数据接收缓冲区nINT8 sen_buf100 = 0; / UART0数据发送缓冲区nINT8 rcv_num = 0; /接收计数nINT8 send_num = 0; /发送计数nINT8 strlenth=0;UART初始化1. 通过设置寄存器UART_DLL设置波特率除数低位 ,通过设置寄存器UART_DLM设置波特率除数高位2 通过设置寄存器UART_LCR设置

31、奇偶校验位、资料位和停止位3 通过设置寄存器UART_FCR的来几个字节产来几个字节产生接受中断生接受中断4 打开寄存器UART_IER的接收器数据就绪中断、发送保持寄存器为空时中断和接收线路状态变化中断.UART初始化(1) (uart.c)nINT8 Uart0Init (INT32 baud, UARTMODE set)nn INT32 Divisor; n outpw(REG_GPIO_CFG5,0 x05); / 设置I/O连接到UART0n outpw(REG_GPIO_DIR5,0 x30000); / 设置RX0,TX0引脚上拉n outpw(REG_UART0_FCR,0 x

32、01); / 使能FIFO,并设置触发点为1字节n outpw(REG_UART0_IER,0 x01); / 允许接收中断UART初始化(2) (uart.c)n/* 设置串口波特率 */ n outpw(REG_UART0_LCR,0 x80); / DLAB = 1 此时可存取除数因子寄存器REG_UART_LSB_0和REG_UART_MSB_0n n Divisor = (APB_SYSTEM_CLOCK 4) / baud);n if(APB_SYSTEM_CLOCK % (baud * 16) (baud * 16) / 2)n n Divisor+;n n Divisor -=

33、 2;n outpw(REG_UART0_LSB,(INT8)Divisor);n outpw(REG_UART0_MSB,(INT8)(Divisor 8);UART初始化(3) (uart.c)n /* 设置串口模式 */n Divisor = set.datab - 5; / 设置字长n if(set.stopb = 2) n Divisor |= 0 x04; / 判断是否为2位停止位n n if(set.parity != 0) n set.parity = set.parity - 1;n Divisor |= 0 x08;n n /* 设置奇偶校验 */n Divisor |=

34、set.parity 4; / 设置奇偶校验n outpw(REG_UART0_LCR,Divisor); / DLAB = 0 此时可存取接收缓冲器(RBR),发送保持寄存器(THR)和中断使能寄存器(IER)UART初始化(4) (uart.c)n /* 使能UART0中断 */ n outpw(REG_AIC_SCR9,0 x41); / 设置UART0中断优先级为IRQ第一级中断n outpw(REG_AIC_MECR,0 x200); / 使能串口中断n return (1);n字符串的发送(uart.c)nvoid uart0Write(INT8 *string) n n INT8

35、 lenth;n strlenth = strlen(char *)string); / strlenth为一全局为一全局变量将在中断服务中用到变量将在中断服务中用到n for(lenth = 0; lenth strlenth; lenth+)n n sen_buflenth = *string+;n n n outpw(REG_UART0_TX,sen_buf0); / 发送第一个发送第一个数据数据n outpw(REG_UART0_IER,0 x03); / 允许接收中断允许接收中断和发送中断和发送中断n头文件及变量定义(main.c)n#include n#include wblib.

36、hn#include irq_handler.hn#include UART0.hn#include main.hnint main (void)n n UARTMODE set;n INT8 open_show1 = UART TEST nrL-LED leftnrR-LED rightnr;n INT8 bad_command = bad command !nr;n INT8 led_num;n INT8 roll_flag=0 x00;EBI和UART初始化(main.c)n Init_EBILED(0 x00); /初始化LED/设置串口的波特率为115200,数据流为8位,停止位为1

37、位,无校验位nset.datab = 8;n set.stopb = 1;n set.parity = 0;n Uart0Init(115200, set); / 串口初始化n uart0Write(open_show1); / 将openshow1中的内容装入rcv_buf缓冲区中n UART通讯主程序(main.c)while (1)nif(rcv_bufrcv_num-1 = 0 x0D) / 判断接收新数据是否结束n/ 既不是L 也不是R /则输出bad command n if(rcv_buf0 != R & rcv_buf0 != L) n uart0Write(bad_c

38、ommand); n elsen if(rcv_buf0 = L) / 左滚动n roll_flag=ROLL_LEFT;n if(rcv_buf0 =R) / 右滚动n roll_flag=ROLL_RIGHT;n n rcv_num=0;nUART通讯主程序(main.c)nif(roll_flag =ROLL_LEFT) / LED 向左滚动n led_num+;n if(led_num = 8)n led_num = 0;n Set_EBILED(0 x80led_num); / 给LED 发数据n Delay(1000000);nnif(roll_flag =ROLL_RIGHT)

39、/ LED 向右滚动n led_num+;n if(led_num=8)n led_num = 0;n Set_EBILED(0 x01led_num); / 给LED 发数据n Delay(1000000);nnreturn 0;UART中断的实现(接收)(irq_handler.c)nvoid UART0_Handler(void)nnINT8 m=0;nif(inpw(REG_UART0_IIR)&0 x0F) = 0 x4) / 判断当前来的中断类型是接收中断判断当前来的中断类型是接收中断n if (rcv_num=0) n for(m=0;m100;m+) n rcv_buf

40、m=0;nnnrcv_bufrcv_num = inpw(REG_UART0_RX); / 读取读取FIFO的数据的数据nif(rcv_bufrcv_num=0 x0D) / 如果是回车键则表示接收完成如果是回车键则表示接收完成nnoutpw(REG_UART0_TX,n);noutpw(REG_UART0_TX,r);nnelse n outpw(REG_UART0_TX,rcv_bufrcv_num);/ 将接收来的数据回显到将接收来的数据回显到PCnnrcv_num+;nUART中断的实现(发送) irq_else if(inpw(REG_UART0_IIR)&0 x0F) =

41、0 x2) / 判断当前来的中断类型是发送中断n nsend_num+; nif(send_numstrlenth) / 判断发送是否结束n noutpw(REG_UART0_TX,sen_bufsend_num);n nelsennsend_num=0;noutpw(REG_UART0_IER,0 x01); n / 如果发送结束则关发送中断nn n习题n编写程序,实现串口控制8个LED做8位的16进制数字显示,发字符串, 发”4”+回车,第三个LED亮,其它灭 发”255”+回车,所有LED都亮, 发”0”+回车,所有LED都灭,依此类推提示:字符是以ASCII码存储的,5-0=5.头文件

42、及变量定义(main.c)n#include n#include wblib.hn#include irq_handler.hn#include UART0.hn#include main.hnint main (void)n n UARTMODE set;n INT8 open_show1 = UART TEST ;n INT8 bad_command = bad command !nr;n INT8 led_num,uart_num;n INT8 roll_flag=0 x00;EBI和UART初始化(main.c)n Init_EBILED(0 x00); /初始化LED/设置串口的波特

43、率为115200,数据流为8位,停止位为1位,无校验位nset.datab = 8;n set.stopb = 1;n set.parity = 0;n Uart0Init(115200, set); / 串口初始化n uart0Write(open_show1); / 将openshow1中的内容装入rcv_buf缓冲区中n UART通讯主程序(main.c)while (1)if(rcv_bufrcv_num-1 = 0 x0D) / 判断接收新数据是否结束uart_Num=0;for(i=0; i=0 & rcv_bufi =9 ) uart_Num= uart_Num*10+(

44、 rcv_bufi-0); else uart0Write(bad_command); break; if(i=rcv_num-1) led_num = uart_Num;Set_EBILED(led_num & 0 xff); / 给LED 发数据rcv_num=0;第六章 部件工作原理和编程示例nGPIO编程示例nEBI编程nUART编程示例n外部中断外部中断nIRQ编程编程nTIMER编程示例nIRQ的控制n实现通过外部中断引脚INT 的中断信号控制LED1LED8指示灯状态的功能。n当没有外部中断输入时,LED1LED8 这8 个指示灯按设定的软件延时时间顺序循环点亮。当有外部

45、中断信号输入时,程序进入中断处理程序,使指示灯按LED1LED4 先亮,接下来延时指定时间后LED1LED4 熄灭,LED5LED8 点亮。如此反复8 次之后,再恢复到申请中断之前的顺序循环点亮状态。中断的配置outpw(REG_AIC_SCR5,0 x81); / 中断控制寄存器设置,负边沿触发,优先级为1outpw(REG_AIC_MECR,0 x20); / 使能相应的中断源文件组织包含的头文件信息(EBI.c)#include wblib.h#include EBI.h/#define outpw(port,value) (*(UINT32 volatile *) (port)=val

46、ue)/此宏定义在头文件“wblib.h”中已定义/#define writeb(addr,x) (*(UINT8 volatile *)(addr) = (UINT8 volatile)x)/此宏定义在头文件“wblib.h”中已定义LED控制代码(EBI.c)nvoid Init_EBILED(INT32 Value)nn outpw(REG_EXT0CON, EBI_EXT0_VALUE);n Set_EBILED(Value);nnvoid Set_EBILED(INT32 Value)nn writeb(EBILED_ADDRESS, Value);nLED循环流动(main.c)#

47、include #include wblib.h#include irq_handler.h#include main.hLED循环流动(main.c)int main (void)INT16 led_num=0;Init_EBILED(0 x0);outpw(REG_AIC_SCR5,0 x81); / 中断控制寄存器设置,负边沿触发,优先级为1outpw(REG_AIC_MECR,0 x20); / 使能相应的中断源while(1) if(led_num=8) led_num = 0; Set_EBILED(0 x01led_num); led_num+; Delay(1000000);r

48、eturn 0;irq_void nIRQ3_Handler(void)nnINT8 i;nfor(i=0;i=8;i+)nn Set_EBILED(0 x0F);n Delay(1000000);n Set_EBILED(0 xF0);n Delay(1000000);nn习题n编写一段C 语言源程序,通过外部中断nIRQ3控制LED1LED8 流水灯显示的流动方向。当中断被触发时改变灯的流动方向.Main.c#include #include wblib.h#include irq_handler.h#include main.hINT8 roll_flag=0 x00;int main

49、(void)INT16 led_num=0;Init_EBILED(0 x0);outpw(REG_AIC_SCR5,0 x81); / 中断控制寄存器设置,正边沿触发,优先级为1outpw(REG_AIC_MECR,0 x20); / 使能相应的中断源Main.cwhile(1)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) /

50、LED 向右滚动向右滚动led_num+;if(led_num=8) led_num = 0;Set_EBILED(0 x01led_num); / 给给LED 发数据发数据Delay(1000000); return 0;irq_handler.cextern INT8 roll_flag;void nIRQ3_Handler(void) if(roll_flag =ROLL_LEFT) / LED 向左滚动roll_flag= ROLL_RIGHT;else roll_flag= ROLL_LEFT;第六章 部件工作原理和编程示例nGPIO编程示例nEBI编程n外部中断nIRQ编程nUAR

51、T编程示例编程示例nTIMER编程示例定时器功能设计n定时器是如何定时? 如何设计定时器的分频?n定时中断的设计?定时器功能nW90P710计时器模块包括2个信道,TIMER0和TIMER1,允许用户容易地实现一个计数计划。每个信道有独立的时钟资源。输入时钟被一个8bit分频器分频并且随后被一个24bit减计数器引用。当计数器减数到0时,如果中断启动了的话定时器将声明一个中断请求。一个普通的软件计数器计划是用来设置一个软件计数器,并在每一个中断发生时加1给它。n一个普通的定时器控制器有以下几个特征:n与AMBA APB接口兼容n兩个带一个8bit分频计数器/24bit减计数器和一个中断申请的信

52、道n对每个信道的独立时钟资源1.最大不中断时间 = (1 / 15 MHz) * (256) * (224), if TCLK = 15 MHz定时器的工作方式n在使能计数器中断前,驱动应该设置操作模式、分频器和计数器。定时器支持一次性模式、周期模式和翻转模式给用户来执行计数计划。n在一次性模式下,中断信号一旦被产生将不会再在一次性模式下,中断信号一旦被产生将不会再次产生除非定时器以后被重新使能。次产生除非定时器以后被重新使能。n在周期模式下,中断信号被周期性地产生。在周期模式下,中断信号被周期性地产生。 n在翻转模式下,中断信号在每个在翻转模式下,中断信号在每个50%周期由低周期由低到高或由

53、高到低转换时被产生。到高或由高到低转换时被产生。 定时器逻辑框图n例7.5:编写一段C 语言源程序,实现通过TIMER0 中断,控制LED1 有规律亮灭的功能。定时器产生中断间隔的设定n定时器中断的频率取决于以下等式:nFreq. = Crystal clock / (pre-scaler+1) * counter)n对于W90P710,晶振时钟输出是15 MHz。根据这个等式,用户可以决定分频器和计数器的值来得到想要的中断频率。n定时器参考设置值:Frequency (1/sec)Pre-ScalarCounter1800 xCB7354000 x5B8D810000 x249F0定时器的寄

54、存器组织定时器控制寄存器定时器计数初值的设定定时器当前计数值定时器工程组织主函数的设计(main.c)nint main (void)n n Init_EBILED(0 x0);nTimer0Init();nwhile(1);nreturn 0;nn/初始化EBI和Timer,进入死循环,然后在定时中断中控制LED的亮和灭定时器的初始化(timer0.c)nvoid Timer0Init(void)nn n outpw(REG_TCR0,0 x08000000); / 初始化定时器控制寄存器,设置定时器模式为循环模式 n n outpw(REG_TICR0,0 xE4E1C0); / 定时器初始计数值 n n outpw(REG_AIC_SCR13,0 x41); / 中断控制寄存器设置,正边沿触发,优先级为1n n outpw(REG_AIC_MECR,0 x00002000);/ 使能相应的中断源 n n outpw(REG_TCR0,inpw(REG_TCR0)|0 x20000000); / 开定时器中断

温馨提示

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

评论

0/150

提交评论