当前位置: 首页 > article >正文

FreeRtos——24、STM32中断处理体系及软件定时器按键消抖

第一节:STM32中断处理体系结构1.中断处理路径:2.NVIC中断控制器的中断优先级2.1 中断号在NVIC中对于硬件产生的任何一个中断都分配了一个中断号中断号是一个唯一的标识符用于识别每个外设设备的中断。NVIC使用中断号来配置中断的优先级和使用的状态。如在F103数据手册上的介绍在向量表中列出的 位置Position实际上就是中断号IRQ number。这些中断号用于在嵌套向量中断控制器NVIC中配置和管理中断2.2 中断优先级组成NVIC中对中断优先级进行了分组优先级分别有两部分组成抢占优先级 子优先级抢占优先级决定了是否可以抢占。子优先级决定了优先级的处理顺序。中断的分组优先级的抢占优先级与子优先级大部分可由用户自行配置。如果未配置则使用默认值数据越小优先级越高。例如当两个相同的分组优先相同子优先不同的中断不会发生抢占而是按子优先级顺序依次执行。3.中断处理例程ISR对中断进行响应的函数又称中断服务例程是CPU中断当前任务保存现场后去执行的函数。在中断处理例程中要执行一些实时性高的操作不可以出现阻塞。也不允许在ISR使用可能出现阻塞的操作。对于每一个中断号,MCU的启动文件startup_stmf103c8t6.s的汇编启动文中已经定义好了相应的ISR中断全程函数的句柄。在启动文件中定义两部分中断的ISR,一部分是系统内置的中断服务例程的句柄另一部则是外部中断源的中例ISR大多也都是一些外设中断源的ISR句柄。4.__weak弱函数可实现的函数是一种函数回调的方式。__weak函数修饰符是ARM编译器中的一种语法形式。此函数可以实新实现类似于C虚函数。本质是个函数回调。在代码中重新实现即可。编译时会直接编译重新实现的函数。重点一句话以上讲解了很多的概念但是在开发中只需要搞清楚与中断事件对应的ISR的回调的__weak函数重新实现相关的ISR逻辑即可注册ISR的回调的函数中不可以有阻塞。5.HAL库快速配置GPIO引脚为中断复用引脚1. 看电路图使用cubeMX快速配置引脚复用使用EXTI14的NVIC中的中断功能。6.重写__weak函数实现ISR逻辑:实现按键响应的功能在小彩灯的驱动文件中重写相关中断句柄的回调的_weak函数即可实现中断控制的逻辑#include color_led_driver.h #include main.h //全采led灯的驱动 void color_led_set(uint8_t red, uint8_t green, uint8_t blue) { //红灯 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, (GPIO_PinState)!red); //绿灯 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, (GPIO_PinState)!green); //蓝灯 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, (GPIO_PinState)!blue); } //外部按键通过中断控制小彩灯驱动 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { //实现功能就是通过按键key是否按下来控制小彩灯 if(GPIO_Pin GPIO_PIN_14) { if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14))//抬起 { color_led_set(0,0,0); }else{//按下 color_led_set(1,0,1); } } }第二节、FreeRTOS中对中断上下文的处理由于材料的物理特性及电学特性当按键按下的瞬间会短时间出现电平的高低变化如图所示按键抖动的问题如何消抖下面介绍几种方式1. FreeRTOS软件定时器进行延时消抖1. 简述FreeRTOS定时器在RTOS调度启动时会自动创建一个空闲idle任务与一个定时器守护任务。那么定时器的功能就是由这个定时器守护任务执行相应的回调函数实现的。软件定时器有一个定时周期还有一个回调函数。根据回调函数执行的频度有两种类型的软件定时器单次定时器one-shot timer,即回调函数被执行一次后定时器停止工作。周期定时器periodic timer,回调函数会被循环执行定时器一直工作。2.定时器有休眠与运行两种状态休眠状态定时器使用xTimerCreate创建后就处于休眠状态单次定时器执行一次回调函数后进入休眠状态。定时器使用函数xTimerStop停止后进行休眠状态。运行状态处于运行状态的定时器在超时时间到达后就会执行其回调函数不定单次定时器还是周期定时器。定时器在以下几种状态下处于运行状态。使用函数xTimerStart启动后定时器进行运行状态。定时器在运行状态时被执行函数xTimerReset复位起始时间后继续处于运行状态。软件定时器的各种操作实际上是在FreeRTOS系统的定时器守护任务中完成的。3.软件定时器的机制与使用配置在用户任务里执行的各种定时器操作函数都是通过一个队列发送给这个定时器守护任务的所以这个执行同步的中间的队列也被称为定时器指令队列定时器守护任务读取定时器指令队列中的指令然后执行相庆的操作如图所示为了保证守护定时器任务可以得到时间片最好配置守护任务的调度优先级高于用户任务的优先级。同时如果要使用软件定时器需要在进行如下配置官方文档介绍即需要在FreeRTOSConfig.h中进行以上宏定义并指定合适的值。4. 软件定时器常用API接口函数1. 动态创建定时器timers.h TimerHandle_t xTimerCreate ( const char * const pcTimerName, const TickType_t xTimerPeriod, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ); 功能创建一个新的软件定时器实例 并返回一个可以引用定时器的句柄。 参数 pcTimerName 分配给定时器的可读文本名称。 这样做纯粹是为了协助 调试。 xTimerPeriod 定时器的周期。 以 tick 为单位指定此周期 宏 pdMS_TO_TICKS() 可用于将以毫秒为单位指定的时间转换为以 tick 为单位指定的时间。 uxAutoReload pdTRUE重新加载pdFALSE执行一次结束。 pvTimerID 分配给正在创建的定时器的标识符。传递给回调函数的参数。 pxCallbackFunction 定时器到期时调用的函数 返回值 如果定时器创建成功 则返回新创建的定时器的句柄。失败返回NULL; 当于此动态创建定时器也有静态创建定时器详阅官方文档。2.启动定时器阻塞版xTimerStart与非阻塞版xTimerStartFromISR1. BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xBlockTime ); 功能启动定时器在队列满后会阻塞当前调用任务。 参数 xTimer 正在启动/重新启动的定时器的句柄。 xBlockTime 在调用 xTimerStart() 时队列已满的情况下 指定调用任务应保持阻塞状态 以等待启动命令成功发送到定时器命令队列的时间 以 tick 为单位。 如果在 启动 RTOS 调度器之前调用 xTimerStop()则会忽略 xBlockTime 成功返回pdPASS,失败返回pdFAIL. 2. BaseType_t xTimerStartFromISR(TimerHandle_t xTimer, BaseType_t *pxHigherPriorityTaskWoken); 功能可从中断服务例程调用的 xTimerStart() 的非阻塞版本 参数 xTimer 正在启动/重新启动的定时器的句柄 pxHigherPriorityTaskWoken : 如果守护进程的优先级高于当前任务会返回pdTRUE如果为pdTRUE 那么应在中断退出前执行上下文切换这样可以让高优先级任度马上得到执行。 可以调用内核函数portYIELD_FROM_ISR(xHigherPriorityTaskWoken);出让时间片。 成功返回pdPASS,失败返回pdFAIL3.定时器运行中重置定时器函数xTimerReset 与xTimerResetFromISRtimers.h 1.BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xBlockTime ); 功能介绍xTimerReset() 重新启动先前使用 xTimerCreate() API 函数创建的定时器。 如果定时器已经启动且已处于活动状态 那么 xTimerReset() 会使定时器 重新评估其到期时间 因此到期时间与 xTimerReset() 的调用时间有关。 如果定时器处于休眠状态则 xTimerReset() 具有与 xTimerStart() API 函数等效的功能。 参数 xTimer 正在重置/启动/重新启动的定时器的句柄。 xBlockTime 队列满中的阻塞时间 返回值 成功返回pdPASS, 失败返回pdFAIL 2.BaseType_t xTimerResetFromISR(TimerHandle_t xTimer, BaseType_t *pxHigherPriorityTaskWoken); 功能与之reset阻塞版相同。 参数与start一样的参数功能 返回值与start一样的返回值。4.删除定时器xTimerDelete:BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xBlockTime ); 功能删除正在使用的定时器并回收内存。 成功返回pdPASS,失败返回pdTRUE5.定时器消抖实验实例演示配置FreeRTOSConfig.h:#define configUSE_QUEUE_SETS 1 #define configUSE_TIMERS 1 #define configTIMER_TASK_PRIORITY configMAX_PRIORITIES-1 #define configTIMER_QUEUE_LENGTH 10 #define configTIMER_TASK_STACK_DEPTH 256freeRTOS.c://添加定时器对象并动态创建定时器 TimerHandle_t mykeyTimer; mykeyTimer xTimerCreate(mykeytimer,10, pdFALSE, NULL, mykeyTimer_function); configASSERT(mykeyTimer);key_app.c:#include key_app.h #include timers.h extern TimerHandle_t mykeyTimer; //外部按键通过中断控制小彩灯驱动 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { //实现功能就是通过按键key是否按下来控制小彩灯 if(GPIO_Pin GPIO_PIN_14) { BaseType_t status pdFALSE; //复位定时器 xTimerResetFromISR(mykeyTimer,status); if(status pdTRUE) { portYIELD_FROM_ISR(status); } } } //超时处理函数 void mykeyTimer_function( TimerHandle_t xTimer ) { if(isKeyPress()) { color_led_set(1,0,1); } else{ color_led_set(0,0,0); } }2.FreeRTOS同步机制处理需要延时处理的中断下文以FreeRTOS中最简洁的同步方式任务通知进行消抖freeRTOS.c:xTaskCreate(mykey_dithering, mykey_dithering, 256, NULL, osPriorityNormal,key_dithering_taskhandle ); configASSERT(key_dithering_taskhandle);key_app.c:#include key_app.h #include timers.h #include stdbool.h extern TaskHandle_t key_dithering_taskhandle; // 外部按键通过中断控制小彩灯驱动 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { // 实现功能就是通过按键key是否按下来控制小彩灯 if (GPIO_Pin GPIO_PIN_14) { BaseType_t status pdFALSE; // 发出任务的通知 xTaskNotifyFromISR(key_dithering_taskhandle, 0, eNoAction, status); if (status pdTRUE) { portYIELD_FROM_ISR(status); } } } void mykey_dithering(void *arg) { uint32_t data 0; while (true) { // 等待通知 xTaskNotifyWait(pdFALSE, pdFALSE, data, portMAX_DELAY); //阻塞10ms,过滤杂波 vTaskDelay(10); if (isKeyPress()) { color_led_set(1, 0, 1); } else { color_led_set(0, 0, 0); } } }

