微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32的嵌套中断系统NVIC和RCC详细整理

STM32的嵌套中断系统NVIC和RCC详细整理

时间:11-26 来源:互联网 点击:

要注意的几点是:

1. 如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;

2. 抢占式优先级别相同的中断源之间没有嵌套关系;

3. 如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

2、开关总中断

在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。

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

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

下面两个函数等效于关闭总中断:

voidNVIC_SETPRIMASK(void);

voidNVIC_SETFAULTMASK(void);

下面两个函数等效于开放总中断:

voidNVIC_RESETPRIMASK(void);

voidNVIC_RESETFAULTMASK(void);

上面两组函数要成对使用,但不能交叉使用。

例如:

第一种方法:

NVIC_SETPRIMASK();//关闭总中断 ,只允许NMI和hard fault异常

NVIC_RESETPRIMASK();//开放总中断

第二种方法:

NVIC_SETFAULTMASK();//关闭总中断 ,只允许NMI

NVIC_RESETFAULTMASK();//开放总中断

常常使用:

NVIC_SETPRIMASK();//Disable Interrupts

NVIC_RESETPRIMASK();  // Enable Interrupts

可以用:

#define CLI()  __set_PRIMASK(1)  //关闭总中断

#define SEI()  __set_PRIMASK(0)  //打开总中断

来实现开关总中断的功能。

二、寄存器介绍:

1、在core_cm3.h中定义了:

…………………………
…………………………
…………………………

五、实例详解

void NVIC_config()//配置中断

{

NVIC_InitTypeDef NVIC_InitStructure;

//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//选择中断分组1

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//选择串口1中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;//抢占式中断优先级设置为0

NVIC_InitStructure.NVIC_IRQChannelSubPriority= 3;//响应式中断优先级设置为3

NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;//使能中断

NVIC_Init(&NVIC_InitStructure);

}



STM32的时钟系统

本文档由“~风中的叶~”整理;QQ:654705188

一、综述:

1、时钟源

在 STM32 中,一共有 5 个时钟源,分别是 HSI 、 HSE 、 LSI 、 LSE 、 PLL 。

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

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

③LSI 是低速内部时钟, RC 振荡器,频率为 40KHz ;

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

⑤PLL 为锁相环倍频输出,严格的来说并不算一个独立的时钟源, PLL 的输入可以接 HSI/2 、 HSE 或者 HSE/2 。PLL倍频可选择为 2– 16 倍,但是其输出频率最大不得超过 72MHz 。

其中, 40kHz 的 LSI 供独立看门狗 IWDG 使用,另外它还可以被选择为实时时钟 RTC 的时钟源。另外,实时时钟 RTC 的时钟源还可以选择 LSE ,或者是 HSE 的 128 分频。

STM32 中有一个全速功能的 USB 模块,其串行接口引擎需要一个频率为 48MHz 的时钟源。该时钟源只能从 PLL 端获取,可以选择为 1.5 分频或者 1分频,也就是,当需使用到 USB 模块时, PLL 必须使能,并且时钟配置为 48MHz 或 72MHz 。

另外 STM32 还可以选择一个时钟信号输出到 MCO 脚 (PA.8) 上,可以选择为 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 的系统定时器时钟STCLK;

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

④送给 APB1 分频器。 APB1 分频器可以选择 1 、 2 、 4 、 8 、 16 分频,其输出一路供 APB1 外设使用( PCLK1 ,最大频率 36MHz ),另一路送给定时器 (Timer)2 、3 、4 倍频器使用。该倍频器根据PCLK1的分频值自动选择 1或者 2倍频,时钟输出供定时器 2、 3、 4使用。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top