STM32各模块学习之中断

合集下载

stm32 usart idle中断原理

stm32 usart idle中断原理

stm32 usart idle中断原理STM32是一款广泛应用于嵌入式系统的微控制器,它具有丰富的外设资源,其中包括USART(Universal Synchronous/Asynchronous Receiver/Transmitter)模块。

USART模块是STM32的重要组成部分,它能够实现串行通信,其中的Idle中断是USART模块的一个重要功能。

本文将详细介绍STM32 USART模块的Idle中断原理。

我们先来了解一下USART模块的基本功能。

USART模块是一种通用的串行通信接口,它可以实现全双工通信,支持同步和异步两种通信模式。

在STM32中,USART模块通常用于与外部设备进行通信,如传感器、无线模块等。

USART模块具有多种工作模式,包括异步模式、同步模式和单线模式等。

在USART模块中,Idle中断是一种特殊的中断方式。

当USART接收到一帧数据后,如果在接收数据的过程中一段时间没有接收到新的数据,USART模块会认为这段时间是数据的结束,此时就会产生Idle中断。

Idle中断的产生可以作为接收完成的标志,可以在中断服务函数中进行相关的处理操作。

那么,Idle中断是如何实现的呢?在USART模块内部,有一个专门用于检测空闲状态的电路,该电路会监测串口接收线上的电平状态。

当串口接收线上的电平保持不变一段时间时,USART模块就会判断为接收到了一帧完整的数据。

这段时间就是我们所说的“空闲时间”。

当USART模块检测到空闲时间超过一定阈值时,就会产生Idle中断。

在STM32中,可以通过配置USART的相关寄存器来使能和配置Idle中断。

首先,我们需要使能USART的空闲检测功能,可以通过设置CR1寄存器中的IDLEIE位来实现。

然后,我们需要在NVIC 中使能USART的中断,可以通过设置ISER寄存器中对应的位来实现。

当USART接收到一帧数据后,如果在接收过程中超过了一定的空闲时间,USART模块就会产生Idle中断,此时会触发中断服务函数。

stm32空闲中断原理

stm32空闲中断原理

stm32空闲中断原理STM32空闲中断原理解析概述在STM32单片机的应用开发中,空闲中断是一种非常重要的中断方式。

它允许在系统空闲时执行特定的处理函数,提高了系统的效率和响应性。

本文将从浅入深,逐步解释STM32空闲中断的原理和应用。

什么是空闲中断空闲中断,即空闲时中断,在STM32中是指当处理器空闲且没有其他中断服务请求时触发的一种中断。

它是一种基于处理器空闲时间的中断方式,不需要外部触发或特定事件的发生。

空闲中断的原理STM32的空闲中断是通过处理器中的一个特殊寄存器实现的,该寄存器监测处理器的空闲状态。

当处理器处于空闲状态时,触发空闲中断,并执行用户定义的中断服务函数。

空闲中断的配置步骤1: 中断初始化在使用空闲中断之前,需要先进行中断的初始化。

这包括配置中断向量表、中断优先级和中断服务函数等。

步骤2: 编写中断服务函数中断服务函数是空闲中断触发时执行的代码。

它可以是一段自定义的C代码,用于处理特定的任务或操作。

步骤3: 启用空闲中断使用特定的寄存器配置,启用空闲中断功能。

在这里,需要将空闲中断使能位设置为”1”,使能处理器检测空闲状态。

空闲中断的应用场景空闲中断可以应用于多个领域和应用中,主要包括以下几个方面:- 数据处理:通过空闲中断处理数据,提高数据处理的效率。

- 状态检测:通过空闲中断检测特定的系统状态,如电量低、网络连接等。

- 系统维护:在系统空闲时执行一些系统维护任务,例如清理内存、更新数据等。

总结STM32的空闲中断为系统开发者提供了一种高效且灵活的中断方式,可以在处理器空闲时执行特定的任务。

本文简要介绍了空闲中断的原理和配置步骤,并给出了一些应用场景。

