STM32_NVIC寄存器详解
STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时。。。

STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)⾼级定时。
⽂章结构:——> ⼀、定时器基本介绍——> ⼆、普通定时器详细介绍TIM2-TIM5——> 三、定时器代码实例⼀、定时器基本介绍之前有⽤过野⽕的学习板上⾯讲解很详细,所以直接上野⽕官⽅的资料吧,作为学习参考笔记发出来⼆、普通定时器详细介绍TIM2-TIM52.1 时钟来源计数器时钟可以由下列时钟源提供:·内部时钟(CK_INT)·外部时钟模式1:外部输⼊脚(TIx)·外部时钟模式2:外部触发输⼊(ETR)·内部触发输⼊(ITRx):使⽤⼀个定时器作为另⼀个定时器的预分频器,如可以配置⼀个定时器Timer1⽽作为另⼀个定时器Timer2的预分频器。
由于今天的学习是最基本的定时功能,所以采⽤内部时钟。
TIM2-TIM5的时钟不是直接来⾃于APB1,⽽是来⾃于输⼊为APB1的⼀个倍频器。
这个倍频器的作⽤是:当APB1的预分频系数为1时,这个倍频器不起作⽤,定时器的时钟频率等于APB1的频率(36MHZ);当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作⽤,定时器的时钟频率等于APB1的频率的2倍。
{假如APB1预分频为2(变成36MHZ),则定时器TIM2-5的时钟倍频器起作⽤,将变成2倍的APB1(2x36MHZ)将为72MHZ给定时器提供时钟脉冲。
⼀般APB1和APB2的RCC时钟配置放在初始化函数中例如下⾯的void RCC_Configuration(void)配置函数所⽰,将APB1进⾏2分频,导致TIM2时钟变为72MHZ输⼊。
如果是1分频则会是36MHZ输⼊,如果4分频:CKINT=72MHZ/4x2=36MHZ; 8分频:CKINT=72MHZ/8x2=18MHZ;16分频:CKINT=72MHZ/16x2=9MHZ}1//系统时钟初始化配置2void RCC_Configuration(void)3 {4//定义错误状态变量5 ErrorStatus HSEStartUpStatus;6//将RCC寄存器重新设置为默认值7 RCC_DeInit();8//打开外部⾼速时钟晶振9 RCC_HSEConfig(RCC_HSE_ON);10//等待外部⾼速时钟晶振⼯作11 HSEStartUpStatus = RCC_WaitForHSEStartUp();12if(HSEStartUpStatus == SUCCESS)13 {14//设置AHB时钟(HCLK)为系统时钟15 RCC_HCLKConfig(RCC_SYSCLK_Div1);16//设置⾼速AHB时钟(APB2)为HCLK时钟17 RCC_PCLK2Config(RCC_HCLK_Div1);18 //设置低速AHB时钟(APB1)为HCLK的2分频(TIM2-TIM5输⼊TIMxCLK频率将为72MHZ/2x2=72MHZ输⼊)19 RCC_PCLK1Config(RCC_HCLK_Div2);20//设置FLASH代码延时21 FLASH_SetLatency(FLASH_Latency_2);22//使能预取指缓存23 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);24//设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz25 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);26//使能PLL27 RCC_PLLCmd(ENABLE);28//等待PLL准备就绪29while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);30//设置PLL为系统时钟源31 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);32//判断PLL是否是系统时钟33while(RCC_GetSYSCLKSource() != 0x08);34 }35//允许TIM2的时钟36 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);37//允许GPIO的时钟38 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);39 }APB1的分频在STM32_SYSTICK的学习笔记中有详细描述。
stm32复位函数

