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

STM32创建静态库lib

创建静态库lib

  • 1. 新建工程
    • 1.1 创建工程文件夹
    • 1.2 编写用户相关代码
      • 1.2.1 stm32f4xx_it.h
      • 1.2.2 stm32f4xx_it.c
      • 1.2.3 标准库配置:stm32f4xx_conf.h
      • 1.2.4 HAL库的配置:stm32f4xx_hal_conf.h
      • 1.2.5 LL库配置:stm32f4xx_ll_conf.h
    • 1.3 移植通用文件
      • 1.3.1 标准外设库SPL
      • 1.3.2 HAL库
      • 1.3.3 LL库
    • 1.4 修改相关文件(SPL/HAL/LL库)
      • 1.4.1 启动文件 startup_stm32f40xx.s
    • 1.5 将移植的文件添加到工程中
      • 1.5.1 标准外设库SPL
      • 1.5.2 HAL库
      • 1.5.3 LL库
  • 2. 创建lib库
    • 2.1 创建标准外设库SPL库
    • 2.2 创建HAL库
    • 2.3 创建LL库

1. 新建工程

1.1 创建工程文件夹

在电脑的某个目录下建立一个 Template 文件夹,后面所建立的工程都放在这个文件夹下。在 Template 目录下新建下列目录:
在这里插入图片描述



新建工程:
在这里插入图片描述

1.2 编写用户相关代码

1.2.1 stm32f4xx_it.h

#ifndef __STM32F4xx_IT_H
#define __STM32F4xx_IT_H#ifdef __cplusplus
extern "C" {
#endif void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);#ifdef __cplusplus
}
#endif#endif /* __STM32F4xx_IT_H */

1.2.2 stm32f4xx_it.c

内核相关中断

#include "stm32f4xx_it.h"void NMI_Handler(void) {
}void HardFault_Handler(void) {while (1) {}
}void MemManage_Handler(void) {while (1) {}
}void BusFault_Handler(void) {while (1) {}
}void UsageFault_Handler(void) {while (1) {}
}void SVC_Handler(void) {
}void DebugMon_Handler(void) {
}void PendSV_Handler(void) {
}void SysTick_Handler(void) {
}

1.2.3 标准库配置:stm32f4xx_conf.h

stm32f4xx.h文件中会引用 stm32f4xx_conf.h,最重要的是实现assert_param函数

//同 标准库SPL中的实例一模一样
#ifndef __STM32F4xx_CONF_H
#define __STM32F4xx_CONF_H#include "stm32f4xx_adc.h"
#include "stm32f4xx_crc.h"
#include "stm32f4xx_dbgmcu.h"
#include "stm32f4xx_dma.h"
#include "stm32f4xx_exti.h"
#include "stm32f4xx_flash.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_i2c.h"
#include "stm32f4xx_iwdg.h"
#include "stm32f4xx_pwr.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_rtc.h"
#include "stm32f4xx_sdio.h"
#include "stm32f4xx_spi.h"
#include "stm32f4xx_syscfg.h"
#include "stm32f4xx_tim.h"
#include "stm32f4xx_usart.h"
#include "stm32f4xx_wwdg.h"
#include "misc.h"#if defined (STM32F429_439xx)
#include "stm32f4xx_cryp.h"
#include "stm32f4xx_hash.h"
#include "stm32f4xx_rng.h"
#include "stm32f4xx_can.h"
#include "stm32f4xx_dac.h"
#include "stm32f4xx_dcmi.h"
#include "stm32f4xx_dma2d.h"
#include "stm32f4xx_fmc.h"
#include "stm32f4xx_ltdc.h"
#include "stm32f4xx_sai.h"
#endif /* STM32F429_439xx */#if defined (STM32F427_437xx)
#include "stm32f4xx_cryp.h"
#include "stm32f4xx_hash.h"
#include "stm32f4xx_rng.h"
#include "stm32f4xx_can.h"
#include "stm32f4xx_dac.h"
#include "stm32f4xx_dcmi.h"
#include "stm32f4xx_dma2d.h"
#include "stm32f4xx_fmc.h"
#include "stm32f4xx_sai.h"
#endif /* STM32F427_437xx */#if defined (STM32F40_41xxx)
#include "stm32f4xx_cryp.h"
#include "stm32f4xx_hash.h"
#include "stm32f4xx_rng.h"
#include "stm32f4xx_can.h"
#include "stm32f4xx_dac.h"
#include "stm32f4xx_dcmi.h"
#include "stm32f4xx_fsmc.h"
#endif /* STM32F40_41xxx */#ifdef  USE_FULL_ASSERT#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))void assert_failed(uint8_t* file, uint32_t line);
#else#define assert_param(expr) ((void)0)
#endif #endif

1.2.4 HAL库的配置:stm32f4xx_hal_conf.h

stm32f4xx_hal.h文件中会引用 stm32f4xx_hal_conf.h,最重要的是实现assert_param函数

