【星汇极客】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是:这个引用的这个变量在函数后面,如图

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

相关推荐
刀法如飞1 天前
一文搞懂DDD 领域驱动设计思想原理
设计模式·架构·代码规范
清风6666661 天前
基于单片机的锅炉压力与温度监测报警系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
全栈人月1 天前
使用 Kilo Code 解决遗留代码恐惧症
人工智能·单元测试·代码规范
点灯小铭1 天前
基于单片机的鱼缸监测与远程管理系统设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
清风6666661 天前
基于单片机的罐体压力控制器设计与实现
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
点灯小铭1 天前
基于单片机的热量计测量系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
wengqidaifeng1 天前
嵌入式小白第三站:UART、I2C、SPI、ADC 怎么学?从传感器读数到完整小项目
stm32·单片机·嵌入式硬件·51单片机
振南的单片机世界2 天前
HAL_Delay(1000)真准吗?SysTick的1ms基准从哪来
arm开发·stm32·单片机·嵌入式硬件
NPE~2 天前
[嵌入式]从0到1开发环境搭建
stm32·嵌入式硬件·教程·clion·stmcubemx·stmcubeclt
项目題供诗2 天前
STM32-ADC模数转换器(十八)
stm32·单片机·嵌入式硬件