stm32复位函数概述在开发stm32单片机应用程序时,复位函数是非常重要的一个功能。
复位函数可以将单片机恢复到初始状态,清除所有的寄存器状态和内存内容,以便重新开始程序的执行。
本文将详细介绍stm32上的复位函数及其相关知识。
复位的原理在stm32单片机中,可以通过外部复位和软件复位两种方式来实现复位功能。
外部复位是通过对复位引脚加上一个低电平来触发复位操作,而软件复位是通过特定的寄存器设置来触发复位操作。
STM32的复位函数stm32提供了一些复位函数用于进行单片机的复位操作,这些函数包括: 1. NVIC_SystemReset函数:该函数用于进行软件复位操作,会将系统状态寄存器和所有外设的寄存器恢复到复位状态。
2. HAL_RCC_DeInit函数:该函数用于将所有的外设和时钟配置恢复到复位状态。
3. HAL_NVIC_SystemReset函数:该函数用于重置NVIC的配置,将所有中断向量表的地址恢复到默认值。
4.HAL_NVIC_DeInit函数:该函数用于将所有中断的优先级和中断清除控制器的配置恢复到默认值。
复位函数的使用在使用复位函数之前,需要包含相应的头文件和进行一些初始化操作。
下面是一个示例代码:#include "stm32f4xx.h"#include "stm32f4xx_hal.h"int main(void){// 初始化操作...// 对单片机进行软件复位HAL_NVIC_SystemReset();// 恢复到此代码行时,单片机已经重启完成while(1){// 主程序循环}}在上面的示例代码中,首先通过包含头文件的方式引入需要使用的函数和类型定义。
然后进行一些初始化操作。
最后调用HAL_NVIC_SystemReset函数进行复位操作。
在复位操作完成后,程序将在while(1)循环中继续执行。
复位的注意事项在使用复位函数时,需要注意以下几点: 1. 复位函数调用后,程序将从头开始执行,因此在调用复位函数之后的代码将不再执行。
STM32外部中断处理流程

STM32外部中断处理流程外部中断是指引发中断的事件来自于MCU外部的输入引脚或外设,需要通过配置寄存器和中断服务程序来处理外部中断。
在STM32系列MCU中,外部中断处理可分为以下几个步骤。
1.配置中断引脚要使用外部中断功能,首先需要配置中断引脚。
对于STM32,外部中断引脚由GPIO口提供,需要通过GPIO配置寄存器设置相关引脚的工作模式、上下拉和中断触发方式等。
具体配置方法可以参考芯片手册。
2.配置中断控制器外部中断的中断源需要连接到中断控制器(NVIC),通过配置NVIC的相关寄存器来使能外部中断。
NVIC是位于ARM Cortex-M内核内部的外设,用于管理和分配中断优先级。
3.编写中断服务程序(ISR)中断服务程序(Interrupt Service Routine, ISR)是用于处理中断事件的函数,当外部中断引发时,MCU会跳转到相应的ISR进行处理。
在编写ISR时,需要注意以下几点:-确定中断源:可以通过读取中断状态寄存器来判断是哪个外部中断引起的中断。
-处理中断事件:根据中断源的不同,进行相应的处理。
例如,可以读取输入引脚状态、处理外设状态等。
-清除中断标志位:要在ISR内部清除中断标志位,以允许MCU再次响应该外部中断。
具体方法是通过读取相应的寄存器或调用相关函数清除中断标志位。
4.配置中断优先级中断优先级用于确定ISR的响应顺序,优先级较高的中断先被处理。
在STM32中,中断优先级可以通过配置中断控制器的相关寄存器进行设置。
5.启用中断在完成上述步骤后,需要启用相应的中断引脚和中断控制器。
具体方法是通过设置GPIO寄存器来使能中断引脚,并通过设置NVIC寄存器来使能相关中断。
6.处理中断请求一旦发生外部中断事件,MCU就会跳转到相应的ISR进行中断处理。
在ISR中,可以根据需要调用其他的函数或执行其他的操作。
处理完成后,可以通过清除中断标志位和退出中断函数来结束中断处理。
野火stm32-MicroSD卡(单纯读block)3.5.0-SDIO_4bit

