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

前言

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

暑假的时候参加了太多的比赛,作为队长要写代码、材料文档,几乎是比完赛过几天又要去其他比赛了,前段时间都在休息,现在才有时间来记录一下。后面会经常写一下博客分享一下,如果想了解其他项目、技术,可以去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 */

cpp 复制代码
/* 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是:这个引用的这个变量在函数后面,如图

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

相关推荐
点灯小铭5 小时前
基于单片机的多路热电偶温度监测与报警器
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
tianyue10010 小时前
STM32G431 ADC 多个channel 采集
stm32·单片机·嵌入式硬件
zhz521411 小时前
后端代码规范文档示例
重构·bug·代码规范·结对编程
清风66666611 小时前
基于单片机的水泵效率温差法测量与报警系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
z203483152013 小时前
定时器练习报告
单片机·嵌入式硬件
zk0013 小时前
内容分类目录
单片机·嵌入式硬件
安生生申13 小时前
STM32 ESP8266连接ONENET
c语言·stm32·单片机·嵌入式硬件·esp8266
广药门徒13 小时前
电子器件烧毁的底层逻辑与避坑指南
单片机·嵌入式硬件
点灯小铭18 小时前
基于单片机的社区医院小型高压蒸汽灭菌自动控制器设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
youcans_18 小时前
【动手学STM32G4】(3)STM32G431之定时器
stm32·单片机·嵌入式硬件·定时器