//同 HAL 库中的实例一模一样
#ifndef __STM32F4xx_HAL_CONF_H
#define __STM32F4xx_HAL_CONF_H#ifdef __cplusplus
extern "C" {
#endif#define HAL_MODULE_ENABLED
#define HAL_ADC_MODULE_ENABLED
#define HAL_CAN_MODULE_ENABLED
/* #define HAL_CAN_LEGACY_MODULE_ENABLED */
#define HAL_CRC_MODULE_ENABLED
#define HAL_CRYP_MODULE_ENABLED
#define HAL_DAC_MODULE_ENABLED
#define HAL_DCMI_MODULE_ENABLED
#define HAL_DMA_MODULE_ENABLED
/* #define HAL_DMA2D_MODULE_ENABLED */
/* #define HAL_ETH_MODULE_ENABLED */
#define HAL_EXTI_MODULE_ENABLED
#define HAL_FLASH_MODULE_ENABLED
#define HAL_NAND_MODULE_ENABLED
#define HAL_NOR_MODULE_ENABLED
#define HAL_PCCARD_MODULE_ENABLED
#define HAL_SRAM_MODULE_ENABLED
/* #define HAL_SDRAM_MODULE_ENABLED */
#define HAL_HASH_MODULE_ENABLED
#define HAL_GPIO_MODULE_ENABLED
#define HAL_I2C_MODULE_ENABLED
#define HAL_I2S_MODULE_ENABLED
#define HAL_IWDG_MODULE_ENABLED
/* #define HAL_LTDC_MODULE_ENABLED */
#define HAL_PWR_MODULE_ENABLED
#define HAL_RCC_MODULE_ENABLED
#define HAL_RNG_MODULE_ENABLED
#define HAL_RTC_MODULE_ENABLED
/* #define HAL_SAI_MODULE_ENABLED */
#define HAL_SD_MODULE_ENABLED
#define HAL_SPI_MODULE_ENABLED
#define HAL_TIM_MODULE_ENABLED
#define HAL_UART_MODULE_ENABLED
#define HAL_USART_MODULE_ENABLED
#define HAL_IRDA_MODULE_ENABLED
#define HAL_SMARTCARD_MODULE_ENABLED
#define HAL_WWDG_MODULE_ENABLED
#define HAL_CORTEX_MODULE_ENABLED
#define HAL_PCD_MODULE_ENABLED
#define HAL_HCD_MODULE_ENABLED#if !defined  (HSE_VALUE) #define HSE_VALUE    (8000000U) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */#if !defined  (HSE_STARTUP_TIMEOUT)#define HSE_STARTUP_TIMEOUT    (100U)   /*!< Time out for HSE start up, in ms */
#endif /* HSE_STARTUP_TIMEOUT */#if !defined  (HSI_VALUE)#define HSI_VALUE    (16000000U) /*!< Value of the Internal oscillator in Hz*/
#endif /* HSI_VALUE */#if !defined  (LSI_VALUE) 
#define LSI_VALUE  (32000U)    
#endif /* LSI_VALUE */      #if !defined  (LSE_VALUE)
#define LSE_VALUE  (32768U)    /*!< Value of the External Low Speed oscillator in Hz */
#endif /* LSE_VALUE */#if !defined  (LSE_STARTUP_TIMEOUT)#define LSE_STARTUP_TIMEOUT    (5000U)   /*!< Time out for LSE start up, in ms */
#endif /* LSE_STARTUP_TIMEOUT */#if !defined  (EXTERNAL_CLOCK_VALUE)#define EXTERNAL_CLOCK_VALUE    (12288000U) /*!< Value of the External oscillator in Hz*/
#endif /* EXTERNAL_CLOCK_VALUE */#define  VDD_VALUE                    (3300U) /*!< Value of VDD in mv */
#define  TICK_INT_PRIORITY            (0x0FU) /*!< tick interrupt priority */
#define  USE_RTOS                     0U
#define  PREFETCH_ENABLE              0U /* The prefetch will be enabled in SystemClock_Config(), depending on the used STM32F405/415/07/417 device: RevA (prefetch must be off) or RevZ (prefetch can be on/off) */
#define  INSTRUCTION_CACHE_ENABLE     1U
#define  DATA_CACHE_ENABLE            1U#define  USE_HAL_ADC_REGISTER_CALLBACKS         0U /* ADC register callback disabled       */
#define  USE_HAL_CAN_REGISTER_CALLBACKS         0U /* CAN register callback disabled       */
#define  USE_HAL_CEC_REGISTER_CALLBACKS         0U /* CEC register callback disabled       */
#define  USE_HAL_CRYP_REGISTER_CALLBACKS        0U /* CRYP register callback disabled      */
#define  USE_HAL_DAC_REGISTER_CALLBACKS         0U /* DAC register callback disabled       */
#define  USE_HAL_DCMI_REGISTER_CALLBACKS        0U /* DCMI register callback disabled      */
#define  USE_HAL_DFSDM_REGISTER_CALLBACKS       0U /* DFSDM register callback disabled     */
#define  USE_HAL_DMA2D_REGISTER_CALLBACKS       0U /* DMA2D register callback disabled     */
#define  USE_HAL_DSI_REGISTER_CALLBACKS         0U /* DSI register callback disabled       */
#define  USE_HAL_ETH_REGISTER_CALLBACKS         0U /* ETH register callback disabled       */
#define  USE_HAL_HASH_REGISTER_CALLBACKS        0U /* HASH register callback disabled      */
#define  USE_HAL_HCD_REGISTER_CALLBACKS         0U /* HCD register callback disabled       */
#define  USE_HAL_I2C_REGISTER_CALLBACKS         0U /* I2C register callback disabled       */
#define  USE_HAL_FMPI2C_REGISTER_CALLBACKS      0U /* FMPI2C register callback disabled    */
#define  USE_HAL_I2S_REGISTER_CALLBACKS         0U /* I2S register callback disabled       */
#define  USE_HAL_IRDA_REGISTER_CALLBACKS        0U /* IRDA register callback disabled      */
#define  USE_HAL_LPTIM_REGISTER_CALLBACKS       0U /* LPTIM register callback disabled     */
#define  USE_HAL_LTDC_REGISTER_CALLBACKS        0U /* LTDC register callback disabled      */
#define  USE_HAL_MMC_REGISTER_CALLBACKS         0U /* MMC register callback disabled       */
#define  USE_HAL_NAND_REGISTER_CALLBACKS        0U /* NAND register callback disabled      */
#define  USE_HAL_NOR_REGISTER_CALLBACKS         0U /* NOR register callback disabled       */
#define  USE_HAL_PCCARD_REGISTER_CALLBACKS      0U /* PCCARD register callback disabled    */
#define  USE_HAL_PCD_REGISTER_CALLBACKS         0U /* PCD register callback disabled       */
#define  USE_HAL_QSPI_REGISTER_CALLBACKS        0U /* QSPI register callback disabled      */
#define  USE_HAL_RNG_REGISTER_CALLBACKS         0U /* RNG register callback disabled       */
#define  USE_HAL_RTC_REGISTER_CALLBACKS         0U /* RTC register callback disabled       */
#define  USE_HAL_SAI_REGISTER_CALLBACKS         0U /* SAI register callback disabled       */
#define  USE_HAL_SD_REGISTER_CALLBACKS          0U /* SD register callback disabled        */
#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS   0U /* SMARTCARD register callback disabled */
#define  USE_HAL_SDRAM_REGISTER_CALLBACKS       0U /* SDRAM register callback disabled     */
#define  USE_HAL_SRAM_REGISTER_CALLBACKS        0U /* SRAM register callback disabled      */
#define  USE_HAL_SPDIFRX_REGISTER_CALLBACKS     0U /* SPDIFRX register callback disabled   */
#define  USE_HAL_SMBUS_REGISTER_CALLBACKS       0U /* SMBUS register callback disabled     */
#define  USE_HAL_SPI_REGISTER_CALLBACKS         0U /* SPI register callback disabled       */
#define  USE_HAL_TIM_REGISTER_CALLBACKS         0U /* TIM register callback disabled       */
#define  USE_HAL_UART_REGISTER_CALLBACKS        0U /* UART register callback disabled      */
#define  USE_HAL_USART_REGISTER_CALLBACKS       0U /* USART register callback disabled     */
#define  USE_HAL_WWDG_REGISTER_CALLBACKS        0U /* WWDG register callback disabled      */#define USE_SPI_CRC                     1U#ifdef HAL_RCC_MODULE_ENABLED#include "stm32f4xx_hal_rcc.h"
#endif /* HAL_RCC_MODULE_ENABLED */#ifdef HAL_EXTI_MODULE_ENABLED#include "stm32f4xx_hal_exti.h"
#endif /* HAL_EXTI_MODULE_ENABLED */#ifdef HAL_GPIO_MODULE_ENABLED#include "stm32f4xx_hal_gpio.h"
#endif /* HAL_GPIO_MODULE_ENABLED */#ifdef HAL_DMA_MODULE_ENABLED#include "stm32f4xx_hal_dma.h"
#endif /* HAL_DMA_MODULE_ENABLED */#ifdef HAL_CORTEX_MODULE_ENABLED#include "stm32f4xx_hal_cortex.h"
#endif /* HAL_CORTEX_MODULE_ENABLED */#ifdef HAL_ADC_MODULE_ENABLED#include "stm32f4xx_hal_adc.h"
#endif /* HAL_ADC_MODULE_ENABLED */#ifdef HAL_CAN_MODULE_ENABLED#include "stm32f4xx_hal_can.h"
#endif /* HAL_CAN_MODULE_ENABLED */#ifdef HAL_CAN_LEGACY_MODULE_ENABLED#include "stm32f4xx_hal_can_legacy.h"
#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */#ifdef HAL_CRC_MODULE_ENABLED#include "stm32f4xx_hal_crc.h"
#endif /* HAL_CRC_MODULE_ENABLED */#ifdef HAL_CRYP_MODULE_ENABLED#include "stm32f4xx_hal_cryp.h" 
#endif /* HAL_CRYP_MODULE_ENABLED */#ifdef HAL_DMA2D_MODULE_ENABLED#include "stm32f4xx_hal_dma2d.h"
#endif /* HAL_DMA2D_MODULE_ENABLED */#ifdef HAL_DAC_MODULE_ENABLED#include "stm32f4xx_hal_dac.h"
#endif /* HAL_DAC_MODULE_ENABLED */#ifdef HAL_DCMI_MODULE_ENABLED#include "stm32f4xx_hal_dcmi.h"
#endif /* HAL_DCMI_MODULE_ENABLED */#ifdef HAL_ETH_MODULE_ENABLED#include "stm32f4xx_hal_eth.h"
#endif /* HAL_ETH_MODULE_ENABLED */#ifdef HAL_FLASH_MODULE_ENABLED#include "stm32f4xx_hal_flash.h"
#endif /* HAL_FLASH_MODULE_ENABLED */#ifdef HAL_SRAM_MODULE_ENABLED#include "stm32f4xx_hal_sram.h"
#endif /* HAL_SRAM_MODULE_ENABLED */#ifdef HAL_NOR_MODULE_ENABLED#include "stm32f4xx_hal_nor.h"
#endif /* HAL_NOR_MODULE_ENABLED */#ifdef HAL_NAND_MODULE_ENABLED#include "stm32f4xx_hal_nand.h"
#endif /* HAL_NAND_MODULE_ENABLED */#ifdef HAL_PCCARD_MODULE_ENABLED#include "stm32f4xx_hal_pccard.h"
#endif /* HAL_PCCARD_MODULE_ENABLED */ #ifdef HAL_SDRAM_MODULE_ENABLED#include "stm32f4xx_hal_sdram.h"
#endif /* HAL_SDRAM_MODULE_ENABLED */#ifdef HAL_HASH_MODULE_ENABLED
#include "stm32f4xx_hal_hash.h"
#endif /* HAL_HASH_MODULE_ENABLED */#ifdef HAL_I2C_MODULE_ENABLED
#include "stm32f4xx_hal_i2c.h"
#endif /* HAL_I2C_MODULE_ENABLED */#ifdef HAL_I2S_MODULE_ENABLED
#include "stm32f4xx_hal_i2s.h"
#endif /* HAL_I2S_MODULE_ENABLED */#ifdef HAL_IWDG_MODULE_ENABLED
#include "stm32f4xx_hal_iwdg.h"
#endif /* HAL_IWDG_MODULE_ENABLED */#ifdef HAL_LTDC_MODULE_ENABLED
#include "stm32f4xx_hal_ltdc.h"
#endif /* HAL_LTDC_MODULE_ENABLED */#ifdef HAL_PWR_MODULE_ENABLED
#include "stm32f4xx_hal_pwr.h"
#endif /* HAL_PWR_MODULE_ENABLED */#ifdef HAL_RNG_MODULE_ENABLED
#include "stm32f4xx_hal_rng.h"
#endif /* HAL_RNG_MODULE_ENABLED */#ifdef HAL_RTC_MODULE_ENABLED
#include "stm32f4xx_hal_rtc.h"
#endif /* HAL_RTC_MODULE_ENABLED */#ifdef HAL_SAI_MODULE_ENABLED
#include "stm32f4xx_hal_sai.h"
#endif /* HAL_SAI_MODULE_ENABLED */#ifdef HAL_SD_MODULE_ENABLED
#include "stm32f4xx_hal_sd.h"
#endif /* HAL_SD_MODULE_ENABLED */#ifdef HAL_SPI_MODULE_ENABLED
#include "stm32f4xx_hal_spi.h"
#endif /* HAL_SPI_MODULE_ENABLED */#ifdef HAL_TIM_MODULE_ENABLED
#include "stm32f4xx_hal_tim.h"
#endif /* HAL_TIM_MODULE_ENABLED */#ifdef HAL_UART_MODULE_ENABLED
#include "stm32f4xx_hal_uart.h"
#endif /* HAL_UART_MODULE_ENABLED */#ifdef HAL_USART_MODULE_ENABLED
#include "stm32f4xx_hal_usart.h"
#endif /* HAL_USART_MODULE_ENABLED */#ifdef HAL_IRDA_MODULE_ENABLED
#include "stm32f4xx_hal_irda.h"
#endif /* HAL_IRDA_MODULE_ENABLED */#ifdef HAL_SMARTCARD_MODULE_ENABLED
#include "stm32f4xx_hal_smartcard.h"
#endif /* HAL_SMARTCARD_MODULE_ENABLED */#ifdef HAL_WWDG_MODULE_ENABLED
#include "stm32f4xx_hal_wwdg.h"
#endif /* HAL_WWDG_MODULE_ENABLED */#ifdef HAL_PCD_MODULE_ENABLED
#include "stm32f4xx_hal_pcd.h"
#endif /* HAL_PCD_MODULE_ENABLED */#ifdef HAL_HCD_MODULE_ENABLED
#include "stm32f4xx_hal_hcd.h"
#endif /* HAL_HCD_MODULE_ENABLED */#ifdef  USE_FULL_ASSERT#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))void assert_failed(uint8_t* file, uint32_t line);
#else#define assert_param(expr) ((void)0U)
#endif /* USE_FULL_ASSERT */#ifdef __cplusplus
}
#endif#endif 

