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

STM32CUBEMX_创建时间片轮询架构的软件框架

STM32CUBEMX_创建时间片轮询架构的软件框架

说明:
1、这种架构避免在更新STM32CUBEMX配置后把用户代码清除掉
2、利用这种时间片的架构可以使得代码架构清晰易于维护
创建步骤:
1、使用STM32CUBEMX创建基础工程
2、新建用户代码目录
3、构建基础的代码框架

1、使用STM32CUBEMX创建基础工程

选择外部高速时钟
在这里插入图片描述
配置下载调试接口
在这里插入图片描述
配置时钟线
在这里插入图片描述
开一个只有定时功能的定时器(中断1ms)
在这里插入图片描述
配置工程
在这里插入图片描述

2、新建用户代码目录

打开KEIL工程
在这里插入图片描述
创建两个文件夹目录
在这里插入图片描述
把实际的这两个目录文件夹从别的工程拷贝到本工程根目录下或者是自己新建
在这里插入图片描述
添加文件
在这里插入图片描述
添加文件之后的实际效果
在这里插入图片描述
包含头文件
在这里插入图片描述
必须要勾选microlib才能打印日志
在这里插入图片描述

然后写一个闪灯的测试程序可以发现整个工程按照我们的意愿编译成功并且可以正常运行

3、构建基础的代码框架

在这里插入图片描述
mymain.c