SDIO_SD卡4bit模式详解实验描述:MicroSD卡(SDIO模式)测试实验,采用4bit数据线模式。
没有跑文件系统,只是单纯地读block并将测试信息通过串口1在电脑的超级终端上打印出来。
硬件连接:PC12-SDIO-CLK:CLKPC10-SDIO-D2 :DATA2PC11-SDIO-D3:CD/DATA3PD2-SDIO-CMD :CMDPC8-SDIO-D0:DATA0PC9-SDIO-D1:DATA1库文件:startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.cFWlib/stm32f10x_usart.cFWlib/stm32f10x_sdio.cFWlib/stm32f10x_dma.cFWlib/misc.c用户文件: USER/main.cUSER/stm32f10x_it.cUSER/usart1.cUSER/sdio_sdcard.c野火STM32开发板 MicroSD卡硬件原理图:SDIO简介->野火STM32开发板的CPU ( STM32F103VET6 )具有一个SDIO接口。
SD/SDIO/MMC主机接口可以支持MMC卡系统规范4.2版中的3个不同的数据总线模式:1位(默认)、4位和8位。
在8位模式下,该接口可以使数据传输速率达到48MHz,该接口兼容SD存储卡规范2.0版。
SDIO存储卡规范2.0版支持两种数据总线模式:1位(默认)和4位。
目前的芯片版本只能一次支持一个SD/SDIO/MMC 4.2版的卡,但可以同时支持多个MMC 4.1版或之前版本的卡。
除了SD/SDIO/MMC,这个接口完全与CE-ATA数字协议版本1.1兼容。
知识准备:大多数人原来没有了解过SD协议,又看到SDIO的驱动有2000多行,感觉无从下手。
stm32F103寄存器