1.2.5 LL库配置:stm32f4xx_ll_conf.h

stm32f4xx_hal.h文件中会引用 stm32f4xx_ll_conf.h,最重要的是实现assert_param函数

//自行创建
#ifndef __STM32F4xx_LL_CONF_H
#define __STM32F4xx_LL_CONF_H#ifdef __cplusplus
extern "C" {
#endif#define	"stm32f4xx_ll_adc.h"
#define	"stm32f4xx_ll_crc.h"
#define	"stm32f4xx_ll_dac.h"
#define	"stm32f4xx_ll_dma.h"
#define	"stm32f4xx_ll_dma2d.h"
#define	"stm32f4xx_ll_exti.h"
#define	"stm32f4xx_ll_fmc.h"
#define	"stm32f4xx_ll_fmpi2c.h"
#define	"stm32f4xx_ll_fsmc.h"
#define	"stm32f4xx_ll_gpio.h"
#define	"stm32f4xx_ll_i2c.h"
#define	"stm32f4xx_ll_lptim.h"
#define	"stm32f4xx_ll_pwr.h"
#define	"stm32f4xx_ll_rcc.h"
#define	"stm32f4xx_ll_rng.h"
#define	"stm32f4xx_ll_rtc.h"
#define	"stm32f4xx_ll_sdmmc.h"
#define	"stm32f4xx_ll_spi.h"
#define	"stm32f4xx_ll_tim.h"
#define	"stm32f4xx_ll_usart.h"
#define	"stm32f4xx_ll_usb.h"
#define	"stm32f4xx_ll_utils.h"#ifdef  USE_FULL_ASSERT#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))void assert_failed(uint8_t* file, uint32_t line);
#else#define assert_param(expr) ((void)0U)
#endif /* USE_FULL_ASSERT */#ifdef __cplusplus
}
#endif#endif 

