当前位置: 首页 > news >正文

HAL_新建工程(手动移植)

文章目录

  • 一、创建工程目录
    • 1、创建工程目录
    • 2、创建子目录
    • 3、目录文件说明
  • 二、拷贝HAL库相关文件
    • 1、拷贝HAL库(Libraries)
    • 2、拷贝启动文件(CMSIS\Include)
    • 3、拷贝源文件(CMSYS\Source)
    • 4、添加中断文件
    • 5、更改hal配置文件
  • 三、Keil创建工程
    • 1、创建工程
    • 2、添加组文件夹
    • 3、导入文件
  • 四、配置工程
    • 1、Target中选中微库“ Use MicroLib”,为的是在日后编写串口驱动的时候可以使用printf函数。
    • 2、在Output选项卡中把输出文件夹定位到我们工程目录下的“output”文件夹,如果想在编译的过程中生成hex文件,那么那Create HEX File选项勾上。
    • 3、在Listing选项卡中把输出文件夹定位到我们工程目录下的“Listing”文件夹。
    • 4、在C/C++选项卡中添加处理宏及编译器编译的时候查找的头文件路径。
    • 1、测试源代码
    • 2、下载测试

一、创建工程目录

1、创建工程目录

确定一个存储位置,存放工程文件。(HAL_Template)

2、创建子目录

在工程目录中添加Doc、 User、Libraries、 CMSIS、Project文件夹:
Doc:
User:
main.c
Libraries:
Include
Source
CMSIS :
Include
Source
Project:
Output
Listing

3、目录文件说明

二、拷贝HAL库相关文件

1、拷贝HAL库(Libraries)

进入\STM32Cube_FW_F1_V1.8.0\Drivers\STM32F1xx_HAL_Driver 把头文件夹 Inc 和源文件夹 Src 移动到自己的Libraries的对应的文件中。

2、拷贝启动文件(CMSIS\Include)

1)、先进入内核文件\STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS
2)、进入头文件\CMSIS\Include 把所有文件拷贝到自己的CMSIS/Include文件中。
3)、再进入\CMSIS\Device\ST\STM32F1xx\Include 把所有文件拷贝到自己的CMSIS/Include文件中

3、拷贝源文件(CMSYS\Source)

1)、进入\STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates
2)、把\Templates 文件的的system_stm32f1xx.c拷贝到自己的CMSIS/Source文件中
3)、再进入/arm文件下,把所有文件拷贝到自己的CMSIS/Source文件中

4、添加中断文件

在User文件夹创建stm32f1xx_it.c 和stm32f1xx_it.h文件。

stm32f1xx_it.c

/*-------------------------------------------------*//* *//* 实现各种中断服务函数的源文件 *//* *//*-------------------------------------------------*/#include"stm32f1xx_hal.h"#include"stm32f1xx_it.h"/*-------------------------------------------------*//*函数名:不可屏蔽中断处理函数 *//*参 数:无 *//*返回值:无 *//*-------------------------------------------------*/voidNMI_Handler(void){}/*-------------------------------------------------*//*函数名:硬件出错后进入的中断处理函数 *//*参 数:无 *//*返回值:无 *//*-------------------------------------------------*/voidHardFault_Handler(void){}/*-------------------------------------------------*//*函数名:软中断,SWI 指令调用的处理函数 *//*参 数:无 *//*返回值:无 *//*-------------------------------------------------*/voidSVC_Handler(void){}/*-------------------------------------------------*//*函数名:可挂起的系统服务处理函数 *//*参 数:无 *//*返回值:无 *//*-------------------------------------------------*/voidPendSV_Handler(void){}/*-------------------------------------------------*//*函数名:SysTic系统嘀嗒定时器处理函数 *//*参 数:无 *//*返回值:无 *//*-------------------------------------------------*/voidSysTick_Handler(void){HAL_IncTick();}

stm32f1xx_it.h

