新闻详情

新闻详情

首页 / 资讯中心 / 详情

STM32+FreeRTOS+RTC时钟实验笔记

发布时间:2026/9/28 7:47:25来源:尧图网络
STM32+FreeRTOS+RTC时钟实验笔记
实验目标在STM32f103C8T6上配置RTC时钟并通过FreeFTOS调用时钟任务实现RTC时钟的使用。实验使用RTC.c/.h代码原文件来自原子哥标准库例程。分析例程中包含的函数共如上八个。除去RTC闹钟一共七个。先来理清RTC时钟需要的七个函数。在初始化阶段需要做的事如上。要从裸机改为FreeRTOS实现RTC时钟大多数函数都不需要改变可以复用。我们需要修改的主要是中断服务函数和新增的任务函数。因为裸机使用单循环的方式执行任务而RTOS则使用时间片轮转的方式出于实时性要求我们不能和原来一样在中断函数中执行耗时较多的事比如这里的RTC_Get();和printf();FreeRTOS运行过程在中断服务函数中一般只做两件事发送信号和清标志位。这里也很好理解使用一个二值信号量进中断了发送信号xSemaphoreGiveFromISR()让RTC_task来执行然后清除标志位。void RTC_IRQHandler(void) { if (RTC_GetITStatus(RTC_IT_SEC) ! RESET)//秒钟中断 { RTC_Get();//更新时间 } if(RTC_GetITStatus(RTC_IT_ALR)! RESET)//闹钟中断 { RTC_ClearITPendingBit(RTC_IT_ALR); //清闹钟中断 RTC_Get(); //更新时间 printf(Alarm Time:%d-%d-%d %d:%d:%d\n,calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//输出闹铃时间 } RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW); //清闹钟中断 RTC_WaitForLastTask(); }下面是一个大概的逻辑示意图。RTC硬件每秒触发中断中断服务函数发送xSemaphoreGiveFromISR()信号并清标志位。下方的RTC_task一直在循环等待信号的到来一旦接收到信号执行任务命令。void RTC_IRQHandler(void) { BaseType_t xHigherPriorityTaskWoken pdFALSE; if (RTC_GetITStatus(RTC_IT_SEC) ! RESET)//秒钟中断 { xSemaphoreGiveFromISR(rtcSemaphore, xHigherPriorityTaskWoken); // 在中断服务程序中释放信号量 RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW); //清秒钟中断标志 } if(RTC_GetITStatus(RTC_IT_ALR)! RESET)//闹钟中断 { xSemaphoreGiveFromISR(rtcSemaphore, xHigherPriorityTaskWoken); // 在中断服务程序中释放信号量,可以再加闹钟信号来处理闹钟逻辑 RTC_ClearITPendingBit(RTC_IT_ALR); //清闹钟中断 } RTC_WaitForLastTask(); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } void RTC_task(void *pvParameters) { while(1) { // 阻塞等待信号量ISR 每秒 give 一次 if (xSemaphoreTake(rtcSemaphore, portMAX_DELAY) pdTRUE) { RTC_Get(); // 更新时间 RTC_PrintTime(); // 打印时间 } } }需要注意的是原来的抢占优先级为0不符合FreeRTOS的要求这里改成configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY这个宏来自FreeRTOS可以理解为FreeRTOS下可以设的合理最高优先级。static void RTC_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel RTC_IRQn; //RTC全局中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY; //configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY这是一个“人类可读”的逻辑值专为 NVIC_SetPriority 这类库函数准备数值通常比较小比如 5 NVIC_InitStructure.NVIC_IRQChannelSubPriority 0; //先占优先级0位,从优先级4位 NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; //使能该通道中断 NVIC_Init(NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 }实验结果如下所示。总结在设置任务前先理清要做的事的调用关系这样修改任务和中断函数就会快很多。没有来得及实现OLED显示功能可以加强一下。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

迪文T5L平台C51开发实战:双核架构、DGUS变量地址与工程化避坑指南 2026/9/28 21:28:00

迪文T5L平台C51开发实战:双核架构、DGUS变量地址与工程化避坑指南

1. 迪文T5L平台选型与整体架构拆解1.1 为什么是T5L加C51这套组合第一次接触迪文T5L平台的开发者,最常问的一个问题就是:都什么年代了,为什么还要用C51?我刚开始也有这个疑惑,毕竟现在随便一颗Cortex-M0都比传统8051内核…

阅读更多 →
别让探棒拖后腿:示波器探棒选型、校准与替代方案全解析 2026/9/28 21:27:59

别让探棒拖后腿:示波器探棒选型、校准与替代方案全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
迪文T5L平台C51与DGUS实战:从零搭建工程到ICL素材处理 2026/9/28 21:27:59

迪文T5L平台C51与DGUS实战:从零搭建工程到ICL素材处理

1. 为什么T5L平台值得单独写一篇实战指南迪文的T5L芯片在工业串口屏圈子里算是一个分水岭式的产品。早些年做串口屏项目,要么用指令集屏,发一堆十六进制指令去画控件,改个界面就得重新算坐标;要么用组态软件生成配置,灵…

阅读更多 →
RISC-V在AI算力爆发下的破局逻辑与进阶路径 2026/9/28 21:27:52

RISC-V在AI算力爆发下的破局逻辑与进阶路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
基于MSPM0G3507的循迹小车实战:PID调参与电赛H题避坑指南 2026/9/28 21:27:39

基于MSPM0G3507的循迹小车实战:PID调参与电赛H题避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
孪生神经网络与VGG16结合的点选验证码识别实践 2026/9/28 21:27:33

孪生神经网络与VGG16结合的点选验证码识别实践

简介:面向Python与深度学习初、中级学习者的孪生神经网络点选识别项目,以图片对相似度判断为核心实现点选验证码破解思路,适合用作毕设、课程设计或工程实训基线。压缩包共13个文件,约67.23MB,包含Python训练/预测脚本…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