1.3 移植通用文件

1.3.1 标准外设库SPL

  1. Drivers/SPL/BSP目录 下存放用户开发的相应驱动文件,如LED、Beep等。

  2. Drivers/SPL/CMSIS目录 下存放下列文件 :
    2.1 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0–>Libraries–>CMSIS–>Device–>ST–>STM32F4xx–>Include
    stm32f4xx.h、system_stm32f4xx.h
    2.2 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0–>Libraries–>CMSIS–>Device–>ST–>STM32F4xx–>Source–>Templates system_stm32f4xx.c
    2.3 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0–>Libraries–>CMSIS–>Device–>ST–>STM32F4xx–>Source–>Templates–>arm startup_stm32f40xx.s
    2.4 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0–>Libraries–>CMSIS–>Include
    core_cm4.h、core_cmFunc.h、core_cmInstr.h、core_cmSimd.h

  3. Drivers/SPL/STM32F4xx_SPL_Driver目录 下存放下列文件 :
    3.1 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0–>Libraries–>STM32F4xx_StdPeriph_Driver–>inc stm32f4xx_ppp.h
    3.2 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0–>Libraries–>STM32F4xx_StdPeriph_Driver–>src stm32f4xx_ppp.c

  4. User目录 下存放下列文件 :
    用户自己编写源码文件, stm32f4xx_conf.h、stm32f4xx_it.c、stm32f4xx_it.h