/** ****************************************************************************** * @file GPIO/GPIO_IOToggle/Inc/stm32f1xx_it.h * @author MCD Application Team * @brief This file contains the headers of the interrupt handlers. ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** *//* Define to prevent recursive inclusion -------------------------------------*/#ifndef__STM32F1xx_IT_H#define__STM32F1xx_IT_H#ifdef__cplusplusextern"C"{#endif/* Includes ------------------------------------------------------------------*//* Exported types ------------------------------------------------------------*//* Exported constants --------------------------------------------------------*//* Exported macro ------------------------------------------------------------*//* Exported functions ------------------------------------------------------- */voidNMI_Handler(void);voidHardFault_Handler(void);voidMemManage_Handler(void);voidBusFault_Handler(void);voidUsageFault_Handler(void);voidSVC_Handler(void);voidDebugMon_Handler(void);voidPendSV_Handler(void);voidSysTick_Handler(void);#ifdef__cplusplus}#endif#endif/* __STM32F1xx_IT_H *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

5、更改hal配置文件

把自己的Libraries文件中的Include 文件中的stm32f1xx_hal_conf_template.h 更名为 stm32f1xx_hal_conf.h 。
否则编译会找不到这个头文件。

三、Keil创建工程

1、创建工程

选择Project为工程目录。

2、添加组文件夹

3、导入文件

STM32F1xx_HAL_Driver :
stm32f1xx_hal.c
stm32f1xx_hal_cortex.c
stm32f1xx_hal_gpio.c
stm32f1xx_hal_gpio_ex.c
stm32f1xx_hal_rcc.c
stm32f1xx_hal_rcc_ex.c

STARTUP:
system_stm32f1xx.c
startup_stm32f103xe.s

User:
main.c
stm32f1xx_it.c

四、配置工程

1、Target中选中微库“ Use MicroLib”,为的是在日后编写串口驱动的时候可以使用printf函数。

2、在Output选项卡中把输出文件夹定位到我们工程目录下的“output”文件夹,如果想在编译的过程中生成hex文件,那么那Create HEX File选项勾上。

3、在Listing选项卡中把输出文件夹定位到我们工程目录下的“Listing”文件夹。

4、在C/C++选项卡中添加处理宏及编译器编译的时候查找的头文件路径。

如果头文件路径添加有误,则编译的时候会报错找不到头文件。
选中C99 Mode。

在编译器中添加宏的好处就是,只要用了这个模版,就不用源文件中修改代码。
STM32F103xE宏:为了告诉STM32HAL库,我们使用的芯片类型是STM32型号是大容量的,使STM32HAL库根据我们选定的芯片型号来配置。
USE_HAL_DRIVER宏:为了让stm32f1xx.h包含stm32f1xx_hal_conf.h这个头文件。
四、编译测试

1、测试源代码

#include"stm32f1xx_hal.h"#defineLED_PINGPIO_PIN_8#defineLED_PORTGPIOAvoidSystemClock_Config(void);intmain(void){/* 1. HAL库核心初始化(移植最关键的第一步) */HAL_Init();/* 2. 系统时钟配置(必须和你的硬件匹配!) */SystemClock_Config();/* 3. 极简GPIO初始化(仅配置LED引脚) */// 使能GPIO时钟__HAL_RCC_GPIOA_CLK_ENABLE();// 配置LED引脚为推挽输出GPIO_InitTypeDef gpio_conf={0};gpio_conf.Pin=LED_PIN;gpio_conf.Mode=GPIO_MODE_OUTPUT_PP;// 推挽输出gpio_conf.Pull=GPIO_NOPULL;// 无上下拉gpio_conf.Speed=GPIO_SPEED_FREQ_LOW;// 低速HAL_GPIO_Init(LED_PORT,&gpio_conf);/* 4. 测试主循环:LED闪烁(验证移植成功) */while(1){HAL_GPIO_TogglePin(LED_PORT,LED_PIN);// 翻转LED电平HAL_Delay(500);// 延时500ms}}/** * @brief 系统时钟配置(根据你的芯片修改!) * 示例:STM32F103 72MHz / STM32F407 168MHz / 无晶振则用HSI */voidSystemClock_Config(void){// 极简版:用内部HSI时钟(无需外部晶振,适配所有板子)RCC_OscInitTypeDef osc_init={0};RCC_ClkInitTypeDef clk_init={0};// 启用HSI(内部高速时钟,8MHz)osc_init.OscillatorType=RCC_OSCILLATORTYPE_HSI;osc_init.HSIState=RCC_HSI_ON;osc_init.HSICalibrationValue=RCC_HSICALIBRATION_DEFAULT;if(HAL_RCC_OscConfig(&osc_init)!=HAL_OK){while(1);// 时钟配置失败,卡死}// 配置系统时钟 = HSI(8MHz)clk_init.ClockType=RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;clk_init.SYSCLKSource=RCC_SYSCLKSOURCE_HSI;clk_init.AHBCLKDivider=RCC_SYSCLK_DIV1;clk_init.APB1CLKDivider=RCC_HCLK_DIV1;clk_init.APB2CLKDivider=RCC_HCLK_DIV1;if(HAL_RCC_ClockConfig(&clk_init,FLASH_LATENCY_0)!=HAL_OK){while(1);// 时钟配置失败,卡死}}/** * @brief 错误处理函数(移植失败时触发) */voidError_Handler(void){while(1){// 若移植失败,LED快速闪烁(100ms一次)HAL_GPIO_TogglePin(LED_PORT,LED_PIN);HAL_Delay(100);}}// 以下是CubeMX自动生成的弱函数,按需保留#ifdefUSE_FULL_ASSERTvoidassert_failed(uint8_t*file,uint32_tline){}#endif

