【星汇极客】STM32 HAL库+CubeMX开发之用户代码规范(持续更新)

news2024/11/25 0:40:31

前言

        本人是一名嵌入式学习者,在大学期间也参加了不少的竞赛并获奖,包括:江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等

        暑假的时候参加了太多的比赛,作为队长要写代码、材料文档,几乎是比完赛过几天又要去其他比赛了,前段时间都在休息,现在才有时间来记录一下。后面会经常写一下博客分享一下,如果想了解其他项目、技术,可以去B站搜:星汇极客,主页链接:星汇极客B站

此外,还开发了个人网站,里面有一些资料和源码供下载:星汇极客

用户代码规范

为什么要规范写代码?

答:(1)有些人在用CubeMX重新生成工程的时候,可能会覆盖掉之前在keil写过的代码。

(2)或者明明记得在keil里添加了.c、.h文件,但是在用CubeMX重新生成工程的时候又消失了。

(3)这个文件、变量、函数我明明写有的,为什么会报错说undefine等。

(4)可以提高代码执行效率,不容易出错,避免很多的未知错误。

如何规范?

(1)main.c代码消失

        有时候在CubeMX重新生成工程,keil里写的代码不见了,可能是因为没有写在特定的位置。在main.c里有很多代码你可能不知道有什么用,我也不知道。不过只需要记住你可以在哪里写代码、你要在哪里写代码就行了。

        看到有USER CODE BEGIN xxx,USER CODE END  xxx的就可以在它们之间写自己的代码了,不过每一处都有不同的意义。只需要记住在USER CODE BEGIN 和 END之间写,重新生成工程户后自己写的代码就不会消失

/* USER CODE BEGIN Includes */
//存放用户定义的头文件-常用
#include "stdio.h"

/* USER CODE END Includes */

/* USER CODE BEGIN 0 */
//存放用户的其他代码-常用
//我自己平时也不会细分,除了头文件,写变量、函数等都写在这里。
int i = 0;

/* USER CODE END 0 */

  /* USER CODE BEGIN 2 */

  //存放外设初始化代码-常用
   vTaskStartScheduler(); 

  /* USER CODE END 2 */

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    //主循环-常用!
     HAL_Delay(1000);


    /* USER CODE END WHILE */

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

/* USER CODE BEGIN 4 */
//写串口回调、中断回调、定时器中断回调等代码-常用

/* USER CODE END 4 */

/* Includes ------------------------------------------------------------------*/
//这个不用管,自动生成的。
#include "main.h"
#include "cmsis_os.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */
//存放用户定义的头文件-常用!
#include "stdio.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//存放用户定义的结构体等
struct Stu
{
 char name[20];//名字
};

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
//存放用户定义的宏
#define num 10

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
//存放像定时器、中断等运行的代码

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
//存放用户定义的变量
int i = 0;

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void MX_FREERTOS_Init(void);
/* USER CODE BEGIN PFP */
//存放用户定义的函数声明
void task1(void *pvParameters);

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//存放用户的其他代码-常用!
//我自己平时也不会细分,除了头文件,写变量、函数等都写在这里。
int i = 0;
void task1(void *pvParameters)
{
    while(1)
    {
       HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);  
			printf("task1 start\r\n");
        vTaskDelay(1000);    /* 延时1000ticks */
    }
	//vTaskSuspend(Task1Task_Handler);
	printf("任务1挂起\r\n");
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
  //在程序开始执行HAL_Init()之前,用户可以在这里添加自己的初始化代码。

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  //常用!
   //启动任务
   xTaskCreate((TaskFunction_t )start_task,            /* 任务函数 */
                (const char*    )"start_task",          /* 任务名称 */
                (uint16_t       )START_STK_SIZE,        /* 任务堆栈大小 */
                (void*          )NULL,                  /* 传入给任务函数的参数 */
                (UBaseType_t    )START_TASK_PRIO,       /* 任务优先级 */
                (TaskHandle_t*  )&StartTask_Handler);   /* 任务句柄 */
   vTaskStartScheduler();		//开启任务调度	
 	
  /* USER CODE END 2 */

  /* Init scheduler */
  osKernelInitialize();  /* Call init function for freertos objects (in freertos.c) */
  MX_FREERTOS_Init();
  /* Start scheduler */
  osKernelStart();
  /* We should never get here as control is now taken by the scheduler */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    //主循环-常用!
    
    /* USER CODE END WHILE */

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

