打印
[STM32MP1]

STM32 的中断管理与实时操作系统

[复制链接]
446|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
4c1l|  楼主 | 2024-12-9 15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 STM32 系列微控制器中,中断管理是一个关键的功能,能够确保系统及时响应外部事件,实时性要求较高的应用尤其依赖于有效的中断管理。与此同时,在嵌入式系统中,使用实时操作系统(RTOS)如 FreeRTOS,可以进一步增强任务管理、资源分配和中断处理的效率。

介绍 STM32 中的中断管理和如何在 STM32 上实现一个简单的 RTOS,如 FreeRTOS,用于管理任务和中断。

STM32 中断管理
1.1 中断控制与管理概述
STM32 使用 嵌套向量中断控制器(NVIC,Nested Vectored Interrupt Controller)来管理中断。NVIC 可以管理 256 个中断源,并支持中断优先级的配置和中断嵌套。STM32 的中断系统提供了灵活的机制来处理多个外设、定时器等触发的中断。

1.2 NVIC 结构与中断优先级
1.2.1 中断优先级设置
STM32 提供了两层中断优先级机制:抢占优先级(Preemption Priority)和 响应优先级(Subpriority)。抢占优先级决定了哪个中断可以抢占另一个中断,而响应优先级决定了在同一层优先级的中断发生时的处理顺序。

抢占优先级:决定了一个中断是否可以打断另一个中断。
响应优先级:当两个中断优先级相同且都处于等待状态时,哪个中断先响应。
STM32 的中断优先级范围通常是 0 到 15,0 为最高优先级。

1.2.2 中断优先级配置
在 STM32 中,优先级配置是通过 NVIC 来实现的。可以通过 STM32 HAL 库提供的 HAL_NVIC_SetPriority() 和 HAL_NVIC_EnableIRQ() 函数来配置中断的优先级和启用中断。

代码示例:配置中断优先级
c
复制代码
// 配置外部中断线 EXTI0 的优先级
HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); // 设置抢占优先级为 1,响应优先级为 0
HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 启用 EXTI0 中断

使用特权

评论回复
沙发
4c1l|  楼主 | 2024-12-9 15:04 | 只看该作者
嵌套中断
STM32 支持中断嵌套,即高优先级的中断可以中断低优先级的中断。当高优先级的中断正在处理中时,低优先级的中断会被挂起,直到高优先级的中断完成。

嵌套中断启用:通过配置 NVIC 寄存器的 IPR 来启用或禁止中断嵌套。
嵌套中断的应用:可以确保对关键任务的快速响应(例如外部传感器中断、定时器中断等)。
代码示例:启用嵌套中断
c
复制代码
// 启用中断嵌套
HAL_NVIC_SetPriority(TIM2_IRQn, 2, 0); // 设置定时器 2 中断优先级
HAL_NVIC_EnableIRQ(TIM2_IRQn);          // 启用定时器 2 中断

使用特权

评论回复
板凳
4c1l|  楼主 | 2024-12-9 15:04 | 只看该作者
实时操作系统简介
2.1 什么是实时操作系统?
实时操作系统是一种操作系统,它能够保证任务在预定的时间内完成,并且通常具有任务调度、资源管理、时间管理和中断处理等特性。RTOS 主要用于要求高实时性的嵌入式系统中。FreeRTOS 是一个广泛应用的开源 RTOS,适用于 STM32 等微控制器,支持任务管理、时间片轮转调度、中断服务和消息传递等功能。

2.2 FreeRTOS 在 STM32 上的应用
2.2.1 FreeRTOS 的基本构件
任务:任务是 FreeRTOS 中的基本单元,每个任务对应一个线程。任务通常用于执行周期性或响应性的操作。
队列:队列用于任务之间的数据传递,任务可以向队列发送数据,或者从队列中接收数据。
信号量:信号量用于控制共享资源的访问,防止资源冲突。
软件定时器:用于周期性地触发某些操作。
2.2.2 FreeRTOS 的任务调度
FreeRTOS 提供了抢占式和非抢占式调度两种方式。抢占式调度可以确保更高优先级的任务能打断较低优先级的任务。任务调度使用优先级来决定哪个任务获得 CPU 时间片。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

620

帖子

2

粉丝