基于arm的嵌入式系统开发5

上传人:今*** 文档编号:106972078 上传时间:2019-10-17 格式:PPT 页数:34 大小:555.50KB
返回 下载 相关 举报
基于arm的嵌入式系统开发5_第1页
第1页 / 共34页
基于arm的嵌入式系统开发5_第2页
第2页 / 共34页
基于arm的嵌入式系统开发5_第3页
第3页 / 共34页
基于arm的嵌入式系统开发5_第4页
第4页 / 共34页
基于arm的嵌入式系统开发5_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《基于arm的嵌入式系统开发5》由会员分享,可在线阅读,更多相关《基于arm的嵌入式系统开发5(34页珍藏版)》请在金锄头文库上搜索。

1、1,第五部分 软件设计-章 I/O接口电路,中断与定时器,2,第五部分 软件设计- I/O接口电路,什么是“中断”?,中断服务程序,发申请,中断服务程序,发申请,外 设,CPU,CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。 EG:吃饭时突然手机铃响,中断示意图,3,5.3 中断,第五部分 软件设计- I/O接口电路,STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“

2、亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。 1. 何为占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行抢断式优先响应,俗称中断嵌套。 2. 何为副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应; 在占先式优先级相同的情况下,如果有低副优先级中断正在执行,高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应非抢断式响应(不能嵌套)。 3. 判断中断是否会被响应的依据 首先是占先式优先级,其次是副优先级; 占先式优先级决定是否会有中断嵌套;,4,第五部分

3、软件设计- I/O接口电路,4. 优先级冲突的处理 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断的嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。,5,第五部分 软件设计- I/O接口电路,5. stm32中对中断优先级的

4、定义 STM32中指定中断优先级的寄存器位有4位,这4个寄存器位的分组方式如下: 第0组:所有4位用于指定响应优先级 第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级 第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级 第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级 第4组:所有4位用于指定抢占式优先级,具体怎样设置在例程中详细讲解!,6,第五部分 软件设计- I/O接口电路,STM32单片机80个通用I/O端口连接到19个外部中断/事件源上。左图为STM32单片机通用I/O与外部中断的映射关系:PAx、PBx 、PCx 、PDx和PEx端口对应

5、的是同一个外部中断/事件源EXTIx(x:0-15)。,EXTI_Line值 NVIC_IRQChannel值,7,第五部分 软件设计- I/O接口电路,例:实现按键K1触发中断,LED灯B1状态反转。,8,第五部分 软件设计- I/O接口电路,void GPIO_Configuration(void) /输入输出管脚配置 GPIO_InitTypeDef GPIO_InitStructure; /配置输出脚PC0控制LED灯 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed

6、_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, ,1步,9,第五部分 软件设计- I/O接口电路,void NVIC_Configuration(void) /嵌套向量中断控制器配置 NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /选择优先级组别 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; /选择中断通道:EXTI线0中

