stm32中断学习篇(1)——以定时器为例

发布者:世界因你而精彩最新更新时间:2022-07-15 来源: csdn关键字:stm32  中断学习  定时器 手机看文章 扫描二维码
随时随地手机看文章

ARM coretex_m3内核支持256个中断和可编程256级中断优先级设置。

Stm32的NVIC是coretex_m3的NVIC的子集。

Stm32目前支持84个中断和16级可编程中断优先级。仅使用中断优先级设置8位中的高四位。

每个中断对应一个外围设备,每个外围设备包括许多个引起中断的中断源或中断事件。这些中断源与中断事件都要通过指定的中断通道向内核申请中断。中断通道的优先级确定设备整体的优先级,而设备本身的多个中断执行顺序由用户的中断服务程序决定。


Stm32的68个外部中断通道固定分配给相应的外部设备。每个终端通道都具备自己的中断优先级控制字节PRI_n(8位,用高四位),每四个通道构成一个32位优先级寄存器。总共17个32位的优先级寄存器。

抢先优先级和子优先级

上表中断优先级寄存器的配置需在初始化时写入到一个32位寄存器AIRC(Application Interrupt and Reset Control Register)的第[10:8]这三位中,这三位叫做PRIGROUP。


假如写入的是0x04(即011)到PRIGROUP中,则有8个抢先式优先级和两个子优先级。

当上电Reset后,寄存器AIRC中的PRIGROUP值为0,既有16个抢先优先级,无子优先级。

PRIGROUP

对于某一个外部中断通道,有相应的控制字和控制位,用于单独的和总的控制该中断通道:

中断优先级控制字:PRI_n;

中断允许设置位:在ISER寄存器中;

中断允许清除位:在ICER寄存器中;

中断悬挂pending位置位:在ISER寄存器中;

中断悬挂pending为清除:在ICER寄存器中;

正在被服务的中断标志位:在IABR寄存器中。只读,用来了解当前内核正在处理哪个中断通道。


这些都是在NVIC寄存器中配置。


详细步骤(以TIME2为例)

NVIC_InitTypeDef NVIC_InitStructure;

//该结构体中有四个成员,分别为:

// uint8_t NVIC_IRQChannel; 中断通道

// uint8_t NVIC_IRQChannelPreemptionPriority; 抢先优先级

// uint8_t NVIC_IRQChannelSubPriority; 子优先级

// FunctionalState NVIC_IRQChannelCmd; 中断使能

1.设置寄存器AIRC中PRIGROUP的值,规定抢占优先级和子优先级的个数:

//选择中断分组1(即编号6)

//NVIC_PriorityGroup_1|0-1|0-7|1 bits for pre-emptionpriority|3 bits for subpriority

//即有2个抢先优先级和6个子优先级

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


设置TIME2本身的寄存器,允许相应中断。如允许UIE。

//选择TIM2的中断通道

//在stm32f10x.h这个文件中,定义了一系列的中断通道,

//并以结构体的形式报存,并针对18以后的位置以版本型号加以区分,

//与手册中相对应。

//有STM32F10X_LD、STM32F10X_LD_VL、STM32F10X_MD、STM32F10X_MD_VL、

// STM32F10X_HD、STM32F10X_HD_VL、STM32F10X_XL、STM32F10X_CL、

//其中TIME_IRQn是28,TIM2 global Interrupt,与手册对应了起来。


NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;


设置TIME2中断通道的抢先优先级和子优先级(IP[28],在NVIC中)。

//抢占式中断优先级设置为0

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

//子优先级设置为0

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;


设置允许TIME2中断通道,在NVIC寄存器组的ISER寄存器的一位。

//使能中断

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

//将上述参数写入寄存器

NVIC_Init(&NVIC_InitStructure);


2.当TIME2的UIE条件成立(更新,上溢或下溢),硬件将TIME2的UIE中断标志位置位。内核硬件将TIME2的pending置位,表示TIME2有中断申请。

如果当前有高于TIME2的中断在执行,则保持pending,还可以通过软件将ICPR寄存器中相应位清除掉。

如果内核有空,开始相应TIME2中断。硬件将相应标志位置位,同时硬件清除TIME2的pending。

3.通过软件将TIME2具体事件的中断标志位清除。判断哪个是TIME2的具体事件中断,并转移到相应的代码段。

如果TIME2本身中断事件多于2,其先后顺序由程序员的中断服务决定。

4.执行完中断服务后,进入中断返回过程:硬件将IABR寄存器相应标志位清除,表示本中断处理完成。如果TIME2本身还有中断标志位,表示TIME2还有中断在申请,则重新将TIME2的pending置位1,等待再次进入TIME2的中断服务。

关键字:stm32  中断学习  定时器 引用地址:stm32中断学习篇(1)——以定时器为例

上一篇:STM32 USB如何配置多个CDC设备---5个CDC设备
下一篇:关于STM32的ADC/DAC问题汇总

推荐阅读最新更新时间:2024-11-03 11:52

