《中国矿业大学嵌入式课件8教学提纲.ppt》由会员分享,可在线阅读,更多相关《中国矿业大学嵌入式课件8教学提纲.ppt(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、中国矿业大学嵌入式课件中国矿业大学嵌入式课件8 85.1 S3C2410A GPIO介绍GPIO(General Purpose I/O,通用输入/输出接口)也称为并行I/O(parallel I/O),是最基本的I/O形式,由一组输入引脚、输出引脚或输入/输出引脚组成,CPU对它们能够进行存取操作。I/OI/O的应用是处理器的基础应用的应用是处理器的基础应用芯片芯片S3C2410具有具有117通用多功能输入输出引脚,通用多功能输入输出引脚,这些这些I/O的应用是的应用是S3C2410处理器的基础应用,处理器的基础应用,分为分为8组。组。端口端口A(GPA):23个输出口个输出口端口端口B(G
2、PB):11个输入输出口个输入输出口端口端口C(GPC):16个输入输出口个输入输出口端口端口D(GPD):16个输入输出口个输入输出口端口端口E(GPE):16个输入输出口个输入输出口端口端口F(GPF):8个输入输出口个输入输出口端口端口G(GPG):16个输入输出口个输入输出口端口端口H(GPH):11个输入输出口个输入输出口 每组端口都可以通过软件配置寄每组端口都可以通过软件配置寄存器来满足不同系统和设计的需要,存器来满足不同系统和设计的需要,在运行程序之前必须先对每一个用到在运行程序之前必须先对每一个用到的引脚的功能进行设置的引脚的功能进行设置,如果某些引,如果某些引脚的复用功能没有
3、使用,那么可以将脚的复用功能没有使用,那么可以将该引脚设置成该引脚设置成I/O口。口。端口控制描述端口控制描述端口控制寄存器端口控制寄存器(GPACON-BGHCON)在在S3C2410中,大部分端口都是复用的,中,大部分端口都是复用的,因此需要决定每个引脚使用哪个功能。端口控因此需要决定每个引脚使用哪个功能。端口控制寄存器制寄存器PnCON决定每个引脚的功能。决定每个引脚的功能。端口数据寄存器端口数据寄存器(GPADAT-GPHDAT)如果端口被配置成输出端口,可以向如果端口被配置成输出端口,可以向PnDAT中的相关位写入数据;如果端口被配置成输中的相关位写入数据;如果端口被配置成输入端口,
4、可以从入端口,可以从PnDAT中的相关位读入数据。中的相关位读入数据。端口上拉电阻寄存器端口上拉电阻寄存器(GPBUP-GPHUP)端口上拉电阻寄存器控制每个端口组的上拉端口上拉电阻寄存器控制每个端口组的上拉电阻的使能和禁止。当相关位为电阻的使能和禁止。当相关位为0,上拉电阻,上拉电阻使能;当相关位为使能;当相关位为1,上拉电阻禁止;,上拉电阻禁止;当端口上拉电阻寄存器使能时,不管引脚选当端口上拉电阻寄存器使能时,不管引脚选择什么功能(输入、输出、数据、外部中断择什么功能(输入、输出、数据、外部中断等),上拉电阻都工作。等),上拉电阻都工作。外部中断控制寄存器外部中断控制寄存器(EXTINTN
5、)24个外部中断可响应各种信号请求方式。个外部中断可响应各种信号请求方式。EXTINTn寄存器可以配置如下信号请求方式:寄存器可以配置如下信号请求方式:低电平触发、高电平触发、上升沿触发、下低电平触发、高电平触发、上升沿触发、下降沿触发、双边沿触发。降沿触发、双边沿触发。举例:端口B控制寄存器#define rGPACON(*(volatile unsigned*)0 x56000000)/Port A控制寄存器#define rGPADAT(*(volati1e unsigned*)0 x56000004)/Port A数据寄存器#define rGPBCON(*(volatile unsi
6、gned*)0 x56000010)/Port B控制寄存器#define rGPBDAT(*(volatile unsigned*)0 x56000014)/Port B数据寄存器#define rGPBUP (*(volatile unsigned*)0 x56000018)/Port B上拉电阻禁止寄存器#define rGPCCON(*(volatile unsigned*)0 x56000020)/Port C控制寄存器#define rGPCDAT(*(volatile unsigned*)0 x56000024)/Port C数据寄存器#define rGPCUP (*(vola
7、tile unsigned*)0 x56000028)/Port C上拉电阻禁止寄存器#define rGPDCON(*(volatile unsigned*)0 x56000030)/Port D控制寄存器#define rGPDDAT(*(volatile unsigned*)0 x56000034)/Port D数据寄存器#define rGPDUP (*(volatile unsigned*)0 x56000038)/Port D上拉电阻禁止寄存器对I/O口的操作是通过对相关各个寄存器的读写实现的。要对寄存器进行读写操作,首先要对寄存器进行定义。有关I/O口相关寄存器的宏定义代码如下:
8、#define rGPECON#define rGPECON(*(volatile unsigned*volatile unsigned*)0 x560000400 x56000040)/Port E/Port E控制寄存器控制寄存器#define rGPEDAT#define rGPEDAT(*(volatile unsigned*volatile unsigned*)0 x560000440 x56000044)/Port E/Port E数据寄存器数据寄存器#define rGPEUP#define rGPEUP (*(volatile unsigned*volatile unsigne
9、d*)0 x560000480 x56000048)/Port E/Port E上拉电阻禁止上拉电阻禁止寄存器寄存器#define rGPFCON#define rGPFCON(*(volatile unsigned*volatile unsigned*)0 x560000500 x56000050)/Port F/Port F控制寄存器控制寄存器#define rGPFDAT#define rGPFDAT(*(volatile unsigned*volatile unsigned*)0 x560000540 x56000054)/Port F/Port F数据寄存器数据寄存器#define
10、rGPFUP#define rGPFUP (*(volatile unsigned*volatile unsigned*)0 x560000580 x56000058)/Port F/Port F上拉电阻禁止上拉电阻禁止寄存器寄存器#definerGPGCON#definerGPGCON(*(volati1e unsigned*volati1e unsigned*)0 x560000600 x56000060)/Port G/Port G控制寄存器控制寄存器#definerGPGDAT#definerGPGDAT(*(volatile unsigned*volatile unsigned*)0
11、 x560000640 x56000064)/Port G/Port G数据寄存器数据寄存器#definerGPGUP#definerGPGUP (*(volatile unsigned*volatile unsigned*)0 x560000680 x56000068)/Port G/Port G上拉电阻禁止寄上拉电阻禁止寄存器存器#definerGPHCON#definerGPHCON(*(volatile unsigned*volatile unsigned*)0 x560000700 x56000070)/Port H/Port H控制寄存器控制寄存器#definerGPHDAT#de
12、finerGPHDAT(*(volatile unsigned*volatile unsigned*)0 x560000740 x56000074)/Port H/Port H数据寄存器数据寄存器#definerGPHUP#definerGPHUP (*(volatile unsigned*volatile unsigned*)0 x560000780 x56000078)/Port H/Port H上拉电阻禁止寄上拉电阻禁止寄存器存器p 目目 录录 5.1 5.1 键盘与键盘与LEDLED数码管接口数码管接口 5.2 5.2 串行接口串行接口 5.1 5.1 键盘与键盘与LEDLED数码管接
13、口数码管接口 1 1、用、用I/OI/O口实现口实现 2 2、采用专用芯片实现、采用专用芯片实现 3 3、总线扩展方式实现、总线扩展方式实现1、用I/O口实现行扫描法行扫描法两步:两步:1、识别键盘是否被、识别键盘是否被按下;按下;(让所有行线均为(让所有行线均为低电平)低电平)2、识别具体按键、识别具体按键 (逐行置低)(逐行置低)10111 1 1 1 1 1 0 1 ARMVDD键盘接口qPFPF端口寄存器的设置端口寄存器的设置设置设置rGPFCON寄存器寄存器设置设置rGPFUP寄存器寄存器设置设置rGPFDAT寄存器寄存器输出输出输入输入rGPFCON0 x5500000000000
14、000000000000001010101rGPFUP00000000000000000000000001111000Keyval=(rPDATF&0 xf0)4rGPFUP=0 x00使能使能PF0PF7的内部的内部上拉电阻上拉电阻#include#include char ReadKeyVal(void)unsigned char i,j,H_val,L_val;char keyval=-1;rGPFCON=0 x55;rGPFUP=0 xff;rGPFDAT=0 xf0;if(L_val=(rGPFDAT&0 xf0)!=0 xf0)H_val=0 xfe;for(i=0;i4;i+)r
15、GPGDAT=H_val;for(j=0;j4)|0 xf0;Keyval=get_val(H_val)*4+get_val(L_val);return keyval;elseH_val=(H_val 1)|1;return keyval;char get_val(unsigned char val)unsigned char I,x;x=0;for(i=0;i1)|0 x80;x=x+1;输出输出输入输入0 xe,0 xd,0 xb,0 x7gfedcba 1.1.半导体数码管半导体数码管半导体数码管半导体数码管 由七段发光二极管构成由七段发光二极管构成例:例:共阴极接法共阴极接法a b c
16、 d e f g 0 1 1 0 0 0 01 1 0 1 1 0 1gfedcbagfedcba低低电电平平时时发发光光高高电电平平时时发发光光abcdefg共阴极接法共阴极接法共阳极接法共阳极接法abcgdefLED显示器接口DP七段显示译码器状态表七段显示译码器状态表Q3 Q2 Q1 Q0a b c d e f g DP 0 0 0 0 1 1 1 1 1 1 0 0 00 0 0 1 0 1 1 0 0 0 0 0 10 0 1 0 1 1 0 1 1 0 1 0 20 0 1 1 1 1 1 1 0 0 1 0 30 1 0 0 0 1 1 0 0 1 1 0 40 1 0 1 1
17、0 1 1 0 1 1 0 50 1 1 0 1 0 1 1 1 1 1 0 60 1 1 1 1 1 1 0 0 0 0 0 71 0 0 0 1 1 1 1 1 1 1 0 81 0 0 1 1 1 1 1 0 1 1 0 9输输 入入输输 出出显示显示数码数码gfedcbaDP共共 阴阴 极极 接接 法法七段显示译码器状态表七段显示译码器状态表Q3 Q2 Q1 Q0a b c d e f g DP 0 0 0 0 0 0 0 0 0 0 1 1 00 0 0 1 1 0 0 1 1 1 1 1 10 0 1 0 0 0 1 0 0 1 0 1 20 0 1 1 0 0 0 0 1 1 0
18、 1 30 1 0 0 1 0 0 1 1 0 0 1 40 1 0 1 0 1 0 0 1 0 0 1 50 1 1 0 0 1 0 0 0 0 0 1 60 1 1 1 0 0 0 1 1 1 1 1 71 0 0 0 0 0 0 0 0 0 0 1 81 0 0 1 0 0 0 0 1 0 0 1 9输输 入入输输 出出显示显示数码数码共共 阳阳 极极 接接 法法位驱动:位驱动:输入高电平,输入高电平,三极管处于三极管处于截止状态;截止状态;输入低电平,输入低电平,三极管处于三极管处于饱和状态,饱和状态,选通位。选通位。段驱动:段驱动:输入输入显示数码的显示数码的显示代码显示代码输输出出
19、输输出出G PortF Port#include#include void DisplayLed1(unsigned char dis_8_num)unsigned char led_dis=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90,0 x88,0 x83,0 xC6,0 xA1,0 x86,0 x8E,0 x8C;unsigned char i,j,D_val,B_val;rGPFCON=0 x5555;rGGPCON=0 x5555;rGPFUP=0 x00;rGPGUP=0 x00;B_val=0 x80;fo
20、r(i=0;i8;i+)D_val=dis_8_numi;rGPFDAT=led_disD_val;rGPG DAT=B_val;for(j=0;j1;共共阳阳极极接接法法七段显示译码器状态表七段显示译码器状态表Q3 Q2 Q1 Q0a b c d e f g DP 0 0 0 0 0 0 0 0 0 0 1 1 00 0 0 1 1 0 0 1 1 1 1 1 10 0 1 0 0 0 1 0 0 1 0 1 20 0 1 1 0 0 0 0 1 1 0 1 30 1 0 0 1 0 0 1 1 0 0 1 40 1 0 1 0 1 0 0 1 0 0 1 50 1 1 0 0 1 0 0
21、0 0 0 1 60 1 1 1 0 0 0 1 1 1 1 1 71 0 0 0 0 0 0 0 0 0 0 1 81 0 0 1 0 0 0 0 1 0 0 1 9输输 入入输输 出出显示显示数码数码共共 阳阳 极极 接接 法法0 xC00 xF90 xA40 xB00 x990 x920 x820 xF80 x800 x902、专用芯片实现ZLG7290芯片I2C接口可驱动8位共阴数码管或64只独立LED或64个按键引脚符号类型描述13,12,21,22,36Dig7 Dig0 输入/输出LED 显示位驱动及键盘扫描线107,2,1,24,23SegHSegA 输入/输出LED 显示段驱
22、动及键盘扫描线20SDA 输入/输出I2C 总线接口数据/地址线19SCL 输入/输出I2C 总线接口时钟线14/INT 输出中断输出端,低电平有效15/RES 输入复位输入端,低电平有效17OSC1 输入连接晶体以产生内部时钟18OSC2 输出16VCC 电源电源正端,电压3.35.5V 11GND 电源地,电源负端ZLG7290控制电路八段数码管连接电路键盘电路程序iic_read_keybd(0 x70,0 x1,&ucChar);/get data from ZLG7290 If(ucChar!=0)ucChar-key_set(ucChar);/key map for Edukit
23、II if(ucChar16)sprintf(&szBuf,”press key%d”,ucChar);else if(ucChar255)sprintf(&szBuf,”press key%d”,ucChar);if(ucChar=0 xFF)sprintf(&szBuf,”press key%c”,ucChar);if(ucChar=0 xFF)sprintf(&szBuf,”press key FUN”);3、总线扩展译码器:74HC138锁存器:74HC273单向驱动器:74HC244双向驱动器:74HC245也可用CPLD/FPGA编程实现举例地址空间0 x02000000控制LED
24、跑马灯及键盘扫描:bit03 控制键盘扫描;bit47控制跑马灯的显示。低电平有效。0 x02000002读入键盘扫描值:bit03有效,某位为低时,对应列有键按下。数码管扫描控制地址为数码管扫描控制地址为0 x02000006,位,位0位位5每位分每位分别对应一个数码管,将其中某位清别对应一个数码管,将其中某位清0来选择相应的数码来选择相应的数码管,管,地址地址0 x02000004为数码管的数据寄存器为数码管的数据寄存器 编程1、制作、制作LED字符与码段对应表,以数组形式表示,如下面代码所示,字符与码段对应表,以数组形式表示,如下面代码所示,seg7table0-seg7table15的
25、值分别代表显示字符的值分别代表显示字符0-F时,各码段的时,各码段的输入数据。输入数据。unsigned char seg7table16=/*0 1 2 3 4 5 6 7*/0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,/*8 9 A B C D E F*/0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e;2、通过查询通过查询LED字符与码段对应表获得各码段的输入数据,然后将字符与码段对应表获得各码段的输入数据,然后将该数据写入该数据写入LED数据寄存器即可实现在数码管上显示相应字符。数据寄存器
26、即可实现在数码管上显示相应字符。如下面的代码将在第一个数码管上显示字符如下面的代码将在第一个数码管上显示字符“0”。*(U8*)0 x02000006)=0 x3E;/*使能第一个数码管使能第一个数码管,位位0=0*/*(U8*)0 x02000004)=seg7table0;/*输出数据输出数据 0*/5.2 串行接口在微型计算机中大量使用异步串行在微型计算机中大量使用异步串行I/O 方方式,双方使用各自的时钟信号,而且允式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起易。但是由于每个字符都要独立确定起始
27、和结束始和结束(即每个字符都要重新同步即每个字符都要重新同步),字,字符和字符间还可能有长度不定的空闲时符和字符间还可能有长度不定的空闲时间,因此效率较低。间,因此效率较低。1、基础知识、基础知识EIA RS-232C q美国电子工业协会推荐的一种标准(Electronic industries Association Recoil-mendedStandard)q在25针接插件(DB25)上定义了串行通信的有关信号q在实际异步串行通信中,并不要求用全部的RS-232C 信号,PC中更是大量采用9针接插件(DB-9)来担当此任。DB-25 DB-9引脚定义RS-232C接口通信的两种基本连接方
28、式 信号电平规定 qEIA电平:双极性信号逻辑电平,它是一套负逻辑定义-3V到-15V之间的电平表示逻辑“1”+3V到+15V之间的电平表示逻辑“0”qTTL电平:计算机内部(S3C2410)使用TTL电平q电平转换电路:常用专门的RS-232接口芯片,如SP3232、SP3220等,在TTL电平和EIA电平之间实现相互转换。2、S3C2410异步串行口控制器qS3C2410自带三个异步串行口控制器每个控制器有每个控制器有1616字节的字节的FIFOFIFO(先入先出寄存器)先入先出寄存器)最大波特率最大波特率115.2K115.2K每个每个UARTUART有有7 7种状态:种状态:溢出错误溢
29、出错误校验错误校验错误帧错误帧错误暂停态暂停态接收缓冲区准备好接收缓冲区准备好发送缓冲区空发送缓冲区空发送移位缓冲器空发送移位缓冲器空这些状态可以由相应的这些状态可以由相应的UTRSTATnUTRSTATn或或UERSTATnUERSTATn寄存器表示,并且与发送接收寄存器表示,并且与发送接收缓冲区相对应的有错误缓冲区缓冲区相对应的有错误缓冲区图6.1.5 S3C2410A的UART方框图(具有FIFO)与UART有关的寄存器 q线路控制寄存器ULCONn q控制寄存器UCONn qFIFO控制寄存器UFCONn q控制寄存器UMCONn q状态寄存器UTRSTAT q错误状态寄存器UERST
30、AT qFIFO状态寄存器UFSTAT q发送寄存器UTXH和接收寄存器URXHq波特率因子寄存器UBRDIVS3C2410异步串行口控制器qS3C2410自带三个异步串行口控制器波特率的大小可以通过设置波特率寄存器(UBRDIVn)控制,计算公式如下:使用PCLK时的计算公式如下:UBRDIVn=(int)PCLK/(波特率16)1使用UCLK时的计算公式如下:UBRDIVn=(int)UCLK/(波特率16)1 例如:使用PCLK,在40 MHz的情况下,当波特率取115 200 bps时,UBRDIVn=(int)40000000/(11520016)1=203、编程实例1定义与定义与U
31、ART相关的寄存器相关的寄存器#define rULCON0(*(volatile unsigned*)0 x50000000)/UART0行控制寄存器#define rUCON0(*(volatile unsigned*)0 x50000004)/UART0控制寄存器#define rUFCON0(*(volatile unsigned*)0 x50000008)/UART0 FIFO控制寄器#define rUMCON0(*(volatile unsigned*)0 x5000000c)/UART0 Modem控制寄存器#define rUTRSTAT0(*(volatile unsign
32、ed*)0 x50000010)/UART0 Tx/Rx状态寄存器#define rUERSTAT0(*(volatile unsigned*)0 x50000014)/UART0 Rx错误状态寄存器#define rUFSTAT0(*(volatile unsigned*)0 x50000018)/UART0 FIFO状态寄存器#define rUMSTAT0(*(volatile unsigned*)0 x5000001c)/UART0 Modem状态寄存器#define rUBRDIV0(*(volatile unsigned*)0 x50000028)/UART0波特率系数寄存器#if
33、def_BIG_ENDIAN /大端模式大端模式#define rURXH0(*(volatile unsigned char*)0 x50000023)/UART0发送缓冲寄存器发送缓冲寄存器#define rURXH0(*(volatile unsigned char*)0 x50000027)/UART0接收缓冲寄存器接收缓冲寄存器#define WrUTXH0(ch)()(*(volatile unsigned char*)0 x50000023)()(unsigned char)()(ch)#define RdURXH0()()(*(volatile unsigned char*)0
34、 x50000027)#define UTXH0(0 x50000020+3)/DMA使用的字节访问地址使用的字节访问地址#define URXH0(0 x50000024+3)#else /小端模式小端模式#define rUTXH0(*(volatile unsigned char*)0 x50000020)/UART0 Transmission Hold#define rURXH0(*(volatile unsigned char)0 x50000024)/UART0 Receive buffer#define WrUTXH0(ch)()(*(volatile unsigned char
35、*)0 x50000020)()(unsigned char)()(ch)#define RdURXH0()()(*(volatile unsigned char*)0 x50000024)#define UTXH0(0 x50000020)/DMA使用的字节访问地址使用的字节访问地址#define URXH0(0 x50000024)#endif2、初始化操作/*当前UART号:0-UART0,1-UART1,2-UART2*/static int whichUart=0;*/Function name:Uart_Init/Description :串口初始化/Return type:voi
36、d/Argument :int pclk:APB总线时钟,0时使用缺省值PCLK/Argument :int baud:波特率*/void Uart_Init(int pclk,int baud)int i;if(pclk=0)pclk =PCLK;rUFCON0=0 x0;/UART channel 0 FIFO control register,FIFO disable rUFCON1=0 x0;/UART channel 1 FIFO control register,FIFO disable rUFCON2=0 x0;/UART channel 2 FIFO control regis
37、ter,FIFO disable rUMCON0=0 x0;/UART chaneel 0 MODEM control register,AFC disable rUMCON1=0 x0;/UART chaneel 1 MODEM control register,AFC disable/*串口串口0*/rULCON0=0 x3;/Line control register:Normal,No parity,1 stop,8 bits /PCLK Level Pulse Disable Generate Normal Normal Interrupt or Polling rUCON0 =0
38、x245;/当Tx缓冲为空时,以电平信号发送中断请求/当Rx缓冲有数据时,以边沿信号发送中断请求/禁止超时中断,允许产生处于接收出错状态的中断请求/禁止回送模式,禁止中止信号,发送数据操作按中断方式/接收数据操作按中断方式rUBRDIV0=(int)(pclk/16./baud)-1);/Baud rate divisior register 0 /*串口串口1*/rULCON1=0 x3;rUCON1 =0 x245;rUBRDIV1=(int)(pclk/16./baud)-1);/*串口串口2*/rULCON2=0 x3;rUCON2 =0 x245;rUBRDIV2=(int)(pcl
39、k/16./baud)-1);for(i=0;i100;i+);状态寄存器UTRSTAT 发送数据void Uart_SendByte(int data)if(whichUart=0)if(data=n)while(!(!(rUTRSTAT00 x2););当发送数据缓冲器不空,执行下一条指令当发送数据缓冲器不空,执行下一条指令 Delay(10););/延时,与终端速度有关延时,与终端速度有关 WrUTXH0(r););/rUTXH0=r;while(!(!(rUTRSTAT00 x2););/等待,直到发送状态就绪等待,直到发送状态就绪 Delay(10););WrUTXH0(data););.接收数据char Uart_GetKey(void)if(whichUart0)if(rUTRSTAT00 x1)/UART0接收到数据接收到数据 return RdURXH0()();else return 0;主函数void Main(void)Target_Init();/*初始化串口初始化串口*/Uart_Init(0,115200);/*开始回环测试开始回环测试*/while(1)unsigned char ch;ch=Uart_GetKey();Uart_SendByte(ch);if(ch=0 x0d)Uart_SendByte(0 x0a);结束结束