1.3.2 HAL库

  1. Drivers/HAL/BSP目录 下存放用户开发的相应驱动文件,如LED、Beep等。

  2. Drivers/HAL/CMSIS目录 下存放下列文件:
    2.1 STM32Cube_FW_F4_V1.26.0–>Drivers–>CMSIS–>Device–>ST–>STM32F4xx–>Include
    stm32f4xx.h、stm32f407xx.h、system_stm32f4xx.h
    2.2 STM32Cube_FW_F4_V1.26.0–>Drivers–>CMSIS–>Device–>ST–>STM32F4xx–>Source–>Templates system_stm32f4xx.c
    2.3 STM32Cube_FW_F4_V1.26.0–>Drivers–>CMSIS–>Device–>ST–>STM32F4xx–>Source–>Templates–>arm startup_stm32f407xx.s
    2.4 STM32Cube_FW_F4_V1.26.0–>Drivers–>CMSIS–>Include
    cmsis_armcc.h、cmsis_armclang.h、cmsis_compiler.h、cmsis_version.h、core_cm4.h、mpu_armv7.h

  3. Drivers/HAL/STM32F4xx_HAL_Driver目录 下存放下列文件:
    3.1 STM32Cube_FW_F4_V1.26.0–>Drivers–>STM32F4xx_HAL_Driver–>Inc stm32f4xx_hal_ppp.h
    3.2 STM32Cube_FW_F4_V1.26.0–>Drivers–>STM32F4xx_HAL_Driver–>Src stm32f4xx_hal_ppp.c

  4. User目录 下存放下列文件 :
    用户自己编写源码文件, stm32f4xx_hal_conf.h、stm32f4xx_it.h、stm32f4xx_it.h