相关文章:

FreeRtos——24、STM32中断处理体系及软件定时器按键消抖

第一节:STM32中断处理体系结构1.中断处理路径:2.NVIC中断控制器的中断优先级:2.1 中断号:在NVIC中对于硬件产生的任何一个中断都分配了一个中断号,中断号是一个唯一的标识符,用于识别每个外设设备的中断。NVIC使用中断号来配置中断…...

手把手教你学Simulink——基于Simulink的模型预测控制(MPC)PFC整流器快速动态响应

目录 手把手教你学Simulink ——基于Simulink的模型预测控制(MPC)PFC整流器快速动态响应 一、问题背景 二、系统建模与控制目标 1. 单相 Boost PFC 拓扑 2. 动态方程(αβ 静止坐标系) 3. 控制目标 三、有限控制集 MPC(FCS-MPC)设计 1. 预测模型(离散化) 2. 代…...

ViT图像分类-中文-日常物品完整指南:4090D单卡环境配置与中文类别映射说明

ViT图像分类-中文-日常物品完整指南:4090D单卡环境配置与中文类别映射说明 想试试用AI模型来识别你手机里的照片吗?比如,拍一张桌上的水杯、键盘或者零食,让模型告诉你它是什么。今天要介绍的这个工具,就能帮你轻松实…...

