STM32物联网项目之程序框架

news2024/11/15 5:54:36

前言:

这个系列,我主要写我用32f103实现的各种功能模块,已经程序编写过程中,硬件调试中出现的问题,一边记录,一边分享,一边复盘。

使用的是STM32cubemax,自动生成代码,所以为了保证程序可读性,逻辑性,我们在不影响系统自动生成代码的情况下,自己要有自己的程序框架,这样,在我们后期不断增加模块功能时,改动更小,兼容性更强,可阅读性更好。


目录

1.STM32CUBEMAX自动生成代码

1.1软件配置 

2.系统代码 

2.1包含的头文件 

2.2系统时钟函数

2.3系统初始化 

3. 标准化程序框架

3.1MyApplication.h文件

3.2main.c文件 

3.3.1头文件

3.3.2源文件 

3.3.3run函数


1.STM32CUBEMAX自动生成代码

为了方便演示程序框架,我用最简单也是最入门的点亮LED灯来操作。

1.1软件配置 

 首先,我们需要配置stm32cubemax的各种配置,包括芯片选型,GPIO外设,时钟RCC,等等,如下图所示:

 GPIO口的配置,推挽还是开漏,已经不同选择的原因,rcc时钟频率的配置,这些都跟挂载总线有关,时钟源这些等等底层逻辑相关的,后期我会单独分享复盘底层逻辑;这个章节我主要想介绍程序框架。

2.系统代码 

当我们配置好cubemax之后,点击GENERATE CODE 就会在我们保存的文件路径底下自动生成project,如下图所示:

因为我是用点亮led灯来演示的,所以系统除了主函数,只有gpio,后期我们用到的模块越多,源文件也会相应的增加,我们主要分析一下系统生成文件都包含那些以及主要的功能

2.1包含的头文件 

引用了main.h以及gpio.h这两个头文件,这两个头文件内部主要是对gpio口的引脚及端口进行定义 ,包括gpio初始化的声明。

2.2系统时钟函数

我们配置完系统时钟之后,这些文函数就会自动生成。

2.3系统初始化 

 

系统初始化部分就包含了 HAL库的初始化以及gpio的初始化。

3. 标准化程序框架

我们在不影响上述文件的情况下,新增属于我们自己的框架文件,在保证接口固定的情况下,每次只修改部分接口函数即可。

1、新增MyApplication文件夹,放置4个标准c文件,分别是公共文件,回调文件,系统文件,用户初始化文件,后续应用代码均放在此文件夹;

2、新增MyApplication.h文件,包含所有用户代码的头文件与外设头文件,调整外设或用户文件,只需要调整此文件内的相应头文件即可;

3、main.c文件标准化

3.1MyApplication.h文件

#ifndef __MyApplication_H__
#define __MyApplication_H__

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"

#include "stdio.h"
#include "stdlib.h"
#include "System.h"
#include "Public.h"
#include "MyInit.h"
#endif

我们将所有能用到的头文件集中在一个大的头文件中,只要所有源文件调用这一个头文件即可。

3.2main.c文件 

//调用头文件
/* USER CODE BEGIN Includes */
#include "MyApplication.h"
/* USER CODE END Includes */

//初始化
  /* USER CODE BEGIN 2 */
  MyInit.Peripheral_Set();	//Óû§³õʼ»¯
  /* USER CODE END 2 */

//主循环
  while (1)
  {
    System.Run();
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

//标准化错误处理函数
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  System.Error_Handler();
  /* USER CODE END Error_Handler_Debug */
}
//标准化断言失败处理函数
void assert_failed(uint8_t *file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
	System.Assert_Failed();
  /* USER CODE END 6 */
}

 我们定义一个标准化的main.c文件,在这个文件中我们把实现的功能放入system函数中,并添加标准初始化文件,用来初始化单片机的上电状态,已经标准化断言失败文件,错误处理文件。

3.3system文件

3.3.1头文件