希望读者通过本文的介绍,对STM32空闲中断有更深入的了解,能够在实际开发中应用自如。

以上就是对STM32空闲中断原理的解析,希望对读者有所帮助。

stm32中断函数和回调函数

stm32中断函数和回调函数

STM32的中断函数和回调函数是两种不同的函数类型,它们在嵌入式系统中有着广泛的应用。

1. 中断函数:
中断函数通常用于处理实时事件或外部信号。

当某个事件发生时,中断控制器会打断正在执行的程序,跳转到中断处理函数中执行相应的操作。

在STM32中,中断处理函数通常被定义为ISR (Interrupt Service Routine)。

ISR应该尽可能地简短快速,避免在中断处理函数中进行复杂的计算或逻辑处理。

中断函数的定义通常如下:
```c
void ISR() interrupt 1 // 1表示中断号
{
// 中断处理代码
}
```
其中,`interrupt`后面的数字表示中断号,用于区分不同的中断。

2. 回调函数:
回调函数是一种通用的事件处理机制。

它通常用于将某个函数作为参数传递给另一个函数,当事件发生时,调用传递的函数进行相应的处理。

回调函数通常被定义为一个指针类型,指向一个具有特定参数和返回值的函数。

回调函数的定义通常如下:
```c
typedef void (*Callback)(int event); // 定义回调函数类型
void function(Callback callback) // 传递回调函数作为参数{
// 执行一些操作
// 当事件发生时,调用callback函数进行处理
callback(event);
}
```
其中,`Callback`是一个指向函数的指针类型,`event`是传递给回调函数的参数。

在`function`函数中,可以调用传递的回调函数进行事件处理。

STM32学习笔记之三_定时器中断

STM32学习笔记之三_定时器中断
void RCC_Configuration(void) { /*将外设 RCC 寄存器重设为缺省值 */ RCC_DeInit(); /*设置外部高速晶振(HSE)*/ RCC_HSEConfig(RCC_HSE_ON); /*等待 HSE 起振*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /*设置 AHB 时钟(HCLK)*/ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 设置高速 AHB 时钟(PCLK2)*/ RCC_PCLK2Config(RCC_HCLK_Div1); //RCC_HCLK_Div1—APB2 时钟 = HCLK= AHB 时钟 /*设置低速 AHB 时钟(PCLK1)*/ RCC_PCLK1Config(RCC_HCLK_Div2); /*设置 FLASH 存储器延时时钟周期数*/ FLASH_SetLatency(FLASH_Latency_2); /*选择 FLASH 预取指缓存的模式*/ //FLASH_Latency_2 2 延时周期 //RCC_HCLK_Div2—APB1 时钟=HCLK/2= AHB 时钟/2 //RCC_SYSCLK_Div1—AHB 时钟 = 系统时钟 //SUCCESS:HSE 晶振稳定且就绪 //RCC_HSE_ON——HSE 晶振打开(ON)
RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO, ENABLE); } 使用 HSE 时钟,程序设置时钟参数流程: 1、将 RCC 寄存器重新设置为默认值 RCC_DeInit 2、打开外部高速时钟晶振 HSE RCC_HSEConfig(RCC_HSE_ON); 3、 等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp(); 4、设置 AHB 时钟 RCC_HCLKConfig; 5、设置高速 AHB 时钟 RCC_PCLK2Config; 6、设置低速速 AHB 时钟 RCC_PCLK1Config 7、设置 PLL RCC_PLLConfig 8、打开 PLL RCC_PLLCmd(ENABLE); 9、 等待 PLL 工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) 10、设置系统时钟 RCC_SYSCLKConfig 11、判断是否 PLL 是系统时钟 while(RCC_GetSYSCLKSource() != 0x08) 12、 打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd () 下面是 TM32 软件固件库的程序中对 RCC 的配置函数(使用外部 8MHz 晶振) /************************************************************************** * Function Name : RCC_Configuration * Description : RCC 配置(使用外部 8MHz 晶振) * Input : 无 * Output : 无 * Return : 无 **************************************************************************/

