通用io接口2-戴敏

上传人:ji****en 文档编号:111823118 上传时间:2019-11-03 格式:PPT 页数:35 大小:1.20MB
返回 下载 相关 举报
通用io接口2-戴敏_第1页
第1页 / 共35页
通用io接口2-戴敏_第2页
第2页 / 共35页
通用io接口2-戴敏_第3页
第3页 / 共35页
通用io接口2-戴敏_第4页
第4页 / 共35页
通用io接口2-戴敏_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《通用io接口2-戴敏》由会员分享,可在线阅读,更多相关《通用io接口2-戴敏(35页珍藏版)》请在金锄头文库上搜索。

1、通用IO接口-2,本节要点,查询方式下的输入 按键消抖和矩阵键盘 中断的使用 中断方式下的输入,第一个工程:控制发光二极管指示灯闪烁,要求,根据前面课上讲解的知识,设计程序,实现E4灯闪烁。,#include “derivative.h“ void delay(void); /*/ int main(void) SIM_SCGC5 = SIM_SCGC5_PORTA_MASK;/打开A口时钟 ,值为0x200u PORTA_PCR10 |= (18); /将A口10号 引脚配置为GPIO口功能 GPIOA_PDDR= 110; /引脚配置为输出功能 while(1) GPIOA_PTOR|=1

2、10; /输出取反寄存器;灯闪烁 delay(); /延时 return 0; void delay() /延时程序 unsigned int i, n, m ; for(i=0;i30000;i+) for(n=0;n100;n+) m=m; ,第二个嵌入式C语言工程:对按键进行查询方式工作,启动/停止发光二极管闪烁,两个按键分别接PTA19,PTE26,当键按下,对应引脚输入低电平。输入、设置内部上拉电阻。,先画流程图,考虑好逻辑关系再编程。,第二个嵌入式C语言工程:对按键进行查询方式工作,启动/停止发光二极管闪烁,#include “derivative.h“ /KEY-PTA19,LE

3、D-PTA10 int main(void) SIM_SCGC5 = SIM_SCGC5_PORTA_MASK;/打开A口时钟 ,值为0x200u PORTA_PCR10 |= (18); /将A口10号 引脚配置为GPIO口功能 PORTA_PCR19 |= (18) | (11) |(10) ; /将A口19号 引脚配置为GPIO口功能,拉电阻有效,上拉 GPIOA_PDDR |= 110; /PTA10引脚配置为输出功能 GPIOA_PDDR ,#include “derivative.h“ /KEY-PTA19,LED-PTA10 int main(void) unsigned int

4、 key; /初始化代码 while(1) /add your code key = GPIOA_PDIR ,按键抖动,硬件电路消除抖动或软件消除抖动。,软件消除抖动,矩阵键盘,行0,行1,行2,行3,列3,列2,列1,列0,+Vcc,1).扫描法 列线输出,行线输入。 列线逐行输出0,某行有按键,行线输入有0,若无按键,行线输入全部为1。 2).反转法 行列线交换输入、输出,两步获取按键键号。,矩阵键盘,综合练习:,实验仪器上有两个按键、四个LED灯,请自己设计一个控制流程,希望把按键和LED都用上。 例如:荧光棒,多种亮灯模式,通过按键切换模式。 程序的功能说明和流程图, 请写在作业本上,

5、程序第2次 上机时调试。,中断,中断(Interrupt ) 因事件发生,程序中止正常的执行流程,转入到该事件的处理程序。 中断服务程序 (ISR, Interrupt service routine) 中断返回 事件处理完毕(ISR执行完毕)返回正常的流程。 与函数调用的区别 被动、硬件调用 断点是随机的、不可预知 与程序异步。,中断方式数据传输的优点,CPU与外设异步工作,无须大量的查询,高速CPU不需要等待慢速的外部设备; 编程时,程序仍分正常流程、中断服务程序ISR并可以分别编写,思路清晰; CPU的执行时,由事件驱动ISR的运行; 在控制应用中几乎没有不使用中断的;,K60芯片中断编

6、程,嵌套的向量中断控制器(NVIC)是Cortex内核不可分割的一部分,可对系统异常和外设中断进行控制。,在配置某个外围模块的中断功能时,除了需要设置此模块本身的寄存器中的中断使能位之外,还需要配置NVIC中对应的中断控制寄存器,系统才会响应此模块的中断请求。,第一部分:主程序中的中断处理流程 第二部分:中断服务程序的编写 第三部分:定义并声明中断服务程序,K60芯片中断编程,第一部分:主程序中的中断处理流程,1、配置中断屏蔽寄存器,设置系统关总中断; 2、开启外设模块并使能该外设模块中断; 3、配置NVIC模块中对应的中断控制寄存器; 4. 开总中断,1. 开关总中断/配置中断屏蔽寄存器,C

7、PSID I ;PRIMASK=1 ;关中断; asm(“CPSID I ”); CPSIE I ;PRIMASK=0 ;开中断; asm(“CPSIE I ”);,2.开启外设模块并使能该外设模块中断,引脚PTE26接按键,则需开启PortE时钟模块,在PCR中配置引脚复用功能及拉电阻,并配置中断。,PORTE_PCR26 |= (18) | 0b11 | (0xA16);,CortexM4支持大量异常/中断,包括11个系统异常(fault) ,240个外部中断(IRQ)。( IRQ 号等于中断类型号减去16),NVIC中的非优先级中断寄存器: NVICISERx: 中断使能设置寄存器 NV