2、下载测试

http://www.jsqmd.com/news/524427/

相关文章:

  • SEO_从零开始制定一份可执行的SEO优化方案
  • 保姆级教程:用Arduino IDE给ESP-01S烧录第一个程序(附CH340驱动安装)
  • Codex 安装与配置指南
  • SEO_为什么你的SEO效果不好?原因分析与对策
  • Guohua Diffusion 生成图像分辨率提升实战:从512px到2K
  • 2026年 真空干燥设备厂家推荐排行榜:SZG双锥回转真空/自动进出料/真空耙式/梨刀/桨叶/闪蒸干燥机,高效节能技术实力深度解析 - 品牌企业推荐师(官方)
  • 斯坦福提出 TTT-Discover:在测试时继续学习,让大模型“边做边进化”的科研发现引擎
  • 探索路基水盐迁移与温度场的数值奥秘
  • 什么是 Tailwind CSS
  • 训练语义分割模型的理解
  • Benders分解
  • CF538H Summer Dichotomy
  • 数据库如何表达M:N关系结合python结合SQLAlchemy
  • PaddleOCR模型跨平台部署实战:从PaddlePaddle到ONNXRuntime的完整指南
  • IOS历史版本下载
  • 基于深度学习的麦穗计数系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
  • MMDetection3D多GPU训练报错ChildFailedError?一个find_unused_parameters参数就能搞定
  • 2026年艺术玻璃厂家推荐排行榜:手工彩绘/热熔琉璃/雕刻镶嵌/夹丝夹胶等艺术玻璃品牌深度解析与选购指南 - 品牌企业推荐师(官方)
  • 实测对比:Qwen QwQ-32B-AWQ在RTX 4090上的量化效果与原生模型差异(附显存占用监控技巧)
  • ESP32与DS18B20的高精度温度监测方案
  • Dify离线部署实战:无网环境下的插件打包与依赖整合
  • 20243222 实验一《Python程序设计》实验报告
  • 2026年 锂电池设备厂家推荐榜单:自动分选机/PACK组装线/激光焊接机/储能产线,新能源制造全流程自动化解决方案精选 - 品牌企业推荐师(官方)
  • 经典复现】COMSOL 仿真模拟激光熔覆
  • 杭州企业老板必读:GEO 到底是什么?为何 AI 时代本地获客离不开 GEO 推广?
  • 2026年3月海口钢管出租供应商最新推荐:轮扣出租、方管出租、挂板出租、方柱扣出租、梁夹具出租、扣件出租、顶托出租供应商选择指南 - 海棠依旧大
  • 手把手教你用CRT和TFTP升级锐捷RG-S2900G-E交换机到11.4(1)B74P1
  • 2026年薪酬服务优质推荐榜降本提效控风险:薪酬服务外包公司、薪酬服务平台、薪酬服务解决方案、薪酬服务代发、薪酬服务公司选择指南 - 优质品牌商家
  • IntelliJ插件开发实战:5分钟搞定Action类库配置(附常见问题排查)
  • SEO_从零到一构建可持续增长的自然搜索流量