typedef struct
{
	void (*Run)(void);
	void (*Error_Handler)(void);
	void (*Assert_Failed)(void);
} System_t;

/* extern variables-----------------------------------------------------------*/
extern System_t  System;
/* extern function prototypes-------------------------------------------------*/

#endif

 我们用结构体封住了三个函数指针,分别指向run函数,错误处理函数,和断言失败函数,结构体封装的好处 就是我们调用函数时候,只需要用指针寻址解引用,这样的话如果函数需要修改的话,不影响地址指向,也就是说主函数并不需要修改,我们只需要修改指向的函数内容即可。

3.3.2源文件 

typedef struct
{
	void (*Run)(void);
	void (*Error_Handler)(void);
	void (*Assert_Failed)(void);
} System_t;

/* extern variables-----------------------------------------------------------*/
extern System_t  System;
/* extern function prototypes-------------------------------------------------*/

#endif

 主要定义结构体System以及3个函数,并将3个函数的名称(首地址)赋值给System结构体,完成结构体的初始化。  如此一来,main.c文件可以通过System结构体的函数指针调用System.c文件的3个函数了。

3.3.3run函数

static void Run()
{
	HAL_Delay(1000);
	HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
}

 我们要实现的功能模块在这里实现就可以了,我们只是点亮小灯,所以功能简单,延时函数以及翻转灯光就行。

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日学术速递3.2

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Interactive Segmentation as Gaussian Process Classification(CVPR 2023) 标题:作为高斯过程分类的交互式分割 作者:Minghao Zhou, Hong Wang, Qian Zha…

tensorflow1.14.0安装教程--保姆级

//方法不止一种,下面仅展示一种。 注:本人电脑为win11,anaconda的python版本为3.9,但tensorflow需要python版本为3.7,所以下面主要阐述将python版本改为3.7后的安装过程以及常遇到的问题。 1.首先电脑安装好anaconda…

java进阶—多线程

学习线程,我们先来了解了解什么是进程?什么是线程 进程:就是在操作系统中运行的程序 线程:就是进程的一个执行单元,或者一条执行路劲 比如:我们打开应用商店,这个应用商店就是一个进程&#…

字节实习二面

网络体系结构分层(7、5、4) 答: OSI七层网络体系结构:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 TCP/IP四层网络体系结构:物理层、网际层、传输层、应用层 TCP/IP五层网络体系结构:物…

ShopWind 多商户商城更新,Vue 3 前后端分离,页面自定义装修

本次为 V4 版本更新,新系统架构(技术栈)vue3 vite (打包编译工具) Composition API(组合式 API setup) Element Plus vueRouter (路由) 第三方组件:axios (数据请求) wangeditor(编辑器),都是通过接口访问数据,页面效果更佳了…

【强烈建议收藏:MySQL面试必问系列之并发事务锁专题】

一.知识回顾 上节课我们一起学习了MySQL面试必问系列之事务,没有学习的同学可以看一下上一篇文章,肯定对你会有帮助,学习过的同学肯定知道,上节课我们留了一个小尾巴,这个小尾巴是什么呢?就是没有详细展开…

MPI ubuntu安装,mpicc,mpicxx,mpif90的区别

介绍 MPI是并行计算的一个支持库,支持对C、C、fortran语言进行并行计算。 安装基础环境 ubuntu进行gcc/g/gfortran的安装: gcc: ubuntu下自带gcc编译器。可以通过gcc -v命令来查看是否安装。 g: sudo apt-get install buil…

【Python学习笔记】第二十四节 Python 正则表达式

一、正则表达式简介正则表达式(regular expression)是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特…

Day07-flex布局

文章目录弹性布局一 简介二 弹性容器案例-让多个div排成一行三 容器项目的对齐方式案例1-justify-content(主轴对齐)案例2-flex-wrap(换行)案例3-align-items(侧轴对齐)案例4-align-self(项目垂直对齐)案例5-flex-direction(改变轴向)案例6-弹性布局应用四 弹性项目-flex属性案…