51单片机学习笔记:定时器产生PWM可调方波,控制led灯亮度
使用定时器T0产生PWM方波, 用按键调整占空比,20级可调 控制led灯的亮度等级. C代码 #include my51.h #include timer0.h #define grading 20 //亮度20级变化 sbit keyS3=P3^5; //按键调整占空比,PWM_keyChange++ sbit keyS4=P3^6; // PWM_keyChange-- u8 PWM_keyChange=10; //初值,按键调整在1~20之间变化 //占空比 PWM_key
[单片机]
51单片机<font color='red'>学习</font>笔记:<font color='red'>定时器</font>产生PWM可调方波,控制led灯亮度
STM32开发笔记57: 复位电路设计
本篇文章针对所有的STM32芯片,网上有不少文章叙述了有关STM32复位电路的相关内容,也有很多推荐电路,例如ALIENTEK给出的复位电路,如下图所示。 不过还有一些推荐电路,不需加上拉电阻,或者电容也不加,那到底应该如何设计呢?还需看一下官方手册的推荐电路,如下图所示。 可看到,复位电路具有内部上拉电阻,外部只需接0.1uf电容即可,不需在外部电路上拉10K电阻,上拉后只会使上拉电阻变小,减小复位时间,或会导致复位不正常。内部上拉电阻阻值和其它参数如下表所示,供参考。
[单片机]
<font color='red'>STM32</font>开发笔记57: 复位电路设计
STM32读写IO时间测试
本文分别通过操作寄存器和调用库函数的方式,对比测试STM32读写IO时间。 硬件环境 主控芯片:STM32F103ZET6 外部晶振:8MHZ 系统主频:72MHZ 1.操作寄存器的方式读取IO 软件在线调试界面 示波器输出波形 分析:在while(1)中循环翻转PA3输出电平。 通过在线调试的方式,可以看出1条C语句: GPIOA - BSRR = 1 3; //PA3 输出高电平 对应3条汇编指令:MOVS r0,#0x08 ;把立即数0x08传送给寄存器r0 LDR r1, ;从地址(PC+8)处读取一个字到寄存器r1 STR r0, ;把r
[单片机]
<font color='red'>STM32</font>读写IO时间测试
stm32手持设备设计与制作
stm32作为现在最流行的单片机,广泛应用与各个领域。现在的手持设备也经常用stm32作为主控芯片。手持设备一般带有显示器、数据存储单元、按键、蜂鸣器这几个最常见的部分。 以上设备就是把电路板装进去的效果,由于涉嫌本人的项目隐私,给大家打了马赛克。 下面,我把电路板的原理图和电路板PCB一一奉献给大家。 1.stm32主控mcu电路 2.电源电路图 3.液晶屏电路图 4.EEPROM部分 5.FLASH部分 6.矩阵键盘部分 7.蜂鸣器部分 8.无线通信部分(可做远程遥控) 9.完整的原理图 10.制作好的PCB图
[单片机]
<font color='red'>stm32</font>手持设备设计与制作
STM32学习——ROV遇到的坑
(1)USART 1.使能串口前必须清除TC位,否则后面多路采集ADC时就凉了。。。 USART_ClearFlag(USART2, USART_FLAG_TC); USART_Cmd(USART2, ENABLE); //使能串口2 2.查询等待方式发送数据时需要先清TC,否则会丢失第一个数据 void Send_Buf(u8* Data_Buf) { u32 i; USART_ClearFlag(USART1,USART_FLAG_TC); for(i=0;i USART2_REC_LEN;i++) { USART_SendData(USART1,Data_Buf
[单片机]
STM32串口中断接收方式详细比较
本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈。。。 实例一: void USART1_IRQHandler(u8 GetData) { u8 BackData; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生 { USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志. GetData = UART1_GetByte(BackData); //也行GetData=USART1- DR; USART1_SendByte(GetDa
[单片机]
STM32设置时钟的操作方法和步骤
本文的目录结构如下: 1、STM32F407 的时钟来源 1.1、HSI 时钟 1.2、HSE 时钟 1.3、主 PLL 时钟 2、时钟树 3、配置系统时钟 3.1、系统时钟有关寄存器 3.2、使用系统的默认配置 3.3、系统时钟配置所用到的相关宏定义 3.4、SystemInit( )函数 3.5、SetSysClock( )函数 3.6、自行配置时钟 对于STM32这款单片机,现在是越来越多的人熟悉和使用它了。在很多的项目和产品中都有它的身影,以及现在很多的大学课程都是用STM32开展教学了,已经是应用很广泛了。 想当初我在大学的时候,上课教的还是51单片机,而且还是老师照着课本念的。当时做的第一个单片机产品还是用51单片机做
[单片机]
<font color='red'>STM32</font>设置时钟的操作方法和步骤
STM32串口接收发送子程序
/*上传STM32串口接收发送子程序,调试验证OK,供参考*/ #include STM32_UartImpl.h static UART_HandleTypeDef* pstm32uart_entry = NULL; int STM32_SendBuffer(const char* pcmd); const char* STM32_GetBuffer(void); #define UART__TIMEOUT 500 void WaitSTM32UartReady() { HAL_UART_StateTypeDef status; do { status = HAL_UART_GetState(pstm
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved