




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章中断系统STM32微控制器原理及应用主要内容5.1基本概念5.2中断源5.3中断优先级5.4STM32中断寄存器5.5STM32中断库函数5.6NVIC库函数5.7中断应用举例5.1基本概念中断是指由于内部或者外部事件使CPU暂停当前程序,转去执行中断服务程序的一种工作机制。中断系统由中断源、中断控制、中断响应几部分组成。中断源:中断请求的来源。中断控制:中断的允许/禁止,中断优先级与优先级嵌套。中断响应:保护断点,转去执行中断服务程序。5.2中断源ARMcortex_m3内核支持256个中断(16个内核+240外部)和可编程256级中断优先级的设置,与其相关的中断控制和中断优先级控制寄存器(NVIC、SYSTICK等)也都属于cortex_m3内核的部分。STM32采用了cortex_m3内核,但STM32并没有使用cortex_m3内核全部的东西(如内存保护单元MPU等),因此它的NVIC是cortex_m3内核的NVIC的子集。
STM32目前支持的中断共为84个(16个内核+68个外部),和16级(使用了4位中断优先级控制)可编程中断优先级的设置。异常和中断的概念中断:该请求信号来自CM3内核的外面,来自各种片上外设和外扩的外设。异常:是因CM3内核的活动产生的,即执行指令或访问存储器时产生。CM3有15个异常,类型号为1~15,没有编号为0的异常。挂起:一个发生的异常不能被立即响应,就称它为挂起。对于互联型产品,外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成,对于其它产品,则有19个能产生事件/中断请求的边沿检测器。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。外部中断(EXTI)外部中断/事件控制器(EXTI)有19个中断请求边沿检测器。每个中断/事件都有独立的触发和屏蔽每个中断线都有专用的状态位EXTI0---EXTI15:连到IO端口,每个EXTIj对应GPIOx的引脚j。通过软件配置,设定中断来自哪个引脚。EXTI16:PVD(programmablevoltagedetector)输出EXTI17:RTC(real-timeclock)闹钟事件EXTI18:USB唤醒事件EXTI19:连接到以太网唤醒事件(只适用于互联型产品)硬件中断选择通过下面的过程来配置20个线路做为中断源:配置19个中断线的屏蔽位(EXTI_IMR)配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得19个中断线中的请求可以被正确地响应。要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。如果需要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在事件屏蔽寄存器的相应位写’1’允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置’1’。通过在软件中断/事件寄存器写’1’,也可以通过软件产生中断/事件请求。EXTICR:外部中断线路0-15配置寄存器有4个32位的外部中断线路配置寄存器,高16位保留,低16位用来定义外部中断线路。EXTICR:外部中断线路0-15配置寄存器EXTIx[3:0]:EXTIx配置(x=0…3)(EXTIxconfiguration)这些位可由软件读写,用于选择EXTIx外部中断的输入源。0000:PA[x]引脚0001:PB[x]引脚0010:PC[x]引脚0011:PD[x]引脚0100:PE[x]引脚0101:PF[x]引脚0110:PG[x]引脚配置中断线路函数GPIO_EXTILineConfig功能描述:选择GPIO管脚用作外部中断线路函数原形:
voidGPIO_EXTILineConfig(u8GPIO_PortSource,u8GPIO_PinSource)输入参数1:
GPIO_PortSource----选择用作外部中断线源的GPIO端口输入参数2:
GPIO_PinSource----待设置的外部中断线路例:/*SelectsPB.8asEXTILine8*/
GPIO_EXTILineConfig(GPIO_PortSource_GPIOB,GPIO_PinSource8);112通用I/O端口以下图的方式连接到16个外部中断/事件线上:外部中断的触发方式上升沿、下降沿、上升沿/下降沿EXTI_Trigger_Falling:设置输入线路下降沿为中断请求EXTI_Trigger_Rising:设置输入线路上升沿为中断请求EXTI_Trigger_Rising_Falling:设置输入线路双边触发中断请求EXTI_Mode_Event:设置EXTI线路为事件EXTI_Mode_Interrupt:设置EXTI线路为中断请求EXTI_LineCmd:用来定义选中线路的新状态。它可以被设为ENABLE或者DISABLE。中断初始化函数EXTI_Init例:/*Enablesexternallines12and14interruptgenerationonfallingedge*/
EXTI_InitTypeDefEXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line12|EXTI_Line14;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);
5.3中断优先级NVIC中断优先级分组:STM32有5种优先级管理方式,在一个系统中,选用其中一种。通过设置32位寄存器AIRC的[10:8]位,指定组别。优先级分组:第0组:16个从优先级第1组:2个抢占优先级,8个从优先级第2组:4个抢占优先级,4个从优先级第3组:8个抢占优先级,2个从优先级第4组:16个抢占优先级对于某一个中断来说,可以单独的设置其抢占优先级和从优先级5.3中断优先级NVIC优先级控制说明具有较高抢占优先级的中断可以实现中断嵌套。从优先级不管高低,只能排队。在抢占优先级相同时,先响应从优先级高的中断。抢占优先级和从优先级都相同时,根据它们在中断表中的排位顺序决定,序号小的先被处理。5.4STM32中断寄存器EXTI_IMR:中断屏蔽寄存器
0:屏蔽来自线x上的中断请求;1:开放来自线x上的中断请求。EXTI_EMR:事件屏蔽寄存器
0:屏蔽来自线x上的事件请求;1:开放来自线x上的事件请求。EXTI_RTSR:上升沿触发选择寄存器
1:允许输入线x上的上升沿触发(中断和事件);0:禁止。EXTI_FTSR:下降沿触发选择寄存器
1:允许输入线x上的下降沿触发(中断和事件);0:禁止。EXTI_SWIER:软件中断事件寄存器
当某位为’0’时,写’1’将设置EXTI_PR中相应的挂起位。如果在EXTI_IMR和EXTI_EMR中允许产生该中断,则此时将产生一个中断。注:通过清除EXTI_PR的对应位(写入’1’),可以清除该位为’0’。
EXTI_PR:挂起寄存器当在外部中断线上发生了选择的边沿事件,该位被置’1’。在该位中写入’1’可以清除它,也可以通过改变边沿检测的极性清除。5.5EXTI库函数EXTI_DeInit:将外设EXTI寄存器重设为缺省值EXTI_Init:根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器。EXTI_StructInit:把EXTI_InitStruct中的每一个参数按缺省值填入。EXTI_GenerateSWInterrupt:产生一个软件中断。EXTI_GetFlagStatus:检查指定的EXTI线路标志位设置与否。EXTI_ClearFlag:清除EXTI线路挂起标志位。EXTI_GetITStatus:检查指定的EXTI线路触发请求发生与否。EXTI_ClearITPendingBit:清除EXTI线路挂起位函数EXTI_Init
功能描述:根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器。函数原形:
voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct)输入参数:
EXTI_InitStruct----指向结构EXTI_InitTypeDef的指针。EXTI_InitTypeDef定义于文件“stm32f10x_exti.h”:
typedefstruct{u32EXTI_Line;EXTIMode_TypeDefEXTI_Mode;EXTIrigger_TypeDefEXTI_Trigger;FunctionalStateEXTI_LineCmd;} EXTI_InitTypeDef;EXTI_Line:EXTI_Line0----EXTI_Line18,其中之一。EXTI_Mode:
EXTI_Mode_Event或者EXTI_Mode_InterruptEXTI_Trigger:
EXTI_Trigger_Falling或者EXTI_Trigger_Rising
或者EXTI_Trigger_Rising_FallingEXTI_LineCmd:ENABLE或者DISABLE例:/*Enablesexternallines12and14interruptgenerationonfallingedge*/EXTI_InitTypeDefEXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line12|EXTI_Line14;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);
函数EXTI_GetFlagStatus
功能描述:检查指定的EXTI线路标志位设置与否函数原形:
FlagStatusEXTI_GetFlagStatus(u32EXTI_Line)输入参数:EXTI_Line---待检查的EXTI线路标志位。返回值:EXTI_Line的新状态(SET或者RESET)例:/*GetthestatusofEXTIline8*/FlagStatusEXTIStatus;EXTIStatus=EXTI_GetFlagStatus(EXTI_Line8);固态函数库的编码规则布尔型typedefenum{FALSE=0,TRUE=!FALSE}bool;标志位状态类型typedefenum{RESET=0,SET=!RESET}FlagStatus;错误状态类型typedefenum{ERROR=0,SUCCESS=!ERROR}ErrorStatus;功能状态类型
typedefenum{DISABLE=0,ENABLE=!DISABLE}FunctionalState;函数EXTI_ClearFlag
功能描述:清除EXTI线路挂起标志位。函数原形:voidEXTI_ClearFlag(u32EXTI_Line)输入参数:EXTI_Line----待清除标志位的EXTI线路例:
/*CleartheEXTIline2pendingflag*/EXTI_ClearFlag(EXTI_Line2);函数EXTI_GetITStatus
功能描述:检查指定的EXTI线路触发请求发生与否。函数原形:
ITStatusEXTI_GetITStatus(u32EXTI_Line)返回值:EXTI_Line的新状态(SET或者RESET)例:/*GetthestatusofEXTIline8*/ITStatusEXTIStatus;EXTIStatus=EXTI_GetITStatus(EXTI_Line8);函数EXTI_ClearITPendingBit
功能描述:清除EXTI线路挂起位函数原形:
voidEXTI_ClearITPendingBit(u32EXTI_Line)例:/*ClearstheEXTIline2interruptpendingbit*/EXTI_ClearITpendingBit(EXTI_Line2);5.6NVIC库函数NVIC_DeInit:将外设NVIC寄存器重设为缺省值NVIC_PriorityGroupConfig:设置优先级分组NVIC_Init:根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器。NVIC_SetVectorTable:设置向量表的位置和偏移函数NVIC_PriorityGroupConfig功能:用来设置优先级分组(先占优先级和从优先级)函数原形:
voidNVIC_PriorityGroupConfig(u32NVIC_PriorityGroup)例:/*ConfigurethePriorityGroupingwith1bit*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_PriorityGroup描述函数NVIC_Init
功能描述:根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器。函数原形:
voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct)输入参数:
NVIC_InitStruct----指向结构NVIC_InitTypeDef的指针。NVIC_InitTypeDefstructure
NVIC_InitTypeDef定义于文件“stm32f10x_nvic.h”:
typedefstruct{u8NVIC_IRQChannel;u8NVIC_IRQChannelPreemptionPriority;u8NVIC_IRQChannelSubPriority;FunctionalStateNVIC_IRQChannelCmd;}NVIC_InitTypeDef;NVIC_IRQChannelCmd:指定了在成员NVIC_IRQChannel中定义的IRQ通道被使能还是失能NVIC_IRQChannel值EXTI0_IRQChannel:外部中断线0中断EXTI1_IRQChannel:外部中断线1中断EXTI2_IRQChannel:外部中断线2中断EXTI3_IRQChannel:外部中断线3中断EXTI4_IRQChannel:外部中断线4中断EXTI9_5_IRQChannel:外部中断线9-5中断EXTI15_10_IRQChannel:外部中断线15-10中断TIM2_IRQChannel:TIM2全局中断TIM3_IRQChannel:TIM3全局中断TIM4_IRQChannel:TIM4全局中断…………例:NVIC_InitTypeDefNVIC_InitStructure;/*ConfigurethePriorityGroupingwith1bit*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/*EnableTIM3globalinterruptwithPreemptionPriority0andSubPriorityas2*/NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure(&NVIC_InitStructure);
//EnableEXTI4interruptwithPreemptionPriority1andSubPriorityas7NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=7;NVIC_InitStructure(&NVIC_InitStructure);函数NVIC_StructInit
功能描述:把NVIC_InitStruct中的每一个参数按缺省值填入。
成员
缺省值NVIC_IRQChannel 0x0NVIC_IRQChannelPreemptionPriority 0NVIC_IRQChannelSubPriority 0NVIC_IRQChannelCmd DISABLE例:
NVIC_InitTypeDefNVIC_InitStructure;NVIC_StructInit(&NVIC_InitStructure);
关于中断初始化配置中断线GPIO_EXTILineConfig(GPIO_PortSource_GPIOB,GPIO_PinSource8);初始化中断触发方式EXTI_Init(&EXTI_InitStructure);
配置优先级分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
给中断通道配置中断优先级NVIC_InitStructure(&NVIC_InitStructure);5.7中断应用举例定义变量声明函数主程序:配置时钟配置GPIO配置EXTI配置中断优先级主循环4个LED循环点亮子函数(配置时钟、中断优先级、GPIO、EXTI等)中断服务函数设接口电路如下,编写按键中断程序,控制LED亮灭。#include"stm32f10x_.h" voidRCC_Configuration(void); voidGPIO_Configuration(void);voidNVIC_Configuration(void);voidEXTI_Configuration(void);voidDelay(vu32nTime);intmain() { RCC_Configuration(); /*配置系统时钟*/ NVIC_Configuration(); /*配置中断优先级*/ GPIO_Configuration(); /*IO口初始化*/ EXTI_Configuration(); /*配置外部中断*/
for(;;) { GPIOC->ODR=0xfffffffe; /*PC0=0-->点亮D2*/ Delay(8000000); GPIOC->ODR=0xfffffffd; /*PC1=0-->点亮D3*/ Delay(8000000); GPIOC->ODR=0xfffffffb; /*PC2=0-->点亮D4*/ Delay(8000000); GPIOC->ODR=0xfffffff7; /*PC3=0-->点亮D5*/ Delay(8000000); }}voidRCC_Configuration(){//系统时钟配置,同以前程序,略。
//使能外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);}voidDelay(vu32nCount) /*延时*/{for(;nCount!=0;nCount--);}voidEXTI_Configuration(){GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource3); EXTI_InitTypeDefEXTI_InitStructure; EXTI_InitStructure.EXTI_Line=EXTI_Line3; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure);}voidNVIC_Configuration(){ NVIC_InitTypeDefNVIC_InitStructure;
/*SettheVectorTablebaselocationat0x20000000*///设置向量表的位置和偏移
#ifdefVECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0); #else/*VECT_TAB_FLASHSettheVectorTablebaselocationat0x08000000*/ NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); #endif /*Configureonebitforpreemptionpriority*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure);}voidGPIO_Configuration() /*IO口初始化*/{ GPIO_InitTypeDefGPIO_InitStructure; /*PA0~PA3口配置为输入*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); /*PC0~PC3口配置为输出*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure);}中断服务程序
(注意:中断服务程序的函数名在固件库中都定义好了)voidEXTI3_IRQHandler(void){ inti=0; if(EXTI_GetITStatus(EXTI_Line3)!=RESET) { EXTI_ClearITPendingBit(EXTI_Line3); for(i=0;i<5;i++) { GPIOC->ODR=0xfffffff0; Delay(0x400000); GPIOC->ODR=0xffffffff; Delay(0x400000); } }}练习题5-1.什么是中断?5-2.中断有什么作用?5-3.什么是中断嵌套?5-4.中断系统包括哪几部分?5-5.STM32有多少个中断源?5-6.STM32的异常和中断有什么区别?5-7.外部中断EXTI有几个?5-8.GPIO引脚都可以作为中断输入端,映射到内部哪些中断通道?5-9.EXTI0对应的GPIO引脚是分别是什么?5-10.EXTI中断请求的触发方式有哪些?5-11.STM32中断优先级分哪两类?5-12.说明中断优先级的嵌套原则。5-13.GPIOA.0作为中断请求输入端,下降沿触发。voidEXTI_Configuration(){GPIO_EXTILineConfig((),()); EXTI_InitTypeDefEXTI_InitStructure; EXTI_InitStructure.EXTI_Line=(); EXTI_InitStructure.EXTI_Mode=(); EXTI_InitStructure.EXTI_Trigger=(); EXTI_InitStructure.EXTI_LineCmd=(); EXTI_Init(&EXTI_InitStructure);}5-14.设置GPIOA.0和GPIOA.1上拉输入。voidGPIO_Configuration(){GPIO_InitTypeDefGPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=(); GPIO_InitStructure.GPIO_Mode=(); GPIO_Init(GPIOA,&GPIO_InitStructure);}5-15.配置外部中断EXIT0抢占优先级为2级,副优先级为3级。voidNVIC_Configuration(){NVIC_InitTypeDefNVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_());NVIC_InitStructure.NVIC_IRQChannel=()_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=();NVIC_InitStructure.NVIC_IRQChannelSubPriority=();NVIC_InitStructure.NVIC_IRQChannelCmd=();NVIC_Init(&NVIC_InitStructure);}第6章定时器/计数器STM32微控制器原理及应用主要内容6.1STM32定时器概述6.2通用定时器TIMx相关寄存器6.3库函数6.4定时器应用举例6.5系统时钟SysTick简介6.6SysTick应用实例6.1STM32定时器概述名为TIMx的定时器有8个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。
APB2可以工作在72MHz下,而APB1最大是36MHz。定时器都是16位的。通用定时器4个:TIM2、TIM3、TIM4和TIM5。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。高级定时器2个:TIM1和TIM8。比通用定时器功能更强大,适用于更多场合。基本定时器2个:TIM6和TIM7。主要用于产生DAC触发信号,也可当做通用的16位时基计数器。通用TIMx
定时器主要功能(1)16位向上、向下、向上/向下自动装载计数器(2)16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值(3)4个独立通道:①输入捕获;②输出比较;③PWM生成(边缘或中间对齐模式);④单脉冲模式输出(4)使用外部信号控制定时器和定时器互连的同步电路。(5)如下事件发生时产生中断/DMA:更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发);触发事件(计数器启动、停止、初始化或者由内部/外部触发计数);输入捕获;输出比较;支持针对定位的增量(正交)编码器和霍尔传感器电路;触发输入作为外部时钟或者按周期的电流管理。TIMx功能描述时基单元可编程通用定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。计数器、自动装载寄存器和预分频器寄存器可以由软件读写,在计数器运行时仍可以读写。时基单元包含:●计数器寄存器(TIMx_CNT)●预分频器寄存器(TIMx_PSC)●自动装载寄存器(TIMx_ARR)预分频器预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。它是基于一个(在TIMx_PSC寄存器中的)16位寄存器控制的16位计数器。这个控制寄存器带有缓冲器,它能够在工作时被改变。新的预分频器参数在下一次更新事件到来时被采用。计数器模式16位向上、向下、向上/向下自动装载计数器向上计数模式向下计数模式中央对齐模式(向上/向下计数)时钟选择计数器时钟可由下列时钟源提供:●内部时钟(CK_INT)●外部时钟模式1:外部输入脚(TIx)●外部时钟模式2:外部触发输入(ETR)●内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,内部时钟:6.2通用定时器TIMx相关寄存器CR1:控制寄存器1CR2:控制寄存器2SMCR:从模式控制寄存器DIER:DMA/中断使能寄存器SR:状态寄存器EGR:事件产生寄存器CCMR1:捕获/比较模式寄存器1CCMR2:捕获/比较模式寄存器2CCER:捕获/比较使能寄存器CNT:计数器寄存器PSC:预分频寄存器APR:自动重装载寄存器CCR1:捕获/比较寄存器1CCR2:捕获/比较寄存器2CCR3:捕获/比较寄存器3CCR4:捕获/比较寄存器4DCR:DMA控制寄存器DMAR:连续模式的DMA地址寄存器控制寄存器1(TIMx_CR1)CEN:使能计数器。0:禁止计数器;1:使能计数器。DIR:方向(Direction)。0:计数器向上计数;1:计数器向下计数。CMS[1:0]:选择中央对齐模式(Center-alignedmodeselection)参见“STM32中文参考手册_V10.pdf”
从模式控制寄存器(TIMx_SMCR)SMS[2:0]:从模式选择(Slavemodeselection)000:关闭从模式,如果CEN=1,则预分频器直接由内部时钟驱动。DMA/中断使能寄存器(TIMx_DIER)位0(UIE):允许更新中断(Updateinterruptenable)。0:禁止更新中断;1:允许更新中断。状态寄存器(TIMx_SR)位0(UIF):更新中断标记(Updateinterruptflag)当产生更新事件时该位由硬件置’1’。它由软件清’0’。0:无更新事件产生;1:更新中断等待响应。当寄存器被更新时该位由硬件置’1’:−若TIMx_CR1寄存器的UDIS=0、URS=0,当TIMx_EGR寄存器的UG=1时产生更新事件(软件对计数器CNT重新初始化);−若TIMx_CR1寄存器的UDIS=0、URS=0,当计数器CNT被触发事件重初始化时产生更新事件。(参考同步控制寄存器的说明)6.3库函数TIM_DeInit
:将外设TIMx寄存器重设为缺省值。TIM_TimeBaseInit
:根据TIM_TimeBaseInitStruct
中指定的参数初始化TIMx的时间基数单位。TIM_TimeBaseStructInit
:把TIM_TimeBaseInitStruct
中的每一个参数按缺省值填入。TIM_Cmd
:使能或者失能TIMx外设。TIM_ITConfig
:使能或者失能指定的TIM中断。TIM_PrescalerConfig:设置TIMx预分频TIM_GetFlagStatus
:检查指定的TIM标志位设置与否TIM_ClearFlag
:清除TIMx的待处理标志位TIM_ClearITPendingBit:清除TIMx的中断待处理位函数TIM_TimeBaseInit
功能:根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位。函数原形:voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct)其中,TIMx:x可以是2,3或者4,来选择TIM外设。TIMTimeBase_InitStruct:指向结构TIM_TimeBaseInitTypeDef的指针,包含了TIMx时间基数单位的配置信息。TIM_TimeBaseInitTypeDefstructuretypedef
struct
{u16TIM_Period;/*TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值,0x0000和0xFFFF之间*/u16TIM_Prescaler;/*
TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值*/u8TIM_ClockDivision;/*
TIM_ClockDivision设置了时钟分割*/u16TIM_CounterMode;/*
TIM_CounterMode选择了计数器模式*/}TIM_TimeBaseInitTypeDef;TIM_ClockDivision描述 TIM_CKD_DIV1TDTS=Tck_tim TIM_CKD_DIV2TDTS=2Tck_tim TIM_CKD_DIV4TDTS=4Tck_timTDTS:数字滤波器使用的采样频率Tck_tim:定时器时钟频率暂时不涉及数字滤波器,这项先不考虑TIM_CounterMode描述TIM_CounterMode_UpTIM向上计数模式TIM_CounterMode_DownTIM向下计数模式TIM_CounterMode_CenterAligned1TIM中央对齐模式1计数模式TIM_CounterMode_CenterAligned2TIM中央对齐模式2计数模式TIM_CounterMode_CenterAligned3TIM中央对齐模式3计数模式例:TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period=0xFFFF;TIM_TimeBaseStructure.TIM_Prescaler=0xF;TIM_TimeBaseStructure.TIM_ClockDivision=0x0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);定时时间的计算定时时间=(Period+1)*(Prescaler+1)/TIMxCLK当Prescaler≠1时,TIMxCLK=72MHz当Prescaler=1时,TIMxCLK=36MHz函数TIM_Cmd功能描述:使能或者失能TIMx外设函数原形:voidTIM_Cmd(TIM_TypeDef*TIMx,FunctionalState
NewState)TIMx:x可以是2,3或者4,来选择TIM外设NewState:外设TIMx的新状态,ENABLE或者DISABLE例:/*EnablestheTIM2counter*/
TIM_Cmd(TIM2,ENABLE);函数TIM_ITConfig功能描述:使能或者失能指定的TIM中断函数原形:voidTIM_ITConfig(TIM_TypeDef*TIMx,u16TIM_IT,FunctionalStateNewState)TIMx:x可以是2,3或者4,来选择TIM外设TIM_IT:待使能或者失能的TIM中断源NewState:TIMx中断的新状态。ENABLE或者DISABLETIM_IT值:例:/*EnablestheTIM2CaptureComparechannel1Interruptsource*/
TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE);函数TIM_PrescalerConfig功能描述:设置TIMx预分频函数原形:voidTIM_PrescalerConfig(TIM_TypeDef*TIMx,u16Prescaler,u16TIM_PSCReloadMode)TIM_PSCReloadMode:预分频重载模式例:/*ConfigurestheTIM2newPrescalervalue*/u16TIMPrescaler=0xFF00;TIM_PrescalerConfig(TIM2,TIMPrescaler,
TIM_PSCReloadMode_Immediate);函数TIM_GetFlagStatus
功能描述:检查指定的TIM标志位设置与否函数原形:
FlagStatus
TIM_GetFlagStatus(TIM_TypeDef*TIMx,u16TIM_FLAG)
TIMx:x可以是2,3或者4,来选择TIM外设TIM_FLAG:待检查的TIM标志位返回值:TIM_FLAG的新状态(SET或者RESET)例:/*CheckiftheTIM2CaptureCompare1flagissetorreset*/if(TIM_GetFlagStatus(TIM2,TIM_FLAG_CC1)==SET){}
TIM_FLAG值:函数TIM_ClearFlag
功能描述:清除TIMx的待处理标志位函数原形:voidTIM_ClearFlag(TIM_TypeDef*TIMx,u32TIM_FLAG)TIMx:x可以是2,3或者4,来选择TIM外设TIM_FLAG:待清除的TIM标志位例:/*CleartheTIM2CaptureCompare1flag*/
TIM_ClearFlag(TIM2,TIM_FLAG_CC1);函数TIM_ClearITPendingBit功能描述:清除TIMx的中断待处理位函数原形:voidTIM_ClearITPendingBit(TIM_TypeDef*TIMx,u16TIM_IT)TIMx:x可以是2,3或者4,来选择TIM外设。TIM_IT:待检查的TIM中断待处理位。例:/*CleartheTIM2CaptureCompare1interruptpendingbit*/TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);6.4定时器应用举例设LED与STM32的接口电路如下,编写程序控制LED的亮灭时间。程序设计方法包含头文件声明函数声明变量主函数函数调用主循环程序段配置系统时钟、使能外设时钟子函数配置GPIO子函数配置NVIC子函数配置定时器子函数延时子函数中断服务子函数声明函数:#include"stm32f10x.h" voidDelay(vu32nCount);voidRCC_Configuration(void); voidGPIO_Configuration(void);voidNVIC_Configuration(void);voidTIM2_Configuration(void);主函数:intmain() { RCC_Configuration(); /*配置系统时钟*/ NVIC_Configuration(); /*配置NVIC*/ GPIO_Configuration(); /*配置GPIOIO口初始化*/ TIM2_Configuration(); /*配置TIM2定时器*/ GPIOC->ODR=0xffffffff;/*全灭*/ while(1);}使能外设时钟:voidRCC_Configuration(){{//初始化系统时钟(略)}//使能TIM2时钟和GPIOC时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);}//延时子函数:voidDelay(vu32nCount){for(;nCount!=0;nCount--);}配置GPIO的子函数:voidGPIO_Configuration()/*GPIO初始化,PC输出,PA输入*/{
GPIO_InitTypeDef
GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);}配置NVIC:voidNVIC_Configuration(){ NVIC_InitTypeDefNVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure);}配置TIM2子函数:voidTIM2_Configuration(){ TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period=35999; TIM_TimeBaseStructure.TIM_Prescaler=1999; TIM_TimeBaseStructure.TIM_ClockDivision=0x0; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);TIM_ClearFlag(TIM2,TIM_FLAG_Update);TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM_Cmd(TIM2,ENABLE); }中断服务子函数://中断服务程序一般写在stm32f10x_it.c文件中。voidTIM2_IRQHandler(void){ if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)==0) GPIO_SetBits(GPIOC,GPIO_Pin_3); else GPIO_ResetBits(GPIOC,GPIO_Pin_3); TIM_ClearFlag(TIM2,TIM_FLAG_Update); }6.5系统时基定时器SysTick简介stm32-M3有一个系统时基定时器,其为一个24位递减计数器。系统时基定时器设置初值并使能后,每经过一个系统时钟周期,计数器就减一,当计数器递减到0时,系统时基定时器自动重装载初值,并继续向下计数,同时内部的COUNTFLAG标志会置位,触发中断。系统时基定时器功能简单,只能提供一个时基定时器,作为滴答时钟。在外部晶振8MHZ,通过PLL9倍频,系统时钟为72MHz,系统时钟定时器的递减频率可以设为9MHz(HCLK/8),在这个条件下,把系统定时器的初值设置为90000,就能够产生10ms的时间基值。如果开启中断,则产生10ms的中断。时基定时器的中断并不需要清除中断位,系统会自动清除。SysTick寄存器结构typedefstruct{vu32CTRL; //SysTick控制和状态寄存器vu32LOAD; //SysTick重装载值寄存器vu32VAL; //SysTick当前值寄存器vuc32CALIB; //SysTick校准值寄存器}SysTick_TypeDef;SysTick库函数SysTick_CLKSourceConfig:设置SysTick时钟源SysTick_SetReload:设置SysTick重装载值SysTick_CounterCmd:使能或者失能SysTick计数器SysTick_ITConfig:使能或者失能SysTick中断SysTick_GetCounter:获取SysTick计数器的值SysTick_GetFlagStatus:检查指定的SysTick标志位设置与否函数SysTick_CLKSourceConfig
功能描述:设置SysTick时钟源函数原形:voidSysTick_CLKSourceConfig(u32SysTick_CLKSource)SysTick_CLKSource:SysTick时钟源SysTick_CLKSource值:例:/*AHBclockselectedasSysTickclocksource*/SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);函数SysTick_SetReload
功能描述:设置SysTick重装载值函数原形:voidSysTick_SetReload(u32Reload)Reload:重装载值,该参数取值必须在1和0x00FFFFFF之间例:/*SetSysTickreloadvalueto0xFFFF*/
SysTick_SetReload(0xFFFF);函数SysTick_CounterCmd
功能描述:使能或者失能SysTick计数器函数原形:voidSysTick_CounterCmd(u32SysTick_Counter)SysTick_Counter:SysTick计数器新状态SysTick_Counter值:例:/*EnableSysTickcounter*/SysTick_CounterCmd(SysTick_Counter_Enable);函数SysTick_ITConfig
功能描述:使能或者失能SysTick中断函数原形:voidSysTick_ITConfig(FunctionalState
NewState)NewState:SysTick中断的新状态,取ENABLE或者DISABLE例:/*EnableSysTickinterrupt*/
SysTick_ITConfig(ENABLE);
函数SysTick_GetCounter
功能描述:获取SysTick计数器的值函数原形:u32SysTick_GetCounter(void)返回值:SysTick计数器的值例:/*GetSysTickcurrentcountervalue*/u32SysTickCurrentCounterValue;SysTickCurrentCounterValue=SysTick_GetCounter();函数SysTick_GetFlagStatus
功能描述:检查指定的SysTick标志位设置与否函数原形:FlagStatusSysTick_GetFlagStatus(u8SysTick_FLAG)SysTick_FLAG:待检查的SysTic标志位SysTick_FLAG值:例:/*TestiftheCountflagissetornot*/FlagStatusStatus;Status=SysTick_GetFlagStatus(SysTick_FLAG_COUNT);if(Status==RESET){...…}else{...…}下面的程序段,让LED灯1s跳变一次。void
SysTick_Configuration(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);SysTick->LOAD=900000;//100msSysTick->CTRL=0x03;//开中断、启动计数
}
void
SysTick_Handler(void)
{
num++;
if(num
==
100)
{
num
=
0;
//计数器清0
LED
();//LED跳变函数,略。}
}
定时器控制数码显示intmain(){SystemInit();Timer_Config();NVIC_Config();While(1) {segshow();//在数码管上显示数据 }}voidsegshow(void)voidTIM2_IRQHandler(void)。。。练习题6-1.简述STM32F103定时器的种类,各有什么特点?6-2.名为TIMx的定时器有几个?定时器TIMx都是多少位的?6-3.通用定时器有几个?挂在哪个总线上?该总线的最高工作频率是多少?6-4.高级定时器有几个?挂在哪个总线上?该总线的最高工作频率是多少?6-5.当预分频系数等于和不等于1时,TIMxCLK的频率分别是多少?6-6.定时时间跟预分频系数和计数周期值的关系是什么?6-7.用定时器2实现定时1秒,填写下列程序段的空白处。voidTIM2_Configuration(){ TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period=(19999); TIM_TimeBaseStructure.TIM_Prescaler=3600-1; TIM_TimeBaseStructure.TIM_ClockDivision=0x0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode(); TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);TIM_ClearFlag(TIM2,());//清除更新标志
TIM_ITConfig(TIM2,(),());//开中断 TIM_Cmd(TIM2,());//使能定时器2 }练习题6-8.简述输入捕获、输出比较的作用。6-9.系统滴答时钟是多少位的定时器?有什么作用?6-10.若系统时钟频率为72MHz,那么SysTick的最长定时时间是多少?6-11.系统滴答时钟的时钟源分别是什么?6-12.操作系统为什么需要硬件定时器?STM32的哪个定时器可作为该硬件定时器?6-13.简述实时时钟RTC的功能、特点和用途。本章结束第7章USARTUniversalSynchronous&AsynchronousReceiverandTransmitterSTM32微控制器原理及应用STM32通用同步/异步收发器7.1串行通信相关概念7.2STM32的USART简介7.3STM32的通用串口结构7.4串口相关寄存器7.5库函数7.6应用举例7.1串行通信相关概念串行通信:串行通信是指在单根数据线上将数据一位一位地依次传送。发送过程中,每发送完一个数据,再发送第二个,依此类推。接受数据时,每次从单根数据线上一位一位地依次接受,再把它们拼成一个完整的数据。在远距离数据通信中,一般采用串行通信方式,它具有占用通信线少、成本低等优点。同步和异步通信方式同步串行通信方式是指在相同的数据传送速率下,发送端和接受端的通信频率保持严格同步。
由于不需要使用起始位和停止位,可以提高数据的传输速率,但发送器和接受器的成本较高。异步串行通信是指发送端和接受端在相同的波特率下不需要严格地同步,允许有相对的时间时延,即收、发两端的频率偏差在10%以内,就能保证正确实现通信。异步通信在不发送数据时,数据信号线上总是呈现高电平状态,称为空闲状态(又称MARK状态)。当有数据发送时,信号线变成低电平,并持续一位的时间,用于表示发送字符的开始,该位称为起始位(也称SPACE状态)。
起始位之后,在信号线上依次出现待发送的每一位字符数据,并且按照先低位后高位的顺序逐位发送。待发送的每个字符的位数可以在5、6、7或8位之间选择。数据位的后面可以加上一位奇偶校验位,也可以不加
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度智能家居销售总额提成及市场拓展合同
- 2025年巢湖b2货运上岗证模拟考试
- 在校实习生实习合同
- 2024年正规离婚协议
- 2025年遂宁年货运从业资格证考试题库
- 人力资源管理专业实习协议书
- 工程施工合同预付款担保
- 体育健身行业智能健身管理方案
- MRS8209-生命科学试剂-MCE
- EGFR-IN-136-生命科学试剂-MCE
- 分布式光伏发电并网与运维管理
- 现场签证流程图
- (新插图)人教版四年级下册数学 第2招 巧算24点 期末复习课件
- 驾驶员违规违章安全教育谈话记录表
- 2023年10月山东青岛开放大学招考聘用工作人员(第二批)笔试历年高频考点试题含答案带详解
- 《计算机应用基础 Win10+Office 2016》教案 模块一 计算机基础知识(二)
- 二手车交易行业行业网络安全与威胁防护
- 小儿抽动症中西医治疗
- 一年级下册《综合实践活动》全册教案【完整版】
- 人教版小学一年级英语课本上册课件
- 电子对抗原理与技术PPT完整全套教学课件
评论
0/150
提交评论