STM32_NVIC寄存器详解
- 格式:pdf
- 大小:82.50 KB
- 文档页数:2
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提供了一些复位函数用于进行单片机的复位操作,这些函数包括: 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外部中断处理流程外部中断是指引发中断的事件来自于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中,可以根据需要调用其他的函数或执行其他的操作。
处理完成后,可以通过清除中断标志位和退出中断函数来结束中断处理。
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多行,感觉无从下手。
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标准外设固件库文件结构及用途文件夹树图及文件作用详述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表示外设名称。
在 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 却不可以相互打断!
。