8、ICICERx: 中断使能清除寄存器 NVICISPRx: 中断挂起设置寄存器 NVICICPRx: 中断挂起清除寄存器 NVICIABRx: 中断激活状态寄存器 (只读寄存器,用于判断某个中断是否处于激活状态) 其中x为0 - 7,称为寄存器的组号,表示每种寄存器都有8个。 这些寄存器都是32位的。每一位控制一个中断源,则可以分别控制256个中断源。 中断源位于寄存器组中的哪一个寄存器(组号)和该32位寄存器的哪一位(位号) 组号IRQ / 32; 位号IRQ % 32, 例如NVICICER221,它的组号就是2,位号就是21。,3.配置NVIC模块中对应的中断控制寄存器,IRQ号和中断类

9、型号的关系? IRQ号=中断类型号-16,中断向量表,3.配置NVIC模块中对应的中断控制寄存器,配置NVIC中的寄存器,以便使能一个外设的中断。 分两步: 1)置位NVICICPRx(中断挂起清除寄存器) 2)置位NVICISERx(中断使能设置寄存器),原因:在完成第二步开启并使能外设模块中断后,外设模块便可以被触发产生中断请求,这时如果置位NVICISERx,程序便可能进入中断服务程序,而这并非程序编写者的本意,因此,为了避免如此,先置位NVICICPRx,清除已经挂起的中断,然后置位,等待下一个中断的发生。,例: 使能PORTE对应的NVIC模块中对应的中断控制寄存器: NVICISE

10、R2 |= 127; /中断使能设置寄存器; NVICICPR2 |= 127; /中断挂起清除寄存器;,void enable_irq (int irq) /使能中断请求 switch (irq/32) case 0x0: NVICICPR0 |= 1 (irq%32); NVICISER0 |= 1 (irq%32); break; case 0x1: NVICICPR1 |= 1 (irq%32); NVICISER1 |= 1 (irq%32); break; case 0x2: NVICICPR2 |= 1 (irq%32); NVICISER2 |= 1 (irq%32); bre

11、ak; ,例: NVIC模块中对应的中断控制寄存器初始化,3.配置NVIC模块中对应的中断控制寄存器,若关闭一个外设的中断源,对NVIC的中断使能清除寄存器NVICICERx置位即可。,void disable_irq (int irq) /除能中断 switch (irq/32) case 0x0: NVICICER0 |= 1 (irq%32); break; case 0x1: NVICICER1 |= 1 (irq%32); break; case 0x2: NVICICER2 |= 1 (irq%32); break; ,优先级中断寄存器: NVICIPRx:用于设定每个中断源的优先

12、级,3.配置NVIC模块中对应的中断控制寄存器,第二部分:中断服务程序的编写,例:PortE-26引脚接按键,以外部中断方式工作,按键后,黄灯开始闪烁,再按则停止闪烁。,void porte_isr(void) disableinterrupts;/在进入中断服务函数后往往会关闭中断,执行完毕后再打开,这样就保证了该中断服务程序在运行时不会被其他中断源干扰 PORTE_ISFR=0xFFFFFFFF; /Clear Port E ISR flags清中断标志 flag_PTE26 = 1; /状态变量置位,在主循环中执行具体任务 /或者:GPIOA_PTOR = (128); 28号引脚取反,

13、黄色灯变亮或变暗; enableinterrupts; /开中断返回 ,void porte_isr(void); void init_gpio(void); void delay(void); int main (void) SIM_SCGC5 |=(19)|(113); DisableInterrupts; /* disable interrupts */ enable_irq(91); /GPIOE . IRQ# is 91 init_gpio(); / Initialize GPIO EnableInterrupts; ; /* enable interrupts */ while(1

14、) /add your code return 0; ,/函数声明 unsigned int flag_PTE26 = 0; int main (void) /*初始化 IO和中断 */ while(1) if(flag_PTE26) flag_PTE26 = 0; GPIOA_PTOR|=110;/状态寄存器取反 delay(); return 0; ,void init_gpio() /设置PTE26 (接 SW2)引脚为通用gpio功能, 中断下降沿触发,使能拉电阻,使能上拉电阻 PORTE_PCR26 |= (18) | 0b11 | (0xA16); PORTA_PCR10|=(18

15、); /设置 PTA10 为通用GPIO功能 GPIOA_PDDR|=(110); /将引脚PTA10配置为输出功能 GPIOA_PDOR|=(110); / 灯初始状态为熄灭 ,对于一个完整的中断程序代码,用户还需要: 1. 定义中断服务函数; 2.在Vector.h中声明自定义的中断服务函数,并修改对应中断向量表中中断服务函数的函数名,指定中断服务程序的入口地址。,第三部分:定义并声明中断服务程序,第三部分:定义并声明中断服务程序,1. 新建ISR.h定义中断服务函数;,第三部分:定义并声明中断服务程序,2.在Vector.h中声明自定义的中断服务函数,并修改对应中断向量表中中断服务函数的函数名,指定中断服务程序的入口地址。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 电子/通信 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号