STM32F103学习笔记(五) 外部中断

STM32F103学习笔记(五) 外部中断

STM32F103学习笔记(五)外部中断首先是外部中断基本的概念:STM32 的每个IO 都可以作为外部中断的中断输入口,这点也是STM32 的强大之处。

STM32F103 的中断控制器支持19 个外部中断/事件请求。

每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。

STM32F103 的19 个外部中断为:线0~15:对应外部IO 口的输入中断。

线16:连接到PVD 输出。

线17:连接到RTC 闹钟事件。

线18:连接到USB 唤醒事件。

线16~18还没有学到只看了线0~15。

每个中断线对应着7个GPIO口,形成映射关系,以线0 为例:它对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。

而中断线每次只能连接到1 个IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个GPIO 上了。

下面我们看看GPIO 跟中断线的映射关系图:根据映射关系,就开始配置按键对应GPIO口和中断的映射了:[csharp] view plain copy <pre name="code" class="csharp"><prename="code" class="html">void EXTIX_Init(void){ EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure; KEY_Init(); // 按键端口初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,EN ABLE); //使能复用功能时钟//GPIOE.2 中断线以及中断初始化配置下降沿触发GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_Pi nSource2);EXTI_InitStructure.EXTI_Line=EXTI_Line2; //KEY2 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//GPIOE.3 中断线以及中断初始化配置下降沿触发//KEY1GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_Pi nSource3);EXTI_InitStructure.EXTI_Line=EXTI_Line3;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//GPIOE.4 中断线以及中断初始化配置下降沿触发//KEY0GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_Pi nSource4);EXTI_InitStructure.EXTI_Line=EXTI_Line4;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//GPIOA.0 中断线以及中断初始化配置上升沿触发PA0 WK_UPGPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_Pi nSource0);EXTI_InitStructure.EXTI_Line=EXTI_Line0;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//使能按键WK_UP所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//使能按键KEY2所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//使能按键KEY1所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//使能按键KEY0所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器} //外部中断0服务程序voidEXTI0_IRQHandler(void) { delay_ms(10);//消抖if(KEY3==1) //WK_UP按键{ BEEP=!BEEP; } EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位} //外部中断2服务程序voidEXTI2_IRQHandler(void) { delay_ms(10);//消抖if(KEY2==0) //按键KEY2{ LED0=!LED0; }EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE2上的中断标志位} //外部中断3服务程序voidEXTI3_IRQHandler(void) { delay_ms(10);//消抖if(KEY1==0) //按键KEY1{ LED1=!LED1; }EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位} void EXTI4_IRQHandler(void){ delay_ms(10);//消抖if(KEY0==0) //按键KEY0 { LED0=!LED0;LED1=!LED1; }EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位} [html] view plain copy。

STM32的中断理解

STM32的中断理解

STM32的中断理解
STM32的中断理解:首先是MSP和PSP堆栈指针。

MSP是主堆栈,PSP是线程堆栈。

MSP可以用于线程模式下,也可以用于中断模式下。

而PSP只能在线程模式下使用
2.当系统复位以后默认使用的是MSP指针。

3.中断执行的过程:首先是入栈利用线程模式下的指针(入栈属于线程模式)。

然后调用向量表找到中断程序入口,开始进入中断程序,中断服务程序后。

调用BX LR会中断返回,在中断返回时会自动出栈LR,PC,等寄存器。

如果不修改CONTORL【1】则主程序中用的还是MSP指针。

如果修改后则用的PSP
这样下一次就可以自动切换了。

4 LR和PC:PC里面存放的是当前指令的地址。

LR是连接寄存器。

当发生中断或调用子程序时,此时当前的PC指令的下一条会被保存到LR。

当中断返回即可用LR返回到断点处(但是此时必须把LR的内容放到PC中,否则因为PC的地址不是LR中的地址,所以不会调到那个位置运行)。

还有就是把LR的值放到PC中。

PC自动从这个地址开始读代码。

5.PC里面的地址是多少,程序就是从这个地址开始运行。

STM32Cube学习之五:定时器中断

STM32Cube学习之五:定时器中断

STM32Cube学习之五:定时器中断假设已经安装好STM32CubeMX和STM32CubeF4支持包。

Step1.打开STM32CubeMX,点击“New Project”,选择芯片型号,STM32F407ZETx。

Step2.在Pinout界面下配置PF9,PF10为输出模式,并输入用户标签LED0,LED1。

Step3.配置TIM1,使用内部时钟源。

Step4.配置时钟树,在此使用默认值,16MHz。

Step5.配置TIM1参数和GPIO的参数。

在configuration界面中点击TIM1按钮,可以进入参数配置界面。

在Parameter Settings页配置预分频系数为15999,计数周期(自动加载值)为999,定时器溢出频率就是16MHz/(15999+1)/(999+1) = 1Hz。

在NVIC页面使能TIM1的更新中断。

在configuration界面中点击GPIO按钮,配置GPIO的上拉电阻。

在此GPIO配置默认即可。

Step6.生成源代码。

点击生成源代码按钮。

在设置界面中输入工程名,保存路径,工程IDE类型,点OK即可。

生成代码完成后可直接打开工程。

弹出如下对话框时,如果已经安装了F4的支持包,则点击OK关闭。

如果没有安装,则点击界面中的/...链接,找到芯片的支持包,然后安装。

关闭后面的界面。

点击“是”,然后选择芯片型号。

可以在搜索框中输入关键字,加快选择速度。

Step7.添加功能代码。

在main文件/* USER CODE BEGIN 4 */和/* USER CODE END 4 */注释之间加入下面代码。

在main函数的while(1)之前启动TIM1并使能其中断功能。

至此,完成整个工程。

编译下载,现象就是LED0和LED1同步循环闪烁,亮1秒灭1秒。

特别说明:CubeMX生成的MDK工程已经包含了配置中用到的外设相关文件,如下图:打开stm32f4xx_hal_tim.c,并点击右键,选择相应条目即可打开stm32f4xx_hal_tim.h文件,在HAL_开头的函数中,找到使能定时器中断的函数,如下图:定时器周期中断回调函数,在1304行。

STM32学习记录12 中断向量表

STM32学习记录12 中断向量表

STM32 学习记录12 中断向量表从stm32f10x.s 可以看到,已经定义好了一大堆的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地址,例如:AREA RESET, DATA, READONLY ;定义只读数据段,实际上是在CODE 区(假设STM32 从FLASH 启动,则此中断向量表起始地址即为0x8000000)EXPORT__VectorsIMPORT OS_CPU_SysTickHandler IMPORTOS_CPU_PendSVHandler__Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler这个向量表的编写是有讲究的,跟硬件一一对应不能乱写的,CPU 找入口地址就靠它了,bin 文件开头就是他们的地址,参考手册RM0008 的10.1.2 节可以看到排列。

我们再结合CORTEX-M3 的特性,他上电后根据boot 引脚来决定PC 位置,比如boot 设置为flash 启动,则启动后PC 跳到0x08000000。

此时CPU 会先取2 个地址,第一个是栈顶地址,第二个是复位异常地址,故有了上面的写法,这样就跳到reset_handler。

那么这个reset_handler 的实际地址是多少.?下面的一堆例如Nmi_handler 地址又是多少呢?发生中断是怎么跑到这个地址的呢?下面挨个讲解。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32系统及各模块配置一、STM32中断优先级和开关总中断(1)中断优先级:STM32(Cortex-M3)中的优先级概念STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。

具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。

如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:所有8位用于指定响应优先级最高1位用于指定抢占式优先级,最低7位用于指定响应优先级最高2位用于指定抢占式优先级,最低6位用于指定响应优先级最高3位用于指定抢占式优先级,最低5位用于指定响应优先级最高4位用于指定抢占式优先级,最低4位用于指定响应优先级最高5位用于指定抢占式优先级,最低3位用于指定响应优先级最高6位用于指定抢占式优先级,最低2位用于指定响应优先级最高7位用于指定抢占式优先级,最低1位用于指定响应优先级这就是优先级分组的概念。

--------------------------------------------------------------------------------Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:第0组:所有4位用于指定响应优先级第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级第4组:所有4位用于指定抢占式优先级可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:NVIC_PriorityGroup_0 => 选择第0组NVIC_PriorityGroup_1 => 选择第1组NVIC_PriorityGroup_2 => 选择第2组NVIC_PriorityGroup_3 => 选择第3组NVIC_PriorityGroup_4 => 选择第4组接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:// 选择使用优先级分组第1组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);// 使能EXTI0中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 使能EXTI9_5中断NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);要注意的几点是:1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;2)抢占式优先级别相同的中断源之间没有嵌套关系;3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

(2)开关总中断:在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。

PRIMASK位:只允许NMI和hard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。

FAULTMASK位:只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。

在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定义了四个函数操作PRIMASK 位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。

下面两个函数等效于关闭总中断:void NVIC_SETPRIMASK(void);void NVIC_SETFAULTMASK(void);下面两个函数等效于开放总中断:void NVIC_RESETPRIMASK(void);void NVIC_RESETFAULTMASK(void);上面两组函数要成对使用,不能交叉使用。

例如:第一种方法:NVIC_SETPRIMASK();//关闭总中断NVIC_RESETPRIMASK();//开放总中断第二种方法:NVIC_SETFAULTMASK();//关闭总中断NVIC_RESETFAULTMASK();//开放总中断常常使用NVIC_SETPRIMASK(); // Disable InterruptsNVIC_RESETPRIMASK(); // Enable Interrupts二、STM32时钟系统STM32资料2009-09-23 14:53 阅读72 评论0字号:大大中中小小在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。

①、HSI是高速内部时钟,RC振荡器,频率为8MHz。

②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

③、LSI是低速内部时钟,RC振荡器,频率为40kHz。

④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。

倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

图1 HSE/LSE时钟源其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。

另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。

RTC的时钟源通过RTCSEL[1:0]来选择。

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。

该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。

另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。

系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。

系统时钟可选择为PLL 输出、HSI或者HSE。

系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。

其中AHB分频器输出的时钟送给5大模块使用:①、送给AHB总线、内核、内存和DMA使用的HCLK时钟。

②、通过8分频后送给Cortex的系统定时器时钟。

③、直接送给Cortex的空闲运行时钟FCLK。

④、送给APB1分频器。

APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。

该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。

⑤、送给APB2分频器。

APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。

该倍频器可选择1或者2倍频,时钟输出供定时器1使用。

另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。

ADC分频器可选择为2、4、6、8分频。

在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。

当需要使用某模块时,记得一定要先使能对应的时钟。

需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。

连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。

注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。

USB模块工作的时钟应该是由APB1提供的。

连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。

下图是STM32用户手册中的时钟系统结构图,通过该图可以从总体上掌握STM32的时钟系统。

三、STM32外部中断STM32资料2009-09-10 21:18 阅读243 评论0字号:大大中中小小STM32 外部中断配置1配置中断1、分配中断向量表:/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_V ectTab_RAM, 0x0);2、设置中断优先级:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置中断优先级3、初始化外部中断:/*允许EXTI4中断*/NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel; //中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;//强占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //次优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中断使能NVIC_Init(&NVIC_InitStructure); //初始化中断注意:如果我们配置的外部针脚为PA4,或PB4,或PC4,PD4等,那么采用的外部中断也必须是EXTI4,同样,如果外部中断针脚是PA1,PB1,PC1,PD1 那么中断就要用EXTI1,其他类推。

相关文档
最新文档