1.3.3 LL库

  1. Drivers/LL/BSP目录 下存放用户开发的相应驱动文件,如LED、Beep等。

  2. Drivers/LL/CMSIS目录 下存放下列文件 :
    2.1 STM32Cube_FW_F4_V1.26.0–>Drivers–>CMSIS–>Device–>ST–>STM32F4xx–>Include
    stm32f4xx.h、stm32f407xx.h、system_stm32f4xx.h
    2.2 STM32Cube_FW_F4_V1.26.0–>Drivers–>CMSIS–>Device–>ST–>STM32F4xx–>Source–>Templates system_stm32f4xx.c
    2.3 STM32Cube_FW_F4_V1.26.0–>Drivers–>CMSIS–>Device–>ST–>STM32F4xx–>Source–>Templates–>arm startup_stm32f407xx.s
    2.4 STM32Cube_FW_F4_V1.26.0–>Drivers–>CMSIS–>Include
    cmsis_armcc.h、cmsis_armclang.h、cmsis_compiler.h、cmsis_version.h、core_cm4.h、mpu_armv7.h

  3. Drivers/LL/STM32F4xx_LL_Driver目录 下存放下列文件 :
    在这里插入图片描述

  4. User目录 下存放下列文件 :
    用户自己编写源码文件, stm32f4xx_ll_conf.h、stm32f4xx_it.h、stm32f4xx_it.h

1.4 修改相关文件(SPL/HAL/LL库)

1.4.1 启动文件 startup_stm32f40xx.s

屏蔽SystemInit函数的调用,在外部实现系统时钟的配置。

Reset_Handler PROCEXPORT Reset_Handler [WEAK];IMPORT SystemInitIMPORT __main//寄存器版本代码,因为没有用到 SystemInit 函数,所以注释掉//库函数版本代码,建议加上这里(外部必须实现 SystemInit 函数),以初始化 stm32 时钟等。;LDR R0, =SystemInit;BLX R0 LDR R0, =__mainBX R0ENDP

1.5 将移植的文件添加到工程中

1.5.1 标准外设库SPL

在这里插入图片描述
选择AC5编译器,因为AC6编译器对中文支持和代码兼容较差,编译会出现很多告警。
全局宏变量:STM32F40_41xxx,USE_STDPERIPH_DRIVER


移植所需的所有文件:

Bsp
CMSISsystem_stm32f4xx.cstartup_stm32f40xx.s
Driver只添加下列文件:
在这里插入图片描述
stm32f4xx_fmc.c不添加到工程,否则编译会报错。
CMiddlewares
Userstm32f4xx_it.cmain.c
//main.c文件内容如下:
#include "stm32f4xx.h" 
void Delay(__IO uint32_t nCount)
{while(nCount--){}
}
int main(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOF, &GPIO_InitStructure);while(1){GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);Delay(0x7FFFFF);GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);Delay(0x7FFFFF);}
}

1.5.2 HAL库

同标准外设库SPL类似,需要修改如下:

  1. 全局宏变量:STM32F407xx,USE_HAL_DRIVER
  2. 头文件路径:
    在这里插入图片描述
  3. 移植所需的所有文件
Bsp
CMSISsystem_stm32f4xx.cstartup_stm32f407xx.s
Driver只添加下列文件:
在这里插入图片描述
或添加所有文件,除stm32f4xx_hal_timebase_rtc_alarm_template.c、stm32f4xx_hal_timebase_rtc_wakeup_template.c、stm32f4xx_hal_timebase_tim_template.c不添加到工程,否则编译会报错。
添加LL库文件是由于HAL库文件中会引用一些LL库的C文件。
CMiddlewares
Userstm32f4xx_it.cmain.c
//main.c文件内容如下:
#include "stm32f4xx.h"
#include "core_cm4.h"
#include "stm32f4xx_hal.h"
void Delay(__IO uint32_t nCount)
{while(nCount--){}
}
int main(void)
{HAL_Init(); GPIO_InitTypeDef gpio_init_struct;__HAL_RCC_GPIOF_CLK_ENABLE(); gpio_init_struct.Pin = GPIO_PIN_9; gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;gpio_init_struct.Pull = GPIO_PULLUP; gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOF, &gpio_init_struct); gpio_init_struct.Pin = GPIO_PIN_10;HAL_GPIO_Init(GPIOF, &gpio_init_struct); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9 ,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET);while(1){HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET); // LED0亮HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET); // LED1灭Delay(0x1FFFFF);HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET); // LED0灭HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET); // LED1亮Delay(0x1FFFFF);}
}

1.5.3 LL库

同标准外设库SPL类似,需要修改如下:

  1. 全局宏变量:USE_FULL_LL_DRIVER,STM32F407xx

  2. 头文件路径:
    在这里插入图片描述

  3. 移植所需的所有文件