/* USER CODE BEGIN 4 */
//写串口回调、中断回调、定时器中断回调等代码-常用

/* USER CODE END 4 */

除了main.c,其他像gpio.c等里面的也类似,看也没有USER CODE 就行了。(2)工程添加文件

(2)工程添加文件消失

        有的时候在keil工程添加了.c、.h文件,但是用CubeMX重新生成突然不见了

解决办法:添加完之后点击保存,就不会消失了。

(3)报错:error:  #20: identifier "xxx" is undefined

在不规范引用变量、函数等的时候,编译会出现这个错误

原因1是:引用的这个变量不存在,如图

原因2是:这个引用的这个变量在函数后面,如图

解决办法:把这个引用的变量定义好,并且写在前面。

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

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

相关文章

ComfyUI 实战教程:古人画像变真人

最近看到一种古画变真人的效果,就是将书上的古人画像重绘为真人,效果炸裂,不敢独享,特别分享给大家。 效果演示 废话不多说,还是先看效果。大家可以猜猜它们都是谁~ 使用方法 这个方法在 Stable Diffusi…

斩获ICDAR历史地图OCR比赛冠军:我们如何处理密集旋转交叉文本?

ICDAR 比赛简介 ICDAR 比赛 https://rrc.cvc.uab.es/是国际公认的文字领域权威的比赛,文字领域顶会论文里的数据测评和测评指标往往都来源于ICDAR比赛的数据和指标,每年一般会有几个大类的赛事,然后每个赛事会细分3-4个比赛。ICDAR竞赛因其极…

APP未上架开通微信支付流程分享

在移动互联网时代,支付功能的便捷性对于APP的成功至关重要。即便APP尚未上架至应用商店,开发者仍可以提前开通微信支付功能,以便进行内部测试、预售活动或特定场景下的支付需求。本文将详细介绍APP未上架时如何开通微信支付的流程&#xff0c…

74.【C语言】文件操作(1)

目录 1.进行文件操作的原因 销毁的示例 2.文件的类型 1.操作文件的步骤 2.文件名 3.查看文件路径的方法 方法1 方法2 方法3 4.数据文件的介绍 举例 ① ASCII码的形式(即字符形式)存储 01.手动写入数据 02.用程序写入数据 ②二进制形式存储 理解"不加转换&…

技术美术百人计划 | 《5.4 水体渲染》笔记