离开央视的欧阳夏丹,在艺考培训机构当老师,是金子到哪都会发光

说起中央电视台,大家都认为这是主持界的殿堂,但凡能在这里工作的人,都是出类拔萃的人才。在中央电视台,确实也出现过很多人才,比如说主持界的康辉、撒贝宁、朱军、周涛等等。 除了以上这些主持人,欧阳夏丹也…

【高效办公】批量生成固定模板的文件夹名称

老师让你按照他的要求生成每位学生的文件夹,你是学委,让你马上完成该任务,但你又不想是手动一个一个码字,因此聪明的你就看到了本篇文章啦!!! 虽说一个人懒惰,并不是好的事情。 但这个似乎合情合理啊~ 然后,就动手想办法,一开始就真的打算码字了。。 思路 在实际开…

机器学习笔记之狄利克雷过程(二)基于标量参数作用的推导过程

机器学习笔记之狄利克雷过程——基于标量参数作用的推导过程引言回顾:狄利克雷过程——基本介绍狄利克雷过程——定义小插曲:狄利克雷分布的简单性质关于标量参数作用的推导过程引言 上一节以高斯混合模型为引,简单介绍了狄利克雷过程(Diric…

虹科分享| 浅谈HK-Edgility边缘计算平台

上周,我们推出了虹科新品HK-Edgility边缘计算平台以及uCPE解决方案。本篇文章我们再来谈一谈到底什么是边缘计算?为什么需要边缘计算?边缘计算和云计算有什么关系?HK-Edgility边缘计算平台将为您带来什么?一、边缘计算…

【C++】vector实现(深浅拷贝详细理解,迭代器失效)

🍅可以先去这个网站看一下个个函数的功能 本文不再详细介绍,vector的底层还是顺序表,我讲的很详细,建议没学过顺序表的先预习一下(主页搜索顺序表,还有配套习题) C网站关于vector的接口函数信息…

雅思积累(十八)同义替换

同义替换:sophisticated —— complicatedspecific —— detailed —— particularquantity —— wealth —— volume —— numbersettle —— schedule —— arrange —— fixswift —— rapid —— fast —— quickexpertise —— professional knowledge —— sk…

【云原生kubernetes】k8s中job与cronjob使用详解

一、前言 job,顾名思义就是任务,job的概念在很多框架中都有,而且实际业务场景中也使用非常广泛,比如大家熟悉的hadoop,客户端可以向集群提交一个job,然后集群根据一定的调度策略来处理这个job; …

【2023unity游戏制作-mango的冒险】-6.关卡设计

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏:unity游戏制作 ⭐mango的冒险关卡设计⭐ 文章目录⭐mango的冒险关卡设计⭐👨‍&#…

软件测试之jira

Jira 1. Jira 概述 JIRA 是澳大利亚 Atlassian 公司开发的一款优秀的问题跟踪管理软件工具,可以对各种类型的问题进行跟踪管理,包括缺陷、任务、需求、改进等。JIRA采用J2EE技术,能够跨平台部署。它正被广泛的开源软件组织,以及…

更新 TKK 失败,请检查网络连接。谷歌翻译 translation插件不能用解决办法 亲测有效

谷歌翻译无法使用,谷歌回应解释是,谷歌翻译使用率过低,所以选择停止服务。网上也有说法,指出根本原因为,提供API接口的googleapis被墙,这导致js文件和字体资源无法加载。 这里提供两种解决办法 方案一 修…

枯燥迷茫?先来玩玩这些经典的计算机视觉项目

B站|公众号:啥都会一点的研究生 颜色检测 从检测颜色到绿幕应用(用自定义视频或背景替换绿色背景),再到简单的照片编辑软件,构建颜色识别器是计算机视觉入门的一个很棒的项目 项目地址:https://github.…