Bsp
CMSISsystem_stm32f4xx.cstartup_stm32f407xx.s
Driver添加下列文件:在这里插入图片描述
CMiddlewares
Userstm32f4xx_it.cmain.c
//main.c文件内容如下:
#include "stm32f4xx_ll_rcc.h"
#include "stm32f4xx_ll_bus.h"
#include "stm32f4xx_ll_system.h"
#include "stm32f4xx_ll_exti.h"
#include "stm32f4xx_ll_cortex.h"
#include "stm32f4xx_ll_utils.h"
#include "stm32f4xx_ll_pwr.h"
#include "stm32f4xx_ll_dma.h"
#include "stm32f4xx.h"
#include "stm32f4xx_ll_gpio.h"void SystemClock_Config(void)
{LL_FLASH_SetLatency(LL_FLASH_LATENCY_5);if(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_5){}LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);LL_RCC_HSI_SetCalibTrimming(16);LL_RCC_HSI_Enable();while(LL_RCC_HSI_IsReady() != 1) {}LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI, LL_RCC_PLLM_DIV_8, 168,LL_RCC_PLLP_DIV_2);LL_RCC_PLL_Enable();while(LL_RCC_PLL_IsReady() != 1) {}LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_4);LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_2);LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL){}LL_Init1msTick(168000000);LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK);LL_SetSystemCoreClock(168000000);
}int main(void)
{LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);NVIC_SetPriorityGrouping(0x00000003);SystemClock_Config();LL_GPIO_InitTypeDef GPIO_InitStruct = {0};LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOF);LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOH);LL_GPIO_ResetOutputPin(GPIOF, LL_GPIO_PIN_9|LL_GPIO_PIN_10);GPIO_InitStruct.Pin = LL_GPIO_PIN_9|LL_GPIO_PIN_10;GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;LL_GPIO_Init(GPIOF, &GPIO_InitStruct);while (1){LL_GPIO_TogglePin (GPIOF,LL_GPIO_PIN_9);LL_GPIO_SetOutputPin(GPIOF,LL_GPIO_PIN_10);LL_mDelay(500);LL_GPIO_ResetOutputPin(GPIOF,LL_GPIO_PIN_10);LL_mDelay(500);}
}

编译会报错,将文件 stm32f4xx_ll_fmc.c、stm32f4xx_ll_fsmc.c、stm32f4xx_ll_sdmmc.c、stm32f4xx_ll_usb.c 中的下列内容注释:

//#include "stm32f4xx_hal.h"

2. 创建lib库

2.1 创建标准外设库SPL库

将创建lib库所需的下列所有头文件存放到 C:\Keil_v5\ARM\inc 目录下,如果没有此目录可自行创建。

在这里插入图片描述


在这里插入图片描述

2.2 创建HAL库

将创建lib库所需的下列所有头文件存放到 C:\Keil_v5\ARM\hal_inc 目录下,如果没有此目录可自行创建。
在这里插入图片描述


添加步骤同 创建标准外设库SPL库

2.3 创建LL库

将创建lib库所需的下列所有头文件存放到 C:\Keil_v5\ARM\ll_inc 目录下,如果没有此目录可自行创建。
在这里插入图片描述


添加步骤同 创建标准外设库SPL库

相关文章:

STM32创建静态库lib

创建静态库lib 1. 新建工程1.1 创建工程文件夹1.2 编写用户相关代码1.2.1 stm32f4xx_it.h1.2.2 stm32f4xx_it.c1.2.3 标准库配置&#xff1a;stm32f4xx_conf.h1.2.4 HAL库的配置&#xff1a;stm32f4xx_hal_conf.h1.2.5 LL库配置&#xff1a;stm32f4xx_ll_conf.h 1.3 移植通用文…...

Hive JOIN过滤条件位置玄学:ON vs WHERE的量子纠缠

Hive JOIN过滤条件位置玄学:ON vs WHERE的量子纠缠 作为数据工程师,Hive JOIN就像吃火锅选蘸料——放错位置味道全变!今天带你破解字节/阿里等大厂高频面试题:ON和WHERE后的过滤条件究竟有什么不同? 一、核心差异对比表 特性ON子句WHERE子句执行时机JOIN操作时JOIN完成后…...

MAC快速本地部署Deepseek (win也可以)

MAC快速本地部署Deepseek (win也可以) 下载安装ollama 地址: https://ollama.com/ Ollama 是一个开源的大型语言模型&#xff08;LLM&#xff09;本地运行框架&#xff0c;旨在简化大模型的部署和管理流程&#xff0c;使开发者、研究人员及爱好者能够高效地在本地环境中实验和…...

javaEE-13.spring MVC

目录 什么是spring web mvc: 什么是MVC: 一.创建一个spring项目 二.实现功能: 创建helloController.java项目: 建立连接&#xff1a; RequestMapping注解: 1.RequestMapping注解的使用&#xff1a; 2. RequestMapping 是GET还是POST请求 3.指定请求方法 RestControll…...

C/C++ | 每日一练 (2)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 C/C | 每日一练 (2)题目参考答案封装继承多态虚函数底…...

Nginx 常用命令和部署详解及案例示范

一、Nginx常用命令 1.1 启动 Nginx 要启动 Nginx 服务&#xff0c;可以使用以下命令&#xff1a; sudo systemctl start nginx1.2 停止 Nginx 如果需要停止 Nginx 服务&#xff0c;可以使用以下命令&#xff1a; sudo systemctl stop nginx1.3 重启 Nginx 在修改了 Nginx…...