一、水体渲染的波形模拟技术-基于物理 基于物理的波形模拟方法: 欧拉方法(Eulerian approaches)[Kass 1990]拉格朗日方法(Lagrangian approaches) [Stam 1995]欧拉-拉格朗日混合方法(Hybrid approaches&a…

想有独立站但是不知道怎么建站,自助/外包建站怎么选?

绝大多数外贸人和电商人都会有一个疑问,那就是选择自助建站还是外包建站更好——我个人觉得吧,这两个选择主要取决于时间,技术能力,预算还有你的具体需求。 自助建站 比如自助建站,它就更适合预算有限、需求较简单且…

ComfyUI增强图像细节只需要一个节点(附工作流),SD1.5、SDXL、FLUX.1 全支持,简单好用!

今天给小伙伴们介绍一个非常简单,但又相当好使的一个插件。 功能很简单,就是增加或者减少图像的细节,节点也很简单,就一个节点,只需要嵌入我们的 ComfyUI 的基础工作流中就可以了,随插随用。 而且该插件不…

GPT系列

GPT(Generative Pre-Training): 训练过程分两步:无监督预训练有监督微调 模型结构是decoder-only的12层transformer 1、预训练过程,窗口为k,根据前k-1个token预测第k个token,训练样本包括700…

一文带大家快速上手SQLAlchemy 对数据的增删改查操作

SQLAlchemy SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合。我们可以使用Flask和SQLAlchemy的数据库访问层(DAL&…

别人苦画流程图一小时,我却瞬间搞定12 种图表!

在AI写作中,如何才能生成各种图表呢?例如流程图、序列图、甘特图等,今天就来教你如何生成。 本文阅读难度:★☆☆☆☆ 在商业、学术场景中,经常需要画流程图,手工画的话至少得1个小时才能完画&#xff0c…

宠物咖啡馆数字化转型:SpringBoot框架的实践

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于Spring Boot的宠物咖啡馆平台的设计与…

gstreamer 内存 alloctor 介绍

文章目录 前言一、gstreamer 默认的内存 alloctor1. gstreamer 中默认的内存 allocator 为 GST_ALLOCATOR_SYSMEM (即SystemMemory)2. GST_ALLOCATOR_SYSMEM 申请内存实例二、gstreamer 目前支持的几种内存 alloctor1.GstDmaBufAllocator1.1 GstDmaBufAllocator 介绍1.2 GstDma…

马丁代尔药物大典数据库

马丁代尔药物大典是一本由Pharmaceutical Press出版的参考书,拥有全球使用的近 6000 种药物和药品,包括超过 125,000 种专有制剂的详细信息。其中还包括近 700 篇疾病治疗评论。 它于 1883 年首次出版,马丁代尔包含全球临床用药信息&#xff…

pytest的基础入门

pytest判断用例的成功或者失败 pytest识别用例失败时会报AssertionError或者xxxError错误,当捕获异常时pytest无法识别到失败的用例 pytest的fixture夹具 pytest的参数化 #coding:utf-8 import pytestfrom PythonProject.pytest_test.funcs.guess_point import ge…

android 绘制流程

网上看了一些绘制相关的框架图,感觉有些不对,先记录下 主要是 surface 和framebuffer的关系,surface是用来管理数据内容并最终通过layer输出framebuffer的,因此应该是上下两层的管理,而不是平行的 二hwc合并内容&…

STM32 HAL库UART查询方式实例

本文中介绍USART编程涵盖了三种主要方法,详细介绍STM32F407微控制器结合HAL库,通过UART的查询方式来实现一个实用的密码验证程序。提示用户键入一个字符作为密码。只有当用户精准地输入字符6时,系统才会反馈“密码正确”的确认信息。反之&…

vscode 中显示 pnpm : 无法加载文件 C:\Users\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本

vscode中运行pnpm报错 pnpm : 无法加载文件 C:\Users\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本 解决办法如下 1、用 get-ExecutionPolicy 命令在vscode终端查询状态 如果返回的是 Restricted ,则说明是禁止的 2、用 set-ExecutionPolic…

从零开始构建:Python自定义脚本自动化你的日常任务

从零开始构建:Python自定义脚本自动化你的日常任务 Python 作为一种简洁且功能强大的编程语言,被广泛应用于各种自动化任务中。通过编写 Python 脚本,你可以轻松地将日常重复性工作自动化,例如文件操作、数据处理、网络爬虫、系统…

Mac 电脑设置键盘 Command键

Mac 电脑设置键盘 Command键 如果 mac 电脑连接的第三方键盘,有些键盘没有 command 按键,导致有些功能没有办法使用,比如你想复制粘贴发现也不可以。这个时候你需要设置一个按键为 command 按键。 比如上图中是把 Alt 键设置为 Command 键。 …

DHCP安装

步骤 1:安装DHCP服务器 在系统上安装DHCP服务。以下是安装命令: # 安装DHCP软件包 yum install dhcp步骤 2:配置DHCP服务器 安装完成后,需要配置DHCP服务器来绑定MAC地址和IP地址。 # 备份原始的DHCP配置文件 cp /etc/dhcp/dh…