首页 > 其他分享 >嵌入式杂谈(问题解决一:使用HAL库时keil中代码的分区)

嵌入式杂谈(问题解决一:使用HAL库时keil中代码的分区)

时间:2025-01-14 23:58:32浏览次数:3  
标签:CODE HAL 函数 自定义 keil 代码 库时 Private USER

 如图,代码分区

代码区域作用
Private includes引入所需头文件,提供函数声明、类型定义和宏等
Private typedef创建自定义数据类型,增强代码可读性与维护性
Private define定义常量和宏,方便代码修改与简化
Private macro实现简单代码替换,简化代码逻辑
Private variables声明和初始化程序所需变量
Private function prototypes声明函数原型,让编译器知晓函数存在
Private user code完成具体函数实现,编写核心业务逻辑

1.include

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>          // 标准输入输出库,可用于打印调试信息等
#include <stdlib.h>         // 标准库,包含一些通用函数,如内存分配、转换函数等
#include <string.h>         // 字符串处理库,包含字符串操作函数,如 strcpy、strlen 等
#include <stdbool.h>        // 布尔类型库,提供 bool 类型及其值 true 和 false
#include "my_custom_lib.h"   // 自定义库,用于项目中特定功能的实现
/* USER CODE END Includes */

解释

  • #include 语句用于引入所需的头文件,为后续代码提供所需的函数声明、类型定义和宏等。引入不同的标准库可以方便使用各种基本功能,而自定义库则可以根据项目需求添加。

2.typedef 

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
typedef struct {
    int id;
    char name[50];
    float value;
} MyStruct;  // 自定义结构体,用于存储复杂的数据结构

typedef enum {
    STATE_IDLE,
    STATE_RUNNING,
    STATE_ERROR
} SystemState;  // 自定义枚举,用于表示系统的不同状态
/* USER CODE END PTD */

解释

  • typedef 关键字用于创建自定义的数据类型。这里创建了一个结构体 MyStruct 用于存储具有多个成员的复杂数据,还创建了一个枚举 SystemState 用于表示系统的不同状态,使代码更具可读性和可维护性。

 3.define

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define MAX_BUFFER_SIZE 1024  // 定义最大缓冲区大小
#define PI 3.14159265359     // 定义常量 PI
#define DEBUG_MODE 1        // 定义调试模式开关
/* USER CODE END PD */

解释

  • #define 用于创建常量和宏。常量可以使代码中的常数值具有明确的意义,便于修改和维护,而宏可以实现一些简单的代码替换功能,提高代码的简洁性和可读性。

4.Private variables

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
int global_variable = 0;    // 全局变量,可在整个程序中访问
char buffer[MAX_BUFFER_SIZE];  // 字符数组,用于存储数据,大小为 MAX_BUFFER_SIZE
MyStruct my_struct;        // 自定义结构体变量
SystemState system_state = STATE_IDLE;  // 自定义枚举变量,初始化为 STATE_IDLE 状态
/* USER CODE END PV */

解释

  • 这个区域用于声明和初始化程序所需的变量,包括全局变量、数组和自定义类型的变量等。

 5.Private function prototypes(PFP)

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
void initialize_system(void);  // 初始化系统的函数原型
void process_data(int data);  // 处理数据的函数原型
void print_status(void);     // 打印系统状态的函数原型
/* USER CODE END PFP */

解释

  • 在此处声明函数的原型,使编译器知道这些函数的存在,以便在后续的代码中调用这些函数,这些函数的具体实现可以在其他地方完成。

 6.Private user code

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void initialize_system(void) {
    // 初始化系统的具体代码,例如设置变量初始值,初始化硬件等
    system_state = STATE_IDLE;
    global_variable = 100;
    memset(buffer, 0, MAX_BUFFER_SIZE);  // 清空缓冲区
}

void process_data(int data) {
    // 处理数据的具体代码,例如对数据进行计算、存储或修改
    if (IS_EVEN(data)) {
        global_variable += SQUARE(data);
    } else {
        global_variable -= data;
    }
}

void print_status(void) {
    // 打印系统状态的具体代码,例如使用 printf 输出系统状态信息
    if (DEBUG_MODE) {
        printf("System state: %d\n", system_state);
        printf("Global variable value: %d\n", global_variable);
    }
}
/* USER CODE END 0 */

解释

  • 这里是具体函数的实现,包括初始化系统、处理数据和打印状态的函数。根据之前声明的函数原型,在此处完成具体的函数逻辑。可以使用之前定义的常量、宏、结构体和枚举,也可以调用其他标准库或自定义库的函数。

