




已阅读5页,还剩134页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录,1、S3C6410 按键中断方式GPIO驱动LED灯实例2、实时钟RTC3、ARM开发环境4、TIMER部件,1、GPIO端口编程的应用举例,1、S3C6410 按键中断方式GPIO驱动LED灯实例,初始状态效果,按下key1,LED3实现亮和灭状态之间的转换;,拟通过中断的方式实现,key2按下,4个LED灯全部亮起,初始状态4个LED灯熄灭。,GPM0,GPM1,GPM2,GPM3,key1 , key2, key3, key4, key5,key6,LED_1LED_4分别与GPM0GPM3相连通过GPB5GPB8引脚的高低电平来控制发光二极管的亮与灭。1、当这几个引脚输出高电平的时候发光二极管熄灭;2、当这几个引脚输出低电平的时候发光二极管点亮。,2、电路连接:,对于所有寄存器及6410中断的#define定义,通常写s3c6410_system.h文件:C语言编程时直接使用#include s3c6410_system.h,文件即可。,3.在Main.c文件中实现C语言的Main函数,注意不是小写main;,#include s3c6410_system.h/初始化LEDvoid LED_Init(void)GPIOM-CON= 0x1111;GPIOM-DAT= 0x1f;/KEY外部中断服务函数,没有加消抖/LED3闪烁void _irq Isr_KeyInt(void)EINT0PEND = 1;/清除中断标志,清除中断key1;GPIOM-DAT = BIT1;/LED3闪烁,为中断响应语句;ClearInterrupt(INT_EINT0);/6410开发板0组中断清除;,初始化LED对应的引脚作为输出;,初始化LED对应的状态全部为熄灭;,/初始化外部按键key1对应引脚功能及中断key1对应中断初始化;void KEY_Init(void)GPION-CON = 2;/2=0b10,设置key1对应引脚功能处于外部中断EINT0CON0 = 0x2;/6410开发板0组中断源中015号中断的触发方式;EINT0PEND =1;/中断标志寄存器,告知CPU哪个中断发生;EINT0MASK /初始化按键外部key1中断while(1),外部中断编程 除INT_EINT0-INT_EINT4以外,全部中断是由S3C6410内部的模块触发的。称为内部中断 INT_EINT0-INT_EINT4是外部中断,是由CPU外的外设来触发的,它的触发哪一个中断取决外设联接哪一个GPIO中断脚。,弄清楚硬件连接,通过查看原理图,得到了这样的硬件连接KEYINT1-GPN0-EINT_G0_0KEYINT2-GPN1-EINT_G0_1KEYINT3-GPN2-EINT_G0_2KEYINT4-GPN3-EINT_G0_3KEYINT5-GPN4-EINT_G0_4KEYINT6-GPN5-EINT_G0_5,外部中断脚 S3C6410 分10组GPIO脚来充当外部中断脚 第0组,共28脚.GPN0-GPN15 (16脚),GPL8-GPL14(7脚),GPM0-GPM4 (5脚) 第1组,由GPA0-GPA7,共8个中断脚 第2组,由GPC0-GPC0,共8个中断脚 第8组,由GPP0-GPP14,共15个中断脚 第9组,由GPQ0-GPQ8,共9个中断脚,6410开发板127外部中断引脚。属于外部中断组0的27个中断占用了VIC里的4个中断号,分别是外部中断0-3,外部中断4-11,外部中断12-19,外部中断20-27。外部中断组1-9只占用了1个中断号。64个中断源号按硬件分组分成VIC0, VIC1两个组。 中断号为0-31是VIC0组 ;中断号为32-63是VIC1组。,外部中断引脚与中断源号对应关系图如下,外部中断号 第0组的第0脚到第3脚的设备将触INT_EINT0=0中断 第0组的第4-11脚将触发INT_EINT1=1中断 第0组的第12-19脚将触发INT_EINT2=32中断 第0组的第20-27脚将触发INT_EINT3=33中断 第1组-第9组所有设备只触发INT_EINT4=53中断,为了节约中断,不可能为每个外部管脚都分配一个中断号,所以就会把某几个外部中断给合并成一个中断号。例如,对于外部中断0-3,就合并成了一个中断号,INT_EINT0。当这4个中断有任意一个产生中断时,INT_EINT0会挂起,CPU就会知道产生了外部中断0-3中断,然后去执行中断处理,在中断服务程序中,为了知道具体是哪一个中断,还需要去查询寄存器以知道是哪一个中断产生。,我们可以看到,每一个组都是多个中断脚共享一个中断号的。其中第0组比较常用。占用了3个中断号。,不同的IO脚上多个设备产生同一个中断,软件如何知道是哪一个脚? 由External Interrupt Pending Register 来判断,第0组由EINT0PEND来判断。,EINT控制寄存器,中断屏蔽寄存器,中断挂载寄存器:EINT0CON0(配置外部中断015的触发方式)中断屏蔽寄存器EIN0MASK,可读可写,写1屏蔽中断,写0使能中断。此时,我们首先肯定要使能按键中断口;中断挂载寄存器EINT0PEND(027位的值代表外部中断引脚027是否发生,写1代表清除),EINTxPEND:外部中断组x的中断挂起寄存器。这个寄存器就是用来保存中断的状态的。当对应的中断产生时,对应的位为1。当中断处理完毕后,需要往对应对写入1进行清除。,EINTxMASK:外部中断组x的屏蔽寄存器。用来使能中断的。当要使用某个中断的时候,就需要让这个中断使能,就需要在这个寄存器中的对应位写入0,来打开中断。默认为中断都是屏蔽的。,随堂练习 拟通过中断的方式实现,key2按下,4个LED灯全部亮起,初始状态4个LED灯熄灭。,2、时钟概念,时钟为一个按一定电压幅度,一定时间间隔连续发出的脉冲信号在单位时间(如1秒)内产生的时钟脉冲个数称为时钟频率,2、时钟作用,时钟信号是时序逻辑的基础,它用于决定逻辑单元中得状态何时更新(逻辑单元间同步)CPU还依赖时钟同步其每一步操作,以顺序执行指令,时钟产生源,晶振全称为晶体振荡器 ,这种晶体有一个很重要的特性,如果给它导通它就会产生机械振荡 ,其振荡频率与他们的形状,材料,切割方向等密切相关 石英晶体化学性能非常稳定,热膨胀系数非常小,其振荡频率也非常稳定,由于控制几何尺寸可以做到很精密,其谐振频率也很准确 ,用于产生晶体振荡时钟而更复杂的系统时钟源则是由PLL(锁相环)合成器提供,PLL合成器需要一个外部晶体和一个能够对晶体的特定频率加倍或分频的集成锁相环电路,系统时钟分配,ARM核,高速模块AHB,低速模块APB,RTC概念,1、RTC功能: 实时时钟的缩写是RTC(Real_Time Clock)。RTC 是集成电路,通常称为时钟芯片,为系统提供日历时间(包括年、月、日、时、分、秒等) 要求在系统处于关机状态下RTC能正常工作(更新日历时间),必须使用后备电池供电,RTC概念,2、RTC应用: 现在很多电子产品都带RTC功能,如电子台历、手持数码产品(手机、电子词典、各种学习机、照相机、摄影机等)、家用电器(电视机、机顶、DVD等)。应用非常广泛。,RTC模块,1、RTC模块功能框图,输入时钟,节拍器,分频,日历时间,RTC模块,2、外部晶振输入时钟 通过外部晶振,提供32768Hz输入时钟 通过1/215分频后,得到1HZ(1次/1秒)的日历时钟,S3C6410 RTC模块,3、节拍器使用 通过TICNT时间计数,当计数值到达0时,产生INT_RTC_TIC中断 提示节拍产生。如果每秒1节拍,则可以在中断处理函数刷新秒针 相关寄存器 中断源,1、RTC控制寄存器(RTCCON),2、RTC节拍时间计数器(TICNT),说明:这个计数器的值在内部减少,用户不能在工作时读取这个计数器的值。,RTC 节拍时间用于中断请求。TICNT 寄存器具有一个中断使能位,同时其中的计数值用于中断。当计数值到达0 时,节拍时间中断就会触发。中断的间隔时间计算如下:Period=(n+1)/128 秒 n : 节拍时间计数值(1127),随堂练习,若以S3c2440芯片为核心的嵌入式系统中,使用节拍中断,每1秒中断一次,需要RTC部件产生1S的定时信号,那么,写入时间片计数器TICNT中的参数应该是。,11、当前时间秒数寄存器(BCDSEC),12、当前时间分钟寄存器(BCDMIN),13、当前时间小时数寄存器(BCDHOUR),随堂练习,1、RTC部件中的日期和时间值的寄存器、数据的存储格式可以采用合并的BCD码。若时间值为12 时,用合并BCD码存储在“时寄存器”中,其赋值语句应该是()。A.rBCDHOUR=0x12B.rBCDHOUR=12C.rBCDHOUR=0x0cD.rBCDHOUR=0b00001100,14、当前日期天数寄存器(BCDDATE),15、当前星期寄存器(BCDDAY),1:星期日;2:星期一;3:星期二;4:星期三;5:星期四;6:星期五;7:星期六,16、当前日期月数寄存器(BCDMON),17、当前日期年数寄存器(BCDYEAR),说明:年数的千位和百位应该是20,由于年数据寄存器所表述的年数据的BCD码值的范围为0099;所以在实际编程时,我们要进行如下的判断;if (rBCDYEAR = 0x99) year = 0x1999;else year = 0x2000 + rBCDYEAR;,四、S3C2440 RTC使用方法1、读/写寄存器(1)设置允许读写:对寄存器RTCCON 的0 位写1 。(2)显示时间、日期方法:需要不断地从BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON、和BCDYEAR 寄存器读取数据,然后显示出来。,(3)可能会引起显示错误。例如,假设用户在2006 年12 月31 日23 点59 分59秒读取寄存器BCDYEAR 到BCDSEC,在用户读取BCDSEC 寄存器时,如果结果是0,那么很有可能年、月、日、时、分已经变成了2007 年1 月1 日0 时0 分了,数据组合在一起可能是错的。读取的数据可能是:1) 2006 年12 月1 日0 时0分2) 2006 年1 月1 日0 时0 分,等解决的方法:当读取到的BCDSEC 等于0 时,用户应该再读取一次BCDYEAR到BCDSEC 的值。,2、节拍中断RTC 节拍用于中断请求。TICNT 寄存器:有中断使能位、节拍时间位。当节拍计数值到达0 时,就会触发节拍中断。节拍中断的间隔时间计算如下:Period=(n+1)/128 秒n :节拍时间计数值(1127)说明:RTC 节拍中断可以作为RTOS(实时操作系统)内核的时间节拍。,五、应用举例,不使用节拍中断,每秒读取RTC的时钟,实时显示在串口上必须考虑出现当读取到的BCDSEC 等于0 时,可能出现的读取错误实验现象:FS2410P RTC TestRTC TIME : 2005/03/06 TUES - 17:34:28RTC TIME : 2005/03/06 TUES - 17:34:28RTC TIME : 2005/03/06 TUES - 17:34:29,Rtc_Init()实时时钟初始化函数功能说明:初始化相关时钟寄存器,设置当前时钟主要代码如下:/*void Rtc_Init(void)rRTCCON = 0x01; /RTC 读写使能,选择BCD 时钟、计数 器,无复位,1/32768rBCDYEAR = 0x05 ; /设定年rBCDMON = 0x3 ; /设定月rBCDDAY = 0x06 ; /设定日rBCDDATE = 0x3 ; /设定星期rBCDHOUR = 0x17 ; /设定小时rBCDMIN = 0x34 ; /设定分钟rBCDSEC = 0x28 ; /设定秒rRTCCON = 0x0; /RTC 读写禁止,选择BCD 时钟、计数器,无复位,1/32768,Display_Rtc()实时时钟显示函数功能说明:该函数主要是通过串口在超级终端上实时显示当前时钟。主要功能代码如下:/*/void Display_Rtc(void)int year;int month,day,weekday,hour,min,sec;rRTCCON = 0x01; /RTC 读写使能,选择BCD 时钟、计数器,无复位,1/32768while(1)if (rBCDYEAR = 0x99) year = 0x1999;else year = 0x2000 + rBCDYEAR;month=rBCDMON;day=rBCDDAY;weekday=rBCDDATE;hour=rBCDHOUR;min=rBCDMIN;sec=rBCDSEC;,if(sec!=0) break;/若秒为0重新读取一遍,否则退出循环printf(RTC TIME : %4x/%02x/%02x %s %02x:%02x:%02xn,year,month,day,dateweekday,hour,min,sec);rRTCCON = 0x0; /RTC 读写禁止,选择BCD 时钟、计数器,无复位,1/32768,3、ARM开发环境(ARM芯片),ARM提供设计CPU所需的IP核(电路图、代码、文档等),处理核心逻辑运算(ALU)其他CPU生产商(如SAMSUNG)利用IP核技术生成出自己的CPU(如S3C6410)S3C6410除了ARM核,还加入自身的外围设备控制器(如实时钟、定时器、中断等),CPU/MCU/SOC,MCU(micro controller unit),俗称单片机SOC(system on a chip) ,系统级芯片SOC = CPU + 运算模块 + 控制模块 + 寄存模块 + 前端模拟A/D模块 + 功能十分强大,单一芯片集合多种功能模块 ARM核为CPU,而S3C6410为SOC(好比PC的主板:CPU+南北桥),6410开发板,采用Samsung S3C6410 为微处理器1. CPU 处理器Samsung S3C6410A,ARM11JZF-S核,运行主频533MHz,最高667Mhz2. SDRAM 内存在板128MB/256MB DDR RAM,32bit 数据总线,什么是RVDS,1、 RealView Developer Suite工具是ARM公司是推出的新一代ARM集成开发工具:支持ARM工程代码的编辑、编译、调试、运行2、我们重点集在这两个图形界面工具的使用:(1)、Code Warrior是一个集成界面提供代码编辑,目标代码编译,链接的一个图形GUI环境.(2)、AXD (ARM eXtended Debugger):提供在线仿真功能,RVDS交叉开发环境,RVDS创建源码工程,1、新建工程:在RVDS集成开发环境中,点 File-New,打开窗口,RVDS创建源码工程,2、选择ARM Executable Image,点击set选择源码工程目录,RVDS创建源码工程,3、输入工程名为“proj”,并确定,RVDS创建源码工程,4、右键点击在工程面板,弹出文件、组管理菜单,RVDS创建源码工程,5、为工程增加6410_driver组,RVDS创建源码工程,6、将源代码分别添加到6410_driver,RVDS创建源码工程,7、先择生产目标调试信息选项(1)Debug:为每一个源代码生成最完整的调试信息(2)Release:不会生成任何调试信息,RVDS配置源码工程,1、点击Edit 菜单,选择“DebugRelSetting”,进行项目配置,RVDS配置源码工程,2、Target Setting配置:Post-Linker选择ARM fromELF,表示在链接生成映象文件后,再调用fromELF命令将含有调试信息的 ELF格式的映象文件转换为其他格式的文件,RVDS配置源码工程,3、汇编器选项: RVDS汇编器是 armasm,体系结构选择ARM1176JZF-S,RVDS配置源码工程,4、编译器选项:RVDS编译器是armcc, 体系结构选择ARM1176JZF-S,RVDS配置源码工程,5、链接器选项:代码段入口地址设为0x50000000,RVDS配置源码工程,6、设置起始代码段:start.o的init段,RVDS配置源码工程,7、选择输出裸机程序bin文件,RVDS配置源码工程,8、清除已有编译目标,RVDS编译源码工程,1:编译工程,构造程序(F7),RVDS编译源码工程,2:proj工程目录内下生成6410.bin程序映像 一、将6410.bin通过tftp下载到开发板0x50000000地址, go 50000000运行 二、实验中我们采用的是另外一种方法,AXD1.3.1软件在线仿真加载AXF映像文件。,RVDS在线调试,RVDS上集成的ADX在线调试功能需要用到JLINK仿真器,通过JTAG接口与CPU连接实现硬件仿真:在线调试在以后课程中介绍,C语言驱动硬件,1、寄存器定义解析/GPK控制寄存器#define rGPKCON0(*(volatile unsigned long*)(0x7F008800)2、从上述定义中,请思考,如下问题为什么要用无符号长整型unsigned long的数字?volatile表示什么含意?宏定义的最前面*表示什么含意?,C语言驱动硬件,3、为什么要用无符号长整型unsigned long定义硬件寄存器地址硬件寄存器为32位最高位也是有效位而不是符号位,C语言驱动硬件,4、 volatile表示什么含意?volatile关键字是一种类型修饰符,用它声明的类型变量是易变的。表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。当要求使用volatile 声明的变量的值时,系统总是重新从它所在的内存(而不是通用寄存器)存取数据,即使它前面的指令刚刚从该处存取过数据。,C语言驱动硬件,5、宏定义的最前面*表示什么含意?表示指针指向地址(硬件寄存器)上的内容类似于 char *p= *p=A这是一个硬件寄存器常量地址可以取对应地址的内容 : data = rGPKCON0或者给这个地址赋值: rGPKCON0 = data,C语言驱动硬件,6、硬件寄存器操作 (1)、位清0最低位清0rGPKCON0 &= 0x1 ;/把最低位清0,其余位不变 第3位(最低位为第0位)清0rRTCCON &= (0x1 3); /把第3位清0,其余位不变第3-5 位清0rRTCCON &= (0x7 3);/把第3-5位清0,其余位不变,C语言驱动硬件,6、硬件寄存器操作 (2)、位置1最低位置1rGPKCON0 |= 0x1 ;/把最低位置1,其余位不变 第3位(最低位为第0位)置1rRTCCON |= (0x1 3); /把第3位置1,其余位不变第3-5 位置1rRTCCON |= (0x7 3);/把第3-5位置1,其余位不变,C语言驱动硬件,6、硬件寄存器操作 (3)、设置连续位值第3-5 设置为6rRTCCON &= (0x7 3);/先把第4-6位清0 rRTCCON |= (0x6 3);/再把第4-6位设置成相应值 注意:不能用rRTCCON = (0x6 3;/取第4-6位的值,单片机、嵌入式设备通常需要精确的控制机械或电器运转时间 如家用电器,如洗衣机电扇等可按规定的时间使其启动停止 要实现精确时间控制功能,需要利用系统提供的定时器模块 定时器的前提是时钟和中断,达到指定的时 钟时间,通过中断唤醒定时任务,4、什么是定时器,定时器: 对一固定系统频率进行计数,根据计数数值与系统频率计算得到经过的时间S3C2440有5个16位的定时器定时器03具有PWM(脉宽调制)功能 它们都有一个输出引脚,可以通过定时器来控制引脚周期性的高低变化(即占空比不同的PWM波)定时器4是内部定时器,没有输出引脚,供内部使用,84,85,二、结构与工作原理,(1)时钟控制: 有2个8位预分频器和2个4位分频器 定时器部件的时钟源为PCLK,通过一个8位预分频器和一个4位分频器降频使用定时器0、1分享同一个8位的预分频器和分频器定时器2、3、4 分享另一个预分频器和分频器分频器有1/2、1/4、1/8、1/16这4种分频值,86,1)定时器输入时钟频率fTclk(即计数时钟频率) fTclk = fpclk(Prescaler+1) 分频值 Prescaler:预分频值,0-255; 分频值: 1/2、1/4、1/8、1/16装入初值、启动计数,计数结束产生中断请求,并且可以重装初值连续计数。,计数时钟和输出计算,87,2)PWM调制技术: 脉宽调制技术,即高电平持续时间所占信号周期的比例可以根据需要进行调整 PWM输出时钟频率 = fTclkTCNTBn PWM输出信号占空比 = TCMPBn TCNTBn,88,1、设置定时器时钟频率每个时钟周期,定时器减1定时器时钟频率为每秒钟定时器减少值2、设置定时器计数值定时器计数值和定时器时钟频率决定定时触发时间3、设置定时器中断处理函数定时发生,触发定时器中断,进入中断处理函数,定时器初始化,共有6种、17个寄存器,TCNTBn-Timern 计数初值寄存器(计数缓冲寄存器),16位TCMPBn-Timern 比较寄存器(比较缓冲寄存器),16位TCNTOn-Timern 计数读出寄存器,16位,定时器专用寄存器,91,Prescaler1-timer2、3、4的预分频值 其值N为: 0255 输出频率为:PCLK (N+1)Prescaler0- timer0、1的预分频值 其值N为: 0255 输出频率为:PCLK (N+1),1、TCFG0-预分频器配置寄存器,92,1、若某嵌入式系统中选用timer2作为定时信号的产生部件,所选择的预分频器的值为31,那么写入TCFG0寄存器中的参数是()A.0x00003100B.0x00000031C.0x00001f00D.0x0000001f,93,2、TCFG1-DMA模式与分频选择寄存器,MUX4 MUX0-timer4timer0分频值选择0000:1/20001:1/40010:1/8 0011:1/1601XX:选择外部TCLK0、1 可选择外部时钟为记数信号(对timer0、1是选TCLK0,对timer4、3、2是选TCLK1),94,定时器Timer3的分割器值有4种可选择的参数值,若要选择分割器值为1/16,那么在TCFG1寄存器中写入的参数值应该是()A.0x00000003B.0x00000030C.0x00000300D.0x00003000,95,96,当计数观察寄存器(TCNTOn)中的数值减为0时,将触发定时器中断,定时器0 计数缓存寄存器(TCNTB0)、比较缓冲寄存器(TCMPB0),定时器0计数观察寄存器(TCNTO0),1、设置TCMPBn、TCNTBn这两个寄存器,它们表示定时器n的比较值、初始计数值2、设置TCON寄存器启动定时器n,这时TCNTBn的值将被装入其内部寄存器TCNTn中,在定时器n的时钟频率下,TCNTn开设减1计数3、当TCNTn的值到达0时,触发定时器n的中断4、当TCNTOn的值到达0时,如果在TCON寄存器中将定时器n设置为“自动加载”,则TCNTBn寄存器的值被自动装入TCNTOn寄存器中,下一计数流程开始,定时器工作流程,自动重载功能,TCNTOn的值等于0的时候,自动重载操作把TCNTBn的值自动装入TCNTOn只有当自动重载功能使能并且TCNTOn的值等于0的时候才会自动重载如果TCNTOn等于0,自动重载控制位为0,则定时器停止运行。,初值自动重装、手动装载和双缓冲初值自动重装功能: 5个定时器都具有此功能。当计数器中值减到0后,若设置了自动重装功能,则在下一计数周期开始前将初值装入计数器重新计数。初值手动装载功能:在启动计数前,必须使用手动装载功能将初值装入计数器,而初值自动重装仅是一次计数结束后重新装入初值。双缓冲功能:如果定时器正在工作,此时写入新的数据到TCNTBn、或者到TCMPBn,该写入的数据不影响本次定时器的操作。当定时器到达0后下一次运行定时器时,新写入的TCNTBn、或者TCMPBn才生效。,TL4TL0-计数初值自动重装控制位 0:单次计数 1:计数器值减到0时,自动重新装入初值连续计数TUP4TUP0-计数初值手动装载控制位 0:不操作 1:立即将TCNTBn中的计数初值装载到计数寄存器TCNTn中说明:如果没有执行手动装载初值,则计数器启动时无初值,3、TCON-定时器控制寄存器,102,TR4TR0-TIMER4TIMER0运行控制位0:停止1:启动对应的TIMERTO3TO0- TIMER4TIMER0输出控制位0:正相输出1:反相输出,3、TCON-定时器控制寄存器(续),103,若需要用timer0定时器产生一个周期性的定时信号,那么定时器控制寄存器TCON中的D3数据位应该被置为(),104,例:6410定时器timer0程序实现精确控制开发板,定时器部件的时钟源为PCLK(66MHZ)首先通过两个8位的预分频器降低频率,定时器0、1共用第一个预分频器,定时器2、3、4共用第二个预分频器预分频器的输出将进入第二级分频器,它们输出5种频率的时钟:1、2、4、8、16分频,或者外部时钟TCLK0/TCLK1每个定时器的工作时钟也可以从这5种频率中选择,S3c6410开发板PWM定时输入与输出,定时器输入时钟频率= PCLK/prescaler value+1/divider value prescaler value =1255, TCFG0配置 divider value =1、2、4、8、16,TCLK, TCFG1配置定时器配置寄存器0:TCFG0寄存器(0x7F006000),S3c6410时钟频率初始化,S3c6410TCFG1寄存器,S3c6410TCON寄存器,定时器0 计数缓存寄存器(TCNTB0)、比较缓冲寄存器(TCMPB0),定时器0计数观察寄存器(TCNTO0),#include s3c6410_system.h/初始化LED/PM0,PM1void LED_Init(void)GPIOM-CON= 0x1111; /初始化灯对应引脚功能;GPIOM-DAT= 0xf;/初始化灯对应状态为熄灭;,/定时器0中断服务函数void _irq Isr_Timer0(void)static u8 cnt;/计数,因为定时器溢出时间为50ms,要定时1S得记到20TINT_CSTAT |= BIT5;/清除中断标志cnt +;if(cnt = 20) /控制计数值,可以控制中断响应的时间,以实现精准控制。 GPIOM-DAT = 0x00; /LED灯对应每隔1S全亮cnt = 0;ClearInterrupt(INT_TIMER0);/中断结束,/定时器0初始化/功能:LED0灯1S钟闪烁一下void TIMER0_Init(void)TCFG0 = 65;/定时器0预分频65+1,由PCLK=66MHZ,提供时钟,66分频产生1MHz的定时器时钟 TCFG1 = 0000;/决定S3c6410定时器0对应的分割器的值为1,用于确定定时器0的输入时钟频率;TCON = BIT3; /定时器0自动更新使能TCNTB0 = 50000;/重装值,50MS,用于设置初始计数值。TINT_CSTAT |= BIT5; /清除中断标志TINT_CSTAT = 1;/使能定时器0中断Set_IsrAddr(INT_TIMER0,(u32)Isr_Timer0);/设置中断矢量入口Set_IntEnable(INT_TIMER0,Enable);/使能定时器0全局中断/以下操作启动定时器0TCON |= BIT1; /手动更新TCON /启动定时器0,并且设置自动装载功能,/主函数void main(void)LED_Init(); /初始化LEDTIMER0_Init(); /初始化定时while(1),1、GPIO端口编程的应用举例,1、S3C6410 按键中断方式GPIO驱动LED灯实例,初始状态效果,按下key1,LED3实现亮和灭状态之间的转换;,拟通过中断的方式实现:key2按下,LED2灯状态改变,初始状态4个LED灯熄灭;KEY5按下,LED3灯状态改变,初始状态4个LED灯熄灭。,GPM0,GPM1,GPM2,GPM3,key1 , key2, key3, key4, key5,key6,LED1,LED2,LED3,LED4,R1,R2,R3,R4,LED_1LED_4分别与GPM0GPM3相连通过GPB5GPB8引脚的高低电平来控制发光二极管的亮与灭。1、当这几个引脚输出高电平的时候发光二极管熄灭;2、当这几个引脚输出低电平的时候发光二极管点亮。,2、电路连接:,对于所有寄存器及6410中断的#define定义,通常写s3c6410_system.h文件:C语言编程时直接使用#include s3c6410_system.h,文件即可。,3.在Main.c文件中实现C语言的Main函数,注意不是小写main;,#include s3c6410_system.h/初始化LEDvoid LED_Init(void)GPIOM-CON= 0x1111;GPIOM-DAT= 0x1f;/KEY外部中断服务函数,没有加消抖/LED3闪烁void _irq Isr_KeyInt(void)EINT0PEND = 1;/清除中断标志,清除中断key1;GPIOM-DAT = BIT1;/LED2闪烁,为中断响应语句;ClearInterrupt(INT_EINT0);/6410开发板INT_EINT0中断号清除;,初始化LED对应的引脚作为输出;,初始化LED对应的状态全部为熄灭;,/初始化外部按键key1对应引脚功能及中断key1对应中断初始化;void KEY_Init(void)GPION-CON = 2;/2=0b10,设置key1对应引脚功能处于外部中断EINT0CON0 = 0x2;/6410开发板0组中断源对应引脚中015号外部中断的触发方式;EINT0PEND =1;/中断标志寄存器,告知CPU6410开发板INT_EINT0中断号对应的哪个引脚中断发生;EINT0MASK /初始化按键外部key1中断while(1),外部中断脚 S3C6410 分10组共127个GPIO脚引脚来充当外部中断脚 第0组,共28脚.GPN0-GPN15 (16脚),GPL8-GPL14(7脚),GPM0-GPM4 (5脚) 第1组,由GPA0-GPA7,共8个中断脚 第2组,由GPC0-GPC0,共8个中断脚 第8组,由GPP0-GPP14,共15个中断脚 第9组,由GPQ0-GPQ8,共9个中断脚,S3c6410开发板共有中断号64个64个中断源号按所属中断控制器分组分成VIC0, VIC1两个组,其中 中断号为0-31是VIC0组 ;中断号为32-63是VIC1组。,中断号的概念,外部中断编程 除INT_EINT0-INT_EINT4以外,全部中断是由S3C6410内部的模块触发的。称为内部中断 INT_EINT0-INT_EINT4是外部中断,是由CPU外的外设来触发的,它的触发哪一个中断取决外设联接哪一个GPIO中断脚。,外部中断号 第0组的第0脚到第3脚的设备将触INT_EINT0=0中断 第0组的第4-11脚将触发INT_EINT1=1中断 第0组的第12-19脚将触发INT_EINT2=32中断 第0组的第20-27脚将触发INT_EINT3=33中断 第1组-第9组所有设备只触发INT_EINT4=53中断,为了节约中断,不可能为每个外部管脚都分配一个中断号,所以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商标合规管理办法
- 啤酒终端管理办法
- 噪声管理办法夜间
- 因私免票管理办法
- 园区单位管理办法
- 园区车场管理办法
- 国企网银管理办法
- 国库凭证管理办法
- 2025至2030飞机空调行业发展趋势分析与未来投资战略咨询研究报告
- 2025至2030中国数据终端设备行业发展趋势分析与未来投资战略咨询研究报告
- GB/T 9009-2011工业用甲醛溶液
- 3C认证全套体系文件(手册+程序文件)
- GB 34914-2021净水机水效限定值及水效等级
- 护理管理学考试试题与答案
- 鱼类繁殖与发育课件
- 新外研版新教材高中英语选择性必修一全册课文及翻译(中英Word精编)
- GFG涂油机操作控制台用户手册翻译
- 虚云老和尚自述年谱
- 民法案例分析教程(第五版)完整版课件全套ppt教学教程最全电子教案
- FZ∕T 62044-2021 抗菌清洁巾
- 国家电网有限公司十八项电网重大反事故措施(修订版)
评论
0/150
提交评论