【星汇极客】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 小时前
单片机结合OpenCV
单片机·嵌入式硬件·opencv
日晨难再3 小时前
嵌入式:STM32的启动(Startup)文件解析
stm32·单片机·嵌入式硬件
yufengxinpian3 小时前
集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1
单片机·嵌入式硬件·音视频·智能硬件
__基本操作__4 小时前
历遍单片机下的IIC设备[ESP--0]
单片机·嵌入式硬件
网易独家音乐人Mike Zhou10 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
PegasusYu13 小时前
STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组
stm32·教程·rtos·stm32cubeide·free-rtos·eventgroup·时间标志组
lantiandianzi18 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件
文弱书生65618 小时前
输出比较简介
stm32
哔哥哔特商务网18 小时前
高集成的MCU方案已成电机应用趋势?
单片机·嵌入式硬件
跟着杰哥学嵌入式18 小时前
单片机进阶硬件部分_day2_项目实践
单片机·嵌入式硬件