在实际编写嵌入式代码时,不同的项目和硬件平台可能会有不同的需求,但总体上这些区域可以帮助你组织代码,使代码结构清晰,易于维护和扩展。请根据具体的项目需求灵活运用这些区域,确保代码的正确性和可靠性。

标签:CODE,HAL,函数,自定义,keil,代码,库时,Private,USER
From: https://blog.csdn.net/JK03820/article/details/145149821

相关文章

  • Datawhale 组队学习wow-agenttask01 openai库搭建Al Agent
    Datawhale组队学习wow-agentDatawhale项目链接:https://www.datawhale.cn/learn/summary/86笔记作者:博客园-岁月月宝贝......
  • HAL库-第五章-BH1750光强传感器模块、MPU6050陀螺仪、Dht11温湿度模块使用
    目录一、实验目的二、实验原理代码1-usart模块化代码serial_port.c serial_port.h三、实验步骤,代码与结果1.添加USART串口(1)在项目文件中添加serial_port.c以及serial_port.h,位置分别为Core_Src以及Core_Inc。(2)在keil中添加.c代码(3)在Drivers/CMSIS下修改stm32f1xx_h......
  • STM32单片机芯片与内部75 USB虚拟串口 标准库 HAL库 配置实现
    目录一、标准库工程1、USB初始化2、USB中断配置3、中断服务函数与回调接收4、USB连接5、时钟配置6、数据发送二、HAL库工程1、USB初始化2、中断服务函数与回调接收4、USB连接5、时钟配置6、数据发送一、标准库工程1、USB初始化    由官方进行适配。v......
  • STM32 HAL库函数入门指南:从原理到实践
    1STM32HAL库概述STM32HAL(HardwareAbstractionLayer)库是ST公司专门为STM32系列微控制器开发的一套硬件抽象层函数库。它的核心设计理念是在应用层与硬件层之间建立一个抽象层,这个抽象层屏蔽了底层硬件的具体实现细节,为开发者提供了一套统一的、标准化的应用程序接口(API)......
  • 在keil中ARMCC v6 编译器中用C语言实现ARM cortex-M4 实现startup代码
    #include"stdint.h"#defineStack_Size0x00000800U#defineHeap_Size0x00000400Uuint8_tStack_Mem[Stack_Size]__attribute__((section("STACK")));uint32_t*const__initial_sp=(uint32_t*)&Stack_Mem[Stack_Size];uint8_tHeap_......
  • half hour
    Theytakeahalfhourtocallindetectives.他们花了半个小时叫侦探。tookalmostahalfhour.花了差不多半个小时。I'mgettingcallsfromNewYorkeveryhalfhour.我每半小时就会接到纽约的电话。 Westillhavetwoandhalfhoursleftuntilourdate.离约会还......
  • Android 14.0 app调用hal层接口功能实现系列一(hal接口的创建)
    1.前言在14.0的系统rom定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后通过jni来调用,首先来建立hal层的相关接口和c++文件,提供hal层供上层调用的接口2.app调用hal层接口功能实......
  • C#Halcon找线封装
        利用CreateMetrologyModel封装找线工具时,在后期实际应用调试时容易把检测极性搞混乱,造成检测偏差,基于此,此Demo增加画线后检测极性的指引,首先看一下效果加载测试图片画线确定后指引效果找线效果修改显示UI代码usingSystem;usingSystem.Collections.Ge......
  • JINGWHALE ART 年度流行色 2026 #C08FF8,用代码创造色彩斑斓数字世界!
    JINGWHALEART年度流行色(智能色彩生产官方平台)是由JINGWHALE每年发布的年度流行色,每年1月1日发布次年流行色。JINGWHALEART年度流行色根据中国文化思想与年度流行指数,确定年度流行色。基于年度流行色基准色,通过JINGWHALE-HSV-COLOR算法(论文已在《工业控制计算机》上......
  • STM32 拓展 RTC案例1:使用闹钟唤醒待机模式 (HAL库)
    需求描述执行完毕正常代码之后,让MCU进入待机模式,设置闹钟,自动让MCU从待机模式中被唤醒。可以用led点亮熄灭显示是否唤醒。应用场景:比如设计一个野外温度自动采集的设备,规定每小时采集一次温度,就可以定义一个1小时的闹钟,定时唤醒,采集温度,采集完进入待机模式,可以大大降低设备功......