#include "mymain.h"
#include "main.h"
#include "gpio.h"
//#include "adc.h"
//#include "i2c.h"
#include "tim.h"
//#include "usart.h"
//#include "uart_lcd.h"
//#include "encoder.h"
//#include "uart_485.h"
#include "board.h"
//#include "eeprom.h"
//#include "led.h"
//#include "dma.h"/*************时间片轮转数组结构体*************/
system_task_t task_array[SYSTEM_TASK_MAX_NUM] = {
//	{0,0,0,50,uart_lcd_task},
//	{0,0,0,20,encoder_task},
//	{0,0,0,1,uart_485_task},{0,0,0,500,board_task}
//	{0,0,0,500,led_task},
//	{0,0,0,100,eeprom_24c64_task}
};int main(void)
{
//	SCB->VTOR = FLASH_BASE | 0x14000;	HAL_Init();SystemClock_Config();//配置外部高速时钟MX_GPIO_Init();//GPIO口初始化//	MX_DMA_Init();
//	MX_ADC1_Init();
//	
//  MX_I2C1_Init();
//	MX_I2C2_Init();
//	
//	MX_TIM1_Init();
//  MX_TIM2_Init();
//  MX_TIM3_Init();
//	MX_TIM4_Init();
//  MX_TIM5_Init();MX_TIM6_Init();
//	
//  MX_USART1_UART_Init();
//  MX_USART2_UART_Init();system_init();while (1){
//		Debug_printf("StartDefaultTask:%f",1.153);
//		Debug_info("StartDefaultTask:%d",253);
//		Debug_debug("StartDefaultTask:%f",3.153);
//		Debug_warning("StartDefaultTask:%f",4.153);
//		Debug_error("StartDefaultTask:%f",5.153);
//		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_SET);
//		HAL_Delay(500);
//		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_RESET);
//		HAL_Delay(500);for(int i = 0; i < SYSTEM_TASK_MAX_NUM; i++)	//任务状态判断执行{if(task_array[i].taskStatus == 1){                            task_array[i].task_function();task_array[i].taskCount = 0; task_array[i].taskStatus = 0;} }}
}void system_init(void)
{
//	HAL_Delay(2000);	//等待串口屏启动完成
//	eeprom_24c64_init();
//	board_init();
//	uart_485_init();
//	uart_lcd_init();
//	led_init();
//	
//	HAL_TIM_Base_Start_IT(&htim1);HAL_TIM_Base_Start_IT(&htim6);
//	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
//	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL

mymain.h

#ifndef __MYMAIN_H
#define __MYMAIN_H
#include "log.h"extern void SystemClock_Config(void);#define SYSTEM_TASK_MAX_NUM 1	//任务数量typedef struct system_task
{unsigned char taskStatus;			//任务运行状态unsigned char taskPriority; 	//任务运行优先级unsigned int  taskCount;			//任务运行中计数unsigned int  taskInterva1;		//任务运行时间间隔(单位:ms)void (* task_function)(void);	//任务运行的回调函数
}system_task_t;void system_init(void);#endif

board.c

#include "board.h"void board_init(void)
{BOARD_LED_OFF;
//	BOARD_FUN_SPEED;
}void board_task(void)
{BOARD_LED_CYCLE;Debug_printf("system run ......\r\n");
}

board.h

#ifndef __BOARD_H
#define __BOARD_H
#include "main.h"
#include "log.h"
#include "tim.h"/********1~5档位,档位越高风扇转速越高*******/
enum{board_fun_one = 3600,board_fun_two = 2700,board_fun_three = 1800,board_fun_four = 1200,board_fun_five = 600,
};#define BOARD_PIN_LED 		GPIO_PIN_8
#define BOARD_LED_ON 			HAL_GPIO_WritePin(GPIOE, BOARD_PIN_LED, GPIO_PIN_RESET)
#define BOARD_LED_OFF 		HAL_GPIO_WritePin(GPIOE, BOARD_PIN_LED, GPIO_PIN_SET)
#define BOARD_LED_CYCLE		HAL_GPIO_TogglePin(GPIOE, BOARD_PIN_LED)//#define BOARD_FUN_SPEED		__HAL_TIM_SET_COMPARE(&htim5,TIM_CHANNEL_1,board_fun_three);	//板载风扇转速与占空比成反比,机箱散热风扇
//#define BOARD_FUN2_SPEED	__HAL_TIM_SET_COMPARE(&htim5,TIM_CHANNEL_2,board_fun_three);	//板载风扇转速与占空比成反比,灯珠散热风扇void board_task(void);
void board_init(void);#endif

log.c

#include "log.h"#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endifPUTCHAR_PROTOTYPE
{SEGGER_RTT_PutChar(0, ch);  //重映射RTTreturn ch;
}

log.h

#ifndef __LOG_H
#define __LOG_H
#include "stdio.h"
#include "SEGGER_RTT.h"#define USER_DEBUG_EN 1 //用户使用日志打印的总开关#ifdef USER_DEBUG_EN#define Debug_printf(format, ...) 	printf(RTT_CTRL_TEXT_WHITE format , ##__VA_ARGS__)//"\r\n"#define Debug_info(format, ...)   	printf(RTT_CTRL_TEXT_GREEN"[main]info:" format "\r\n", ##__VA_ARGS__)#define Debug_debug(format, ...)  	printf(RTT_CTRL_TEXT_WHITE"[main]debug:" format "\r\n", ##__VA_ARGS__)#define Debug_warning(format, ...)  printf(RTT_CTRL_TEXT_YELLOW"[main]debug:" format "\r\n", ##__VA_ARGS__)#define Debug_error(format, ...)  	printf(RTT_CTRL_TEXT_RED"[main]error:" format "\r\n",##__VA_ARGS__)
#else#define Debug_printf(format, ...)#define Debug_info(format, ...)#define Debug_debug(format, ...)#define Debug_warning(format, ...)#define Debug_error(format, ...)
#endif#endif

相关文章:

STM32CUBEMX_创建时间片轮询架构的软件框架

STM32CUBEMX_创建时间片轮询架构的软件框架 说明&#xff1a; 1、这种架构避免在更新STM32CUBEMX配置后把用户代码清除掉 2、利用这种时间片的架构可以使得代码架构清晰易于维护 创建步骤&#xff1a; 1、使用STM32CUBEMX创建基础工程 2、新建用户代码目录 3、构建基础的代码框…...

vue 插槽Slots

vue插槽官网 <button class"fancy-btn"><slot></slot> <!-- 插槽出口 --> </button><slot> 元素是一个插槽出口 (slot outlet)&#xff0c;标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。 // 定义一个Child.vue…...

论文阅读《Nougat:Neural Optical Understanding for Academic Documents》

摘要 科学知识主要存储在书籍和科学期刊中&#xff0c;通常以PDF的形式。然而PDF格式会导致语义信息的损失&#xff0c;特别是对于数学表达式。我们提出了Nougat&#xff0c;这是一种视觉transformer模型&#xff0c;它执行OCR任务&#xff0c;用于将科学文档处理成标记语言&a…...

较难的换根dp:P6213 「SWTR-04」Collecting Coins

传送门 前题提要:感觉这道换根dp可以说是集中了换根dp的所有较高难度的操作和思想,以及较高的一些实现细节,可以说能够完全写出这道题才叫真正理解了换根dp,非常值得一做. 首先读完题意,不难发现这道题有很多限制.点的访问次数限制,必须访问某一个点,想要获得最大的贡献,没有…...

Springboot - 15.二级分布式缓存集成-Caffeine

&#x1f440;中文文档 Caffeine &#x1f440;使用Caffeine &#xff08;本地缓存&#xff09; 当与Spring Boot结合使用时&#xff0c;Caffeine提供了一个直观且功能强大的二级缓存解决方案。Spring Boot的缓存抽象使得整合Caffeine变得相当简单。以下是如何在Spring Boot…...

二叉树的介绍及二叉树的链式结构的实现(C语言版)

前言 二叉树是一种特殊的树&#xff0c;它最大的度为2&#xff0c;每个节点至多只有两个子树。它是一种基础的数据结构&#xff0c;后面很多重要的数据结构都是依靠它来进行实现的。了解并且掌握它是很重要的。 目录 1.二叉树的介绍 1.1概念 1.2现实中的二叉树 1.3特殊的二叉…...

不同写法的性能差异

“ 达到相同目的,可以有多种写法,每种写法有性能、可读性方面的区别,本文旨在探讨不同写法之间的性能差异 len(str) vs str "" 本部分参考自: [问个 Go 问题&#xff0c;字符串 len 0 和 字符串 "" &#xff0c;有啥区别&#xff1f;](https://segmentf…...

Bytebase 2.7.0 - ​新增分支(Branching)功能

&#x1f680; 新功能 新增支持与 Git 类似的分支&#xff08;Branching&#xff09;功能来管理 schema 变更。支持搜索所有历史工单。支持导出审计日志。 &#x1f384; 改进 变更数据库工单详情页面全新改版。优化工单搜索体验。SQL 审核规则支持针对不同数据库进行独立配…...

day55 动规.p15 子序列

- 392.判断子序列 cpp class Solution { public: bool isSubsequence(string s, string t) { vector<vector<int>> dp(s.size() 1, vector<int>(t.size() 1, 0)); for (int i 1; i < s.size(); i) { for (int j 1; …...

TypeScript DOM类型的声明

TS DOM类型的声明 lib.dom.d.ts HTMLInputElement <input type"text" change"handleChange" /> const handleChange (evt: Event) > {console.log((evt.target as HTMLInputElement).value); } HTMLElement const div: HTMLDivElement do…...

springboot找不到注册的bean

1、错误描述 A component required a bean named ‘fixedAssetsShareMapper’ that could not be found.Action:Consider defining a bean named ‘fixedAssetsShareMapper’ in your configuration.2、问题分析 1、该错误提示表明在你的应用程序中有一个组件&#xff08;可能…...

MEMS传感器的原理与构造——单片式硅陀螺仪

一、前言 机械转子式陀螺仪在很长的一段时间内都是唯一的选项&#xff0c;也正是因为它的结构和原理&#xff0c;使其不再适用于现代小型、单体、集成式传感器的设计。常规的机械转子式陀螺仪包括平衡环、支撑轴承、电机和转子等部件&#xff0c;这些部件需要精密加工和…...

Redis集群服务器

集群简介 试想有一家餐厅&#xff0c;如果顾客人数较少&#xff0c;那么餐厅只需要一个服务员即可&#xff0c;如图1。但是&#xff0c;当顾客人数非常多时&#xff0c;一个服务员是绝对不够的&#xff0c;如图2。此时&#xff0c;餐厅需要雇用更多的服务员来解决大量访问&…...

动态维护直径 || 动态维护树上路径 || 涉及LCA点转序列 || 对欧拉环游序用数据结构维护:1192B

https://www.luogu.com.cn/problem/CF1192B 对于直径的求法&#xff0c;常用dp或两次dfs&#xff0c;但如果要动态维护似乎都不太方面&#xff0c;那么可以维护树上路径最大值。 树上路径为&#xff1a; d e p u d e p v − 2 d e p l c a ( u , v ) dep_udep_v-2\times de…...

MySQL 存储引擎,你了解几个?

引言 MySQL是一种流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它支持多种不同的数据库引擎。数据库引擎是用于存储、管理和检索数据的核心组件&#xff0c;它们直接影响着数据库的性能、可靠性和功能&#xff0c;接下来本文介绍下一些常见的MySQL数据…...

Java 动态规划 Leetcode 740. 删除并获得点数

题目 对于该题的题目分析&#xff0c;已经代码分析都一并写入到了代码注释中 代码 class Solution {public int deleteAndEarn(int[] nums) {//核心思路&#xff1a;//由于我们获得 nums[i] 的点数之后&#xff0c;就必须删除所有等于 nums[i] - 1 和 nums[i] 1 的元素//假设…...

算法通关村十三关-青铜:数字与数学基础问题

1.数字统计专题 统计特定场景下的符号或数字个数等 1.1符号统计 LeetCode1822 数组元素积的符号 https://leetcode.cn/problems/sign-of-the-product-of-an-array/description/ 思路分析 如果将所有的数都乘起来&#xff0c;再判断正负&#xff0c;工作量大&#xff0c;还…...

猜拳游戏小程序源码 大转盘积分游戏小程序源码 积分游戏小程序源码

简介&#xff1a; 猜拳游戏大转盘积分游戏小程序前端模板源码&#xff0c;一共五个静态页面&#xff0c;首页、任务列表、大转盘和猜拳等五个页面 图片&#xff1a;...

【Python】爬虫练习-爬取豆瓣网电影评论用户的观影习惯数据

目录 前言 一、配置环境 1.1、 安装Python 1.2、 安装Requests库和BeautifulSoup库 1.3.、安装Matplotlib 二、登录豆瓣网&#xff08;重点&#xff09; 2.1、获取代理 2.2、测试代理ip是否可用 2.3、设置大量请求头随机使用 2.4、登录豆瓣网 三、爬取某一部热门电影…...

webpack基础配置【总结】

webpack打包原理&#xff1a; webpack是一个js应用程序的静态模块打包工具&#xff0c;当webpack处理应用程序时&#xff0c;它的内部构建一个依赖图&#xff0c;此时依赖会映射项目中所需的每个模块&#xff0c;并生成一个或多个bundle包。因此我们会安装配置各种打包规则&…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...