0位:CTE清除侵入检测事件(只能写入,读出值为0)定义:0(无效)1(清除TEF侵入检测事件标志(并Байду номын сангаас位侵入检测器)
RCC时钟相关寄存器
31 15 30 14 12 11 4 3 2 1 HSICAL[7:0] 保留 HSIRDY 25位:PLLRDY-PLL时钟就绪标志(PLL锁定后由硬件置1)定义:0(未锁定),1(锁定) 24位:PLLON-PLL使能(手动)定义:0(PLL关闭),1(PLL使能)。进入待机或停机模式时,该位由硬件清零当PLL用作系统始终时,该位不能被清零。 19位:CSSON时钟安全系统使能(由软件置1或清零)定义:0(时钟监测器关闭),1(如果外部4-16M振荡器就绪,时钟监测器开启) 18位:HSEBYP外部高速时钟旁路。定义:0(晶振4-16M),1(有源晶振25M)。调试模式下由软件控制。只有在4-16M振荡器关闭情况下,才能写入该位。 17位:HSERDY外部高速时钟就绪标志(自动)在HSEON位清零后,需6个外部4-25M振荡器周期清零。定义:0(4), 16位:HSEON外部高速时钟使能(软件控制)定义:0(HSE关闭),1(HSE开启)。待机或停机模式硬件清零,当用作系统系统时钟时,该位不能清零。 15-8位:HSICAL[7:0]-内部高速时钟校准。系统启动时,这些位被自动初始化。 7-3位:HSITRIM[4:0]-内部高速时钟调整(软件控制,与HSICAL叠加,相当于手动微调) 1位:HSIRDY内部高速时钟就绪标志硬件置1,在HSION清零后,该位需要6个内部8M振荡周期清零。定义:0(没有就绪),1(有就绪) 0位:HSION内部高速时钟使能(软件控制)当从待机或停机返回用或外部振荡故障时由硬件置1。若使用内部时钟做系统时钟则不能清零。定义:0(关),1(开) RCC_CFGR(时钟配置寄存器) 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 保留 MCO[3:0] 保留 OTGFSPRE PLLMUL[3:0] PLLXTPRE 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 ADCPRE[1:0] PPRE2[2:0] PPRE1[2:0] HPRE[3:0] SWS[1:0] SW[1:0] 27-24位:MCO微控制器时钟输出(手动)注:该时钟输出在启动和切换MCO时钟源时可能会被截断。在系统时钟作为MCO引脚时,需保证输出不高于50M 定义:00xx(无输出),0100(系统时钟sysclk输出),0101(内部8M输出),0110(外部25M输出),0111(PLL时钟2分频输出),1000(PLL2输出) 1001(PLL3时钟2分频输出),1010(XT1外部25M输出(为以太网),1011(PLL3时钟输出) 22位:OTGFSPRE全速USBOTG预分频(手动)在RCC_APB1ENR寄存器中使能全速OTG时钟之前,必须保证该位已经有效,如OTG时钟被使能则不能清0 定义:0(VCO时钟除3,但必须配置PLL输出为72M),1(VCO时钟除2,但必须配置PLL输出为48M) 21-18位:PLLMUL-PLL倍频系数(手动)注:只有在PLL关闭的情况下才能被写入,且PLL的输出频率不能超过72M 定义:000x,10xx,1100(保留),0010(PLL4倍),0011(PLL5倍),0100(PLL6倍),0101(PLL7倍),0110(PLL8倍),0111(PLL9倍),1101(PLL6.5倍) 17位:PLLXTPRE-PREDIV1分频因子低位(软件控制)与RCC_CFGR2的0位为同一位。如果RCC_CFGR2[3:1]为000,则该位控制PREDIV1对输入时钟进行2分频(PLLXPRE=1), 或不对输入时钟分频(PLLXPRE=0),只能在关闭PLL时才写入此位 16位:PLL输入时钟源(软件控制,且只能在关闭PLL时才写入此位)定义:0(HIS时钟2分频做PLL输入),1(PREDIV1输出做PLL输入) 注:当改变主PLL的输入时钟源时,必须在选定了新的时钟源后才能关闭原来的时钟源 15/14位:ADCPRE-ADC预分频(手动)定义:00(PCLK2-2分频),01(PCLK2-4分频),10(PCLK2-6分频),11(PCLK2-8分频) 13-11位:PPRE2[2:0]-APB2预分频(手动)定义:0xx(HCLK不分频),100(HCLK2分频),101(HCLK4分频),110(HCLK8分频),111(HCLK16分频) 10-8位:PPRE1[2:0]-APB1预分频(手动)定义:0xx(HCLK不分频),100(HCLK2分频),101(HCLK4分频),110(HCLK8分频),111(HCLK16分频),注小于36 7-4位:HPRE[3:0]-AHB预分频(手动)定义:0xxx(SYSCLK不分频),1000(2分频),1001(4分频),1010(8分频),1011(16分频) 1100(64分频),1101(128分频),1110(256分频),1111(512分频).注:AHB时钟预分频大于1时,必须开预取缓冲器。当使用以太网模块时,频率至少25M 3-2位:SWS[1:0]系统时钟切换状态(自动)定义:00(HIS作为系统时钟),01(HSE做系统时钟),10(PLL做系统时钟),11(不可用) 29 保留 13 28 27 RCC_CR(时钟控制寄存器) 26 25 24 23 PLLRDY PLLON 10 9 8 7 22 21 保留 6 5 HSITRIM[4:0] 20 CSSON 19 HSEBYP 18 HSERDY 17
NVIC中断优先级管理

-STM32F42xx/STM32F43xx则总共有96个中断
STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中 断和82个可屏蔽中断,具有16级可编程的中断优先级,而我们 常用的就是这82个可屏蔽中断。
电子实验中心
分组配置是在寄存器SCB->AIRCR中配置:
组
AIRCR[10:8]
0
111
1
110
2
101
3
100
4
011
IP bit[7:4]分配情况 0:4 1:3 2:2 3:1 4:0
分配结果 0位抢占优先级,4位响应优先级 1位抢占优先级,3位响应优先级 2位抢占优先级,2位响应优先级 3位抢占优先级,1位响应优先级 4位抢占优先级,0位响应优先级
配置方法跟ISER一样。
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
电子实验中心
中断优先级设置
中断挂起控制寄存器组:ISPR[8]
作用:用来挂起中断
中断解挂控制寄存器组:ICPR[8]
作用:用来解挂中断
static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn); static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn);
如果两个中断的抢占优先级和响应优先级都是一样的 话,则看哪个中断先发生就先执行;
电子实验中心
NVIC中断优✓先1级. N分V组IC中断优先级分组
举例:
假定设置中断优先级组为2,然后设置 中断3(RTC中断)的抢占优先级为2,响应优先级为1。
STM32固件库详解
STM32固件库详解STM32固件库详解1.1 基于标准外设库的软件开发1.1.1 STM32标准外设库概述STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。
该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。
因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。
每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。
每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。
ST公司2007年10月发布了V1.0版本的固件库,MDK ARM3.22之前的版本均支持该库。
2008年6月发布了V2.0版的固件库,从2008年9月推出的MDK ARM3.23版本至今均使用V2.0版本的固件库。
V3.0以后的版本相对之前的版本改动较大,本书使用目前较新的V3.4版本。
1.1.2 使用标准外设库开发的优势简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。
标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SPI、UART和ADC等等的所有标准外设。
对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。
1.1.3 STM32F10XXX标准外设库结构与文件描述1. 标准外设库的文件结构在上一小节中已经介绍了使用标准外设库的开发的优势,因此对标准外设库的熟悉程度直接影响到程序的编写,下面让我们来认识一下STM32F10XXX的标准外设库。
STM32固件库文件结构及作用详解
STM32标准外设固件库文件结构及用途文件夹树图及文件作用详述stm32f10x_stdperiph_lib_V3.5.0--------------ST 公司针对STM32提供的函数接口├─Release_Notes.html -------------------------官方网页资源├─stm32f10x_stdperiph_lib_um.chm-------------库的帮助文档 ├─stm32f10x_stdperiph_lib_um.chw ├─htmresc -----------------------------------CMSIS 内核和ST 公司Logo │ ├─CMSIS_Logo_Final.jpg │ └─logo.bmp ├─Libraries ----------------------------------固件库 │ ├─CMSIS -Cortex Microcontroller Software Interface Standard(Cortex 内核软件接口标准) │ │ ├─CMSIS debug support.htm ------------官方网页资源 │ │ ├─CMSIS_changes.htm ------------------官方网页资源 │ │ ├─License.doc │ │ ├─CM3 固件库文件夹树形图│ │ │ ├─CoreSupport----为采用Cortex-M3核设计SOC的芯片商设计的芯片外设提供一个进入M3内核的接口│ │ │ │ ├─core_cm3.c│ │ │ │ └─core_cm3.h│ │ │ └─DeviceSupport│ │ │ └─ST│ │ │ └─STM32F10x│ │ │ ├─Release_Notes.html│ │ │ ├─stm32f10x.h --------------------定义寄存器的地址及使用的结构体封装│ │ │ ├─system_stm32f10x.c--------------设备外设访问层,主要配置时钟频率│ │ │ ├─system_stm32f10x.h--------------配置时钟频率相应的头文件│ │ │ └─startup--------由汇编编写的系统启动文件,不同的文件对应不同的芯片型号│ │ │ ├─arm-------ARM编译器启动文件│ │ │ │ ├─startup_stm32f10x_cl.s------cl:互联型产品,stm32f105/107系列│ │ │ │ ├─startup_stm32f10x_hd.s------hd:高密度产品,FLASH大于128│ │ │ │ ├─startup_stm32f10x_hd_vl.s---vl:超值型产品,stm32f100系列│ │ │ │ ├─startup_stm32f10x_ld.s------ld:低密度产品,FLASH小于64K│ │ │ │ ├─startup_stm32f10x_ld_vl.s│ │ │ │ ├─startup_stm32f10x_md.s------md:中等密度产品,FLASH=64 or 128 │ │ │ │ ├─startup_stm32f10x_md_vl.s│ │ │ │ └─startup_stm32f10x_xl.s----xl:超高密度(容量)产品,stm32f101/103系列│ │ │ ├─gcc_ride7………………GCC编译器启动文件│ │ │ ├─iar………………………………IAR编译器启动文件│ │ │ └─TrueSTUDIO……………TrueSTUDIO编译器启动文件│ │ └─Documentation│ │ └─CMSIS_Core.htm --------------CMSIS_Core网页资源│ └─STM32F10x_StdPeriph_Driver-----------CMSIS的设备外设函数,由stm32f10x_ppp.c或 stm32f10x_ppp.h ││文件组成,PPP表示外设名称。
【6-06】Stm32寄存器--ADC and DAC
4位(STRT--Regular channel Start flag):规则通道开始(硬件在开始转换时置位,软件清0)。定义:0(规则通道未开始转换),1(规则通道已开始转换) 3位(JSTRT--Injected channel Start flag):注入通道开始(硬件在开始转换时置位,软件清0)。定义:0(规则通道未开始转换),1(规则通道已开始转换) 2位(JEOC--Injected channel End of Conversion):注入通道转换结束(硬件在所有注入通道转换结束时设置,由软件清0)。 定义:0(转换未完成),1(转换完成) 1位(EOC--End of Conversion):转换结束。(该位由硬件在(规则或注入)通道组转换结束时设置,由软件清除或由读取ADC_DR时清除。 定义:0(转换未完成),1(转换完成) 0位(AWD--Analog watchdog flag):模拟看门狗标志,该位在硬件转换的电压值超出了ADC_LTR和ADC_HTR寄存器定义的范围时置位,由软件清0。 定义:0(没事件),1(有事件)
23位(TSVREFE--Temperature Sensor and V REFINT Enable): 温度传感器和V refint使能(手动)。在多余1个ADC的器件中该位仅出现在ADC1中。 定义:0(禁止),1(开启)。【注】Vrefint :Internal Reference Voltage = 内部参考电压。 22位(SWSTART--SoftWare Start conversion of regular channels): 开始转换规则通道。(软件启动该位,转换后硬件马上清除此位) 如果在EXTSEL[2:0]位中选择了SWSTART为触发事件,该位用于启动一组规则通道的转换。定义:0(复位状态),1(开始转换规则通道)
STM32串口寄存器
当RXNE仍然是’1’的时候,当前被接收在移位寄存器中的数据,需要传送至RDR寄存器时,硬 件将该位置位。如果USART_CR1中的RXNEIE为’1’的话,则产生中断。由软件序列将其清零 (先读USART_SR,然后读USART_CR)。
0:没有过载错误;
1:检测到过载错误。
注意:该位被置位时,RDR寄存器中的值不会丢失,但是移位寄存器中的数据会被覆盖。如果 设置了EIE位,在多缓冲器通信模式下,ORE标志置位会产生中断的。
TXEIE:发送缓冲区空中断使能 (TXE interrupt enable) 该位由软件设置或清除。 0:禁止产生中断; 1:当USART_SR中的TXE为’1’时,产生USART中断。
TCIE:发送完成中断使能 (Transmission complete interrupt enable) 该位由软件设置或清除。 0:禁止产生中断; 1:当USART_SR中的TC为’1’时,产生USART中断。
位2
NE: 噪声错误标志 (Noise error flag)
在接收到的帧检测到噪音时,由硬件对该位置位。由软件序列对其清玲(先读USART_SR,再 读USART_DR)。
0:没有检测到噪声;
1:检测到噪声。
注意:该位不会产生中断,因为它和RXNE一起出现,硬件会在设置RXNE标志时产生中断。 在多缓冲区通信模式下,如果设置了EIE位,则设置NE标志时会产生中断。
位12
位11
12 11 10 M WAKE PCE rw rw rw
9
8
7
6
5
4
3
PS
PEIE TXEIE TCIE
RXNE IE
IDLE IE
TE
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在 MDK 内,与 NVIC 相关的寄存器,MDK 为其定义了如下的结构体: typedef struct { vu32 ISER[2]; //2 个 32 位中断使能寄存器分别对应到 60 个可屏蔽中断 u32 RESERVED0[30]; // vu32 ICER[2]; //2 个 32 位中断除能寄存器分别对应到 60 个可屏蔽中断 u32 RSERVED1[30]; vu32 ISPR[2]; //2 个 32 位中断挂起寄存器分别对应到 60 个可屏蔽中断,可挂起正在执行的中断 u32 RESERVED2[30]; vu32 ICPR[2]; //2 个 32 位中断解挂寄存器分别对应到 60 个可屏蔽中断,可解除被挂起的中断 u32 RESERVED3[30]; vu32 IABR[2]; //2 个 32 位中断激活标志寄存器,可读取该寄存器判断当前执行的中断是哪个,中断执行完硬件清零, 只读 u32 RESERVED4[62]; vu32 IPR[15]; //15 个 32 位中断优先级分组寄存器,每个中断分配 8 个 bit,对应到 4*15=60 个中断 } NVIC_TypeDef;
ISER0:使能寄存器 0,写 1 使能 ISPR0:挂起寄存器 0,写 1 挂起
or or
ICER0:除能寄存器 0,写 1 除能 ICPR0:解挂寄存器 0,写 1 解挂
ICER1:使能寄存器 1,写 1 使能 ISPR1:挂起寄存器 1,写 1 挂起
or or
ICER1:除能寄存器 1,写 1 除能 ICPR1:解挂寄存器 1,写 1 解挂
IABR0:中断激活标志寄存器 0
寄存器位 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 对应可屏蔽中断 WWDG PVD TAMPER RTC FLASH RCC EXTI0 EXTI1 EXTI2 EXTI3 EXTI4 DMA1_channel1 DMA1_channel2 DMA1_channel3 DMA1_channel4 DMA1_channel5 DMA1_channel6 DMA1_channel7 ADC1/2 USB_HIGH/CAN_TX USB_LP/CAN_RX0 CAN_RX1 CAN_SCE EXTI[9:5] TIM1_Break TIM1_Update TIM1_Trg/Com TIM1_CC TIM2 TIM3 TIM4 IIC1_EV 描述 窗看门狗 连到 EXTI 的电源电压检测(PVD) 中断 侵入检测中断 实时时钟全局中断 闪存全局中断 Reset and Clock Control 中断 EXTI 线 0 中断 EXTI 线 1 中断 EXTI 线 2 中断 EXTI 线 3 中断 EXTI 线 4 中断 DMA1 通道 1 全局中断 DMA1 通道 2 全局中断 DMA1 通道 3 全局中断 DMA1 通道 4 全局中断 DMA1 通道 5 全局中断 DMA1 通道 6 全局中断 DMA1 通道 7 全局中断 ADC1 和 ADC2 全局中断 USB 高优先级或 CAN 发送中断 USB 低优先级或 CAN 接收 0 中断 CAN 接收 1 中断 CAN SCE 中断 EXTI 线[9:5] 中断 TIM1 刹车中断 TIM1 更新中断 TIM1 触发和通信中断 TIM1 捕获比较中断 定时器 2 全局中断 定时器 3 全局中断 定时器 4 全局中断 IIC1 事件中断 寄存器位 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
IABR1:中断激活标志寄存器 0
对应可屏蔽中断 IIC1_ER IIC2_EV IIC2_ER SPI1 SPI2 USART1 USART2 USART3 EXTI[10:15] RTC_Alarm USB_WakeUp Tim8_Break Tim8_Update Tim8_Trg/Com Tim8_CC Adc3 Fsmc Sdio Tim5 Spi3 Uart4 Uart5 Tim6 Tim7 Dma2_Channel1 Dma2_Channel2 Dma2_Channel3 Dma2_Channel4/5 / / / / 描述 IIC1 错误中断 IIC2 事件中断 IIC2 错误中断 SPI1 全局中断 SPI2 全局中断 USART1 全局中断 USART2 全局中断 USART3 全局中断 EXTI[10:15]中断 连接到 EXTI 的闹钟中断 连接到 EXTI 的 USB 待机唤醒中断 定时器 8 刹车中断 定时器 8 更新中断 定时器 8 触发和通信中断 定时器 8 捕获比较捉弄中断 ADC3 全局中断 FSMC 全局中断 SDIO 全局中断 定时器 5 全局中断 SPI3 全局中断 Uart4 全局中断 Uart5 全局中断 定时器 6 全局中断 定时器 7 全局中断 DMA2 通道 1 全局中断 DMA2 通道 2 全局中断 DMA2 通道 3 全局中断 DMA2 通道和通道 5 全局中断 / / / /
IPR[15] 15 个 32 位中断优先级分组寄存器,每个中断分配 8 个 bit,对应到 4*15=60 个中断。
但是并不是 8 个 bit 都被使用了,而是仅仅只用到 了高四位,这样就可以得到 5 组 16 级的中断优先级。
高位的 4 个 bit 又分为抢占优先级和子优先级,抢占优先级在前,子优先级在后。
两种 类型优先级占用的位数又可以通过 SCB->AIRCR 寄存器的 bit[10:8]来配置。
组别 高四位分配情况 SCB->AIRCR[10:8] 0 111 0:4 1 110 1:3 2 101 2:2 3 100 3:1 4 011 4:0 分配结果 0 位抢占优先级 4 位子优先级 1 位抢占优先级 3 位子优先级 2 位抢占优先级 2 位子优先级 3 位抢占优先级 1 位子优先级 4 位抢占优先级 0 位子优先级
数字越小优先级越高,高优先级的中断可以中断低优先级的中断,但是抢占优先级相同时子优先级高的无法中断子优先级低的中断。
结合实例说明一下:假定设置中断优先级组为 2,然后设置中断 28(Tim2 中断)的抢占优先级为 3,响应优先级为 2。
中断 6(外部中断 0) 的抢占优先级为 4,响应优先级为 0。
中断 7(外部中断 1)的抢占优先级为 3,响应优先级为 0。
那么这 3 个中断的优先级顺序为:中断 7>
中断 28>中断 6。
上面例子中的中断 28 和中断 7 都可以打断中断 6 的中断。
而中断 7 和中断 28 却不可以相互打断!
。