微信小程序语音交互实战:长按录制与点击播放的完整实现方案

1. 微信小程序语音交互功能概述 语音交互已经成为现代移动应用不可或缺的功能之一。在微信小程序中实现语音录制与播放,能够极大提升用户体验,特别适合社交、教育、工具类小程序。我最近在一个社交类小程序项目中实现了完整的语音交互模块,踩…...

用STM32F103C8T6和F9P模组DIY一台RTK无人车:从蓝牙遥控到自主导航的保姆级教程

用STM32F103C8T6和F9P模组打造高精度RTK无人车:从零构建到自主导航全流程解析 在创客圈子里,能够自主导航的智能小车一直是热门项目。但传统基于普通GPS的方案定位精度往往在米级徘徊,难以实现真正的精准控制。而将RTK(实时动态定…...

终极Cursor Pro解锁指南:免费体验AI编程助手的完整解决方案

终极Cursor Pro解锁指南:免费体验AI编程助手的完整解决方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached you…...

小白友好!Stable Diffusion v1.5单卡运行多个服务,详细步骤+避坑指南

小白友好!Stable Diffusion v1.5单卡运行多个服务,详细步骤避坑指南 1. 为什么需要单卡多服务? 很多刚接触Stable Diffusion的朋友都会遇到这样的困扰:团队里几个人共用一台服务器,但GPU卡只有一张。一个人用的时候还…...

ai辅助硬件设计:让快马智能解析并生成db9接口与mcu连接的完整原理图与代码

在硬件开发中,DB9接口的设计与连接是个常见但容易出错的环节。最近我在一个嵌入式项目里需要实现STM32与DB9接口的RS-232通信,发现传统设计流程存在几个痛点: 引脚定义容易混淆 DB9公头和母头的引脚定义是相反的,比如母头的2号引脚…...

VoxCPM-1.5-WEBUI问题解决:部署常见错误与一键启动脚本详解

VoxCPM-1.5-WEBUI问题解决:部署常见错误与一键启动脚本详解 1. 快速入门指南 1.1 镜像部署准备 在开始使用VoxCPM-1.5-WEBUI之前,您需要确保具备以下条件: 支持CUDA的NVIDIA显卡(建议RTX 3060及以上)至少16GB系统内…...

深入解析cufftPlanMany:从参数配置到高效FFT实现

1. 为什么需要cufftPlanMany? 第一次接触CUDA FFT时,很多人都是从cufftPlan1d、cufftPlan2d这些基础接口开始的。但当你真正处理实际工程问题时,会发现这些简单接口远远不够用。比如要处理批量信号、非连续内存数据、子区域FFT计算等场景时&a…...

告别手动处理:用快马AI一键生成你的专属批量链接效率工具

最近在整理项目文档时,经常需要处理大量杂乱无章的链接。手动一个个检查、格式化这些链接不仅耗时耗力,还容易出错。于是我开始寻找更高效的解决方案,最终在InsCode(快马)平台上快速实现了一个批量链接处理工具,整个过程比想象中简…...

QMCDecode:让音乐自由播放的开源格式转换工具

QMCDecode:让音乐自由播放的开源格式转换工具 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换结果存…...

Gemma-3-270m内网穿透部署方案

Gemma-3-270m内网穿透部署方案:安全打通企业AI服务 想象一下这个场景:你们公司的研发团队刚刚在内部服务器上部署了轻量高效的Gemma-3-270m模型,准备用它来优化客服工单分类、自动生成产品文档。模型跑起来了,效果也不错&#xf…...

4个维度解析Lenovo Legion Toolkit:游戏本性能管理的轻量革命

4个维度解析Lenovo Legion Toolkit:游戏本性能管理的轻量革命 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit 1.…...

LFM2.5-1.2B-Thinking-GGUF算法解析应用:图解经典算法与复杂度分析

LFM2.5-1.2B-Thinking-GGUF算法解析应用:图解经典算法与复杂度分析 1. 算法可视化教学新范式 算法学习一直是计算机科学教育中的难点。传统的教科书讲解方式往往让初学者感到抽象难懂,而LFM2.5-1.2B-Thinking-GGUF模型为算法教学带来了全新的可视化解决…...

如何用开源工具实现3D打印钥匙自由?从参数测量到模型生成的实践路径

如何用开源工具实现3D打印钥匙自由?从参数测量到模型生成的实践路径 【免费下载链接】keygen OpenSCAD tools for generating physical keys 项目地址: https://gitcode.com/gh_mirrors/ke/keygen 在数字化制造蓬勃发展的今天,3D打印技术正逐步走…...

龙虾agent-browser获得chromium包问题

小龙虾非常火爆,在装agent-browser的时候,普通人往往被chromium的安装堵死了。网上的跨域安装方法一大堆,包括用镜像站点,国内所有的镜像站点都不行。但是真正能走通的,我到最后也没有试出来。最后只能自己想出一种手动…...

Obsidian图像转换:提升笔记效率的格式优化解决方案

Obsidian图像转换:提升笔记效率的格式优化解决方案 【免费下载链接】obsidian-image-converter ⚡️ Convert, compress, resize, annotate, markup, draw, crop, rotate, flip, align images directly in Obsidian. Drag-resize, rename with variables, batch pro…...

Realistic Vision V5.1效果展示:这些惊艳的人像作品都是AI生成的

Realistic Vision V5.1效果展示:这些惊艳的人像作品都是AI生成的 1. 当AI画师遇上专业摄影师 你有没有见过这样的AI生成人像?皮肤纹理清晰到能看见毛细血管,发丝在阳光下呈现自然的半透明质感,眼神光的位置精准符合物理反射规律…...

Path of Building PoE2:零基础掌握流放之路2角色规划工具实战指南

Path of Building PoE2:零基础掌握流放之路2角色规划工具实战指南 【免费下载链接】PathOfBuilding-PoE2 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2 你是否曾遇到这样的困境:花费数小时规划的角色build&#xff0c…...

一站式屏幕神器eSearch:如何5分钟打造你的智能工作流?

一站式屏幕神器eSearch:如何5分钟打造你的智能工作流? 【免费下载链接】eSearch 截屏 离线OCR 搜索翻译 以图搜图 贴图 录屏 万向滚动截屏 屏幕翻译 Screenshot Offline OCR Search Translate Search for picture Paste the picture on the screen Scree…...

【大英赛】2009-2026年大英赛ABCD类历年真题、样卷、听力音频及答案PDF电子版

2026年大英赛将于4月12日9:00—11:00举行,开始倒计时啦!小编整理了最新的2009-2026年大学生英语竞赛(大英赛NECCS)ABCD类历年真题、样卷、听力音频及答案解析,PDF电子版,可下载打印! 资料下载&a…...

不止于超市:用QGIS缓冲区+叠置分析,为你的奶茶店、自习室找个好位置

从奶茶店到自习室:QGIS空间分析赋能小微商业选址决策 走在街头,你是否好奇为什么某些奶茶店总是门庭若市,而几步之隔的同类店铺却冷冷清清?商业选址从来不是简单的"地段好"三个字能概括的。对于资金有限的小微创业者来说…...

鸿蒙应用开发实战:手把手教你封装一个可复用的音乐播放器管理类(ArkTS版)

鸿蒙应用开发实战:构建高可复用的音乐播放器管理类(ArkTS版) 在鸿蒙应用开发中,音频播放功能是许多应用的核心需求。本文将深入探讨如何设计一个健壮、可复用的音乐播放器管理类,采用ArkTS语言实现,帮助开发…...

讲透RenderTarget · 第一章:RenderTarget 是什么

**欢迎新朋友点赞、关注、收藏三连。第一章:RenderTarget 是什么一句话概括: RenderTarget 就是 GPU 的"画布"——不一定画在屏幕上,可以画在任何一块显存里。⏱ 30 秒概览RenderTarget(RT) GPU 可以写入像素…...

Windows自定义部署神器:从零开始的安装介质制作指南

Windows自定义部署神器:从零开始的安装介质制作指南 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat 你是否…...

从idea ai插件到在线原型:用快马平台快速构建你的智能代码生成器

最近在开发中频繁使用IDEA的AI插件辅助编码,发现这类工具能大幅减少重复劳动。但插件功能往往局限于当前IDE环境,于是萌生了一个想法:能否把这种智能生成能力搬到线上,做成一个轻量级的Web工具?经过在InsCode(快马)平台…...

比特币钱包密码与助记词恢复实战指南:6大核心模块掌握btcrecover全功能

比特币钱包密码与助记词恢复实战指南:6大核心模块掌握btcrecover全功能 【免费下载链接】btcrecover An open source Bitcoin wallet password and seed recovery tool designed for the case where you already know most of your password/seed, but need assista…...

如何高效使用Super IO插件:Blender批量导入导出终极指南

如何高效使用Super IO插件:Blender批量导入导出终极指南 【免费下载链接】super_io blender addon for copy paste import / export 项目地址: https://gitcode.com/gh_mirrors/su/super_io 想要在Blender中实现一键导入导出模型和图像吗?Super I…...

3大焕新方案:老旧iOS设备性能重生全指南

3大焕新方案:老旧iOS设备性能重生全指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 老旧iOS设备随着系统…...