7、断,因为按键连接的是PA0脚 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /0级抢占式优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /0级副优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /使能引脚作为中断源 NVIC_Init( /调用NVIC_Init固件库函数进行设置 ,2步,10,第五部分 软件设计- I/O接口电路,void EXTI_Configuration(void) /调用固件库中的GP

8、IO_EXTILineConfig函数, /其中两个参数分别是中断口和中断口对应的引脚号 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; /将中断映射到中断/事件源Line0 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; /中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling /设置为下降沿中断 EXTI_InitS

9、tructure.EXTI_LineCmd = ENABLE; /中断使能,即开中断 EXTI_Init( /调用EXTI_Init固件库函数,将结构体写入EXTI相关寄存器中 ,3步,11,第五部分 软件设计- I/O接口电路,void EXTI0_IRQHandler(void) if(EXTI_GetITStatus(EXTI_Line0) != RESET) /将LED1的状态反转 GPIO_WriteBit(GPIOC, GPIO_Pin_0, (BitAction)(1- GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_0); /清中断 EXTI_Cl

10、earITPendingBit(EXTI_Line0); ,注意:中断服务函数都包含在“stm32f10x_it.c”文件中, 用的时候只需添加指令即可!,4步,12,第五部分 软件设计- I/O接口电路,下载完程序后,按按键K1触发中断,LED灯B1状态反转。实际操作:修改程序,使中断通过按键K3触发,同时4个LED灯状态反转?,13,第五部分 软件设计- I/O接口电路,定时器,14,第五部分 软件设计- I/O接口电路,由此我们知道对于一个定时器而言要做到精确定时需要关注2个内容 1.分频器(分频比) 2.定时计数器的值,15,第五部分 软件设计- I/O接口电路,按功能划分 2个高级控

11、制定时器 TIM1 TIM8 可分配6个通道的三相PWM发生器(多用于电机控制) 4个普通定时器 TIM2 TIM3 TIM4 TIM5 每个定时器有4个输入捕获/输出比较/PWM/脉冲计数,16,第五部分 软件设计- I/O接口电路, 2个基本定时器 TIM6 TIM7 主要用于产生DAC触发信号 2个看门狗定时器 独立看门狗 窗口看门狗 系统时基定时器 SysTick 24位递减计数器 自动重加载 常用于产生延时 us级 ms级,17,第五部分 软件设计- I/O接口电路,CK_CNT 表示定时器工作频率 TIMx_PSC 表示分频系数 则定时器的工作频率计算公式为 CK_CNT=定时器时

12、钟/ (TIMx_PSC +1) 由此我们可得到STM32单片机1个时钟周期为: T=1/ CK_CNT,18,第五部分 软件设计- I/O接口电路,例如普通定时器模块的时钟为72MHz,分频比位7199,那么我们想要得到一个1秒钟的定时,定时计数器的值需要设定为 TIMx_ARR = 10 000 因为72 000 000 / 7200 = 10KHz 时钟周期T=1/10KHz=100us 100us 10 000 = 1S 结论 :分频比7199 定时计数器的值 10 000,19,第五部分 软件设计- I/O接口电路,寄存器操作编程,void Timer3_Init(u16 arr,u

13、16 psc) RCC-APB1ENR |= 1 ARR = arr;/设置重装载值 TIM3-PSC = psc;/设置分频系数 TIM3-DIER |= 1 DIER |= 1 CR1 |= 1 0; MY_NVIC_Init(3,3,TIM3_IRQChannel,2); ,20,第五部分 软件设计- I/O接口电路,STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick。主要讲普通定时器定时器。,TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时

14、钟由APB1输出产生。,21,第五部分 软件设计- I/O接口电路,时钟来源 计数器时钟可以由下列时钟源提供: 内部时钟(CK_INT) 外部时钟模式1:外部输入脚(TIx) 外部时钟模式2:外部触发输入(ETR) 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。 由于今天的学习是最基本的定时功能,所以采用内部时钟。TIM2-TIM5的时钟不是直接来自于APB1,而是来自于输入为APB1的一个倍频器。这个倍频器的作用是:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频

15、率;当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作用,定时器的时钟频率等于APB1的频率的2倍。通过倍频器给定时器时钟的好处是:APB1不但要给TIM2-TIM5提供时钟,还要为其他的外设提供时钟;设置这个倍频器可以保证在其他外设使用较低时钟频率时,TIM2-TIM5仍然可以得到较高的时钟频率。,22,第五部分 软件设计- I/O接口电路,计数器模式 TIM2-TIM5可以由向上计数、向下计数、向上向下双向计数。向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。在向下模式中,计数器从自

16、动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。而中央对齐模式(向上/向下计数)是计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。,23,第五部分 软件设计- I/O接口电路,void GPIO_Config(void) GPIO_InitTypeDef GPIO_InitStructure; /定义固件函数库中已经定义好的数据结构的变量 /变量类型:GPIO_InitTypeDef、变量名 :GPIO_InitStructure /使能各端口时钟,和利用端口AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_ GPIOC|RCC_APB

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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