GO大模型应用开发框架-

Eino 旨在提供基于 Golang 语言的终极大模型应用开发框架。 它从开源社区中的诸多优秀 LLM 应用开发框架&#xff0c;如 LangChain 和 LlamaIndex 等获取灵感&#xff0c;同时借鉴前沿研究成果与实际应用&#xff0c;提供了一个强调简洁性、可扩展性、可靠性与有效性&#xff0…...

保姆级!springboot访问Ollama API并调用DeepSeek模型 Api

要在springboot中访问Ollama API并调用DeepSeek模型,你需要遵循以下步骤。首先,确保你有一个有效的Ollama服务器实例运行中,并且DeepSeek模型已经被加载。 可以参考我的这篇博客 保姆级!使用Ollama本地部署DeepSeek-R1大模型 并java通过api 调用 使用Spring Boot + Sprin…...

力扣hot100 ——搜索二维矩阵 || m+n复杂度优化解法

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 解题思路&#xff1a; 借助行和列有序特性&#xff0c;不断按行或者列缩小范围&#xff1b;途中数字表示每…...

娱乐使用,可以生成转账、图片、聊天等对话内容

软件介绍 今天要给大家介绍一款由吾爱大佬 lifeixue 开发的趣味软件。它的玩法超丰富&#xff0c;能够生成各式各样的角色&#xff0c;支持文字聊天、发红包、转账、发语音以及分享图片等多种互动形式&#xff0c;不过在分享前得着重提醒&#xff0c;此软件仅供娱乐&#xff0…...

【PyQt5】python可视化开发:PyQt5介绍,开发环境搭建快速入门

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

使用 FFmpeg 剪辑视频指南

FFmpeg 是一个功能强大的多媒体处理工具&#xff0c;可以进行视频和音频的剪辑、合并、转码等操作。本文将详细介绍如何使用 FFmpeg 进行视频剪辑&#xff0c;并通过实例帮助你快速掌握剪辑技巧。我们会从最基础的剪切功能讲起&#xff0c;再延伸到一些高级操作&#xff0c;如指…...

AWS云从业者认证题库 AWS Cloud Practitioner

题库持续更新&#xff0c;上方二维码查看完整题库&#xff01; 在分担责任模型下&#xff0c;客户对以下哪项负责? A&#xff1a;确保在使用后擦除磁盘驱动器 B&#xff1a;确保在硬件设备上更新固件 C&#xff1a;确保静态数据已加密 D&#xff1a;确保网线为六类或更高类…...

高性能内存对象缓存Memcached详细实验操作

目录 前提准备&#xff1a; cache1&#xff0c;2&#xff1a; 客户端cache-api&#xff08;一定得是LAMP环境&#xff09; memcache实现主主复制以及高可用(基于以上完成) cache1,2: memcachekeepalived(基于以上完成) cache1,2: 前提准备&#xff1a; 1. 准备三台cent…...

【C++复习专题】—— 类和对象,包含类的引入、访问限定符、类的6个默认成员函数等

1.类的定义 class classname {//类体&#xff1a;由成员函数和成员变量组成 }; class为定义类的关键字&#xff0c;classname为类的名字&#xff0c;{}中为类的主体。 类体中的内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量&#xff1b;类中的函数称为类的方…...

Three.js 快速入门教程【一】开启你的 3D Web 开发之旅

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...

Windows 图形显示驱动开发-CPU 内存调节和64KB 页面支持

对于 32 位 OS 离散图形处理单元 (GPU) 不支持可调整大小的 BAR&#xff0c;或者当调整帧缓冲区 BAR 的大小失败时&#xff0c;Windows 显示驱动程序模型 (WDDM) v2 将提供一种替代机制&#xff0c;通过该机制可以有效地访问离散 GPU VRAM。 对于支持可编程 BAR 地址空间的 GPU…...

PLC通信交互系统技术分享

目录 0、前言 1、模块划分 2、状态机 3、通信层增强 4、异常处理机制 5、核心代码 关键状态处理示例 6、部署与测试方案 1. 环境要求 2. 性能测试指标 0、前言 这是一个C程序&#xff0c;用于与西门子PLC进行通信&#xff0c;处理SN码、拍照信号、检测结果等流程。代码…...

ceph HEALTH_WARN clock skew detected on mon.f, mon.o, mon.p, mon.q

问题 ceph health detail[WRN] MON_CLOCK_SKEW: clock skew detected on mon.f, mon.o, mon.p, mon.qmon.f clock skew 0.243128s > max 0.05s (latency 0.000836159s)mon.o clock skew 16.249s > max 0.05s (latency 0<...

Git命令行入门

诸神缄默不语-个人CSDN博文目录 之前写过一篇VSCode Git的博文&#xff1a;VSCode上的Git使用手记&#xff08;持续更新ing…&#xff09; 现在随着开发经历增加&#xff0c;感觉用到命令行之类复杂功能的机会越来越多了&#xff0c;所以我专门再写一篇Git命令行的文章。 G…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...