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库

//标准外设库SPL
#include	"stm32f4xx.h"void Delay(__IO uint32_t nCount);
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. 新建工程

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库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19715.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CV -- 基于GPU版显卡CUDA环境+Pycharm YOLOv8 检测

目录 下载 CUDA 下载 cuDNN 下载 anaconda 安装 PyTorch pycharm 搭配 yolo 环境并运行 阅读本文须知&#xff0c;需要电脑中有 Nvidia 显卡 下载 CUDA 打开 cmd &#xff0c;输入 nvidia-smi &#xff0c;查看电脑支持 CUDA 版本&#xff1a; 我这里是12.0&#xff0c;进入…

MATLAB图像处理:图像分割方法

图像分割将图像划分为具有特定意义的子区域&#xff0c;是目标检测、医学影像分析、自动驾驶等领域的核心预处理步骤。本文讲解阈值分割、边缘检测、区域生长、聚类分割、基于图的方法等经典与前沿技术&#xff0c;提供MATLAB代码实现。 目录 1. 图像分割基础 2. 经典分割方…

海康摄像头IPV6模式,手动,自动,路由公告

海康摄像头DS-2DC7220IW-A 网络设置中的IPv6配置选项。IPv6是互联网协议&#xff08;IP&#xff09;的第六版&#xff0c;用于替代IPv4&#xff0c;提供更多的IP地址和改进的网络功能。图片中的选项允许用户选择如何配置设备的IPv6网络连接&#xff1a; 手动&#xff1a;用户可…

NewMap10.3土地勘测定界自动化系统

“NewMap报件通”适用于建设项目用地土地勘测定界工作&#xff0c;其设计理念是以最大化提高作业效率与最简化作业员操作为原则&#xff0c;后台采用数据库管理技术&#xff0c;以“GIS概念”实现了图形数据与属性数据的双向联动&#xff0c;利用该系统可以方便快捷地绘制数字化…

栈(典型算法思想)—— OJ例题算法解析思路

目录 一、1047. 删除字符串中的所有相邻重复项 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 1. 初始化结果字符串 2. 遍历输入字符串 3. 检查和处理字符 4. 返回结果 总结 二、844. 比较含退格的字符串 - 力扣&#xff08;LeetCode&#xff09; 算…

Qt中基于开源库QRencode生成二维码(附工程源码链接)

目录 1.QRencode简介 2.编译qrencode 3.在Qt中直接使用QRencode源码 3.1.添加源码 3.2.用字符串生成二维码 3.3.用二进制数据生成二维码 3.4.界面设计 3.5.效果展示 4.注意事项 5.源码下载 1.QRencode简介 QRencode是一个开源的库&#xff0c;专门用于生成二维码&…

字符串哈希动态规划_6

一.字符串哈希 字符串哈希概述 字符串哈希是一种将字符串映射到一个数值的技术&#xff0c;常用于处理字符串相关的算法问题&#xff0c;尤其在处理字符串匹配、子串查找等问题时非常高效。它的核心思想是利用一个哈希函数将字符串映射成一个整数&#xff0c;并根据该整数来判…

Kubernetes控制平面组件:Kubernetes如何使用etcd

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

Mybatis后端数据库查询多对多查询解决方案

问题场景&#xff1a; 我开发的是一个论文选择系统。 后端用一个论文表paper来存储论文信息。 论文信息中&#xff0c;包含前置课程&#xff0c;也就是你需要修过这些课程才能选择这个论文。 而一个论文对应的课程有很多个。 这样就造成了一个数据库存储的问题。一个paper…

BGP配置华为——RR反射器配置

实验拓扑 与之前实验同理将loop0作为routerID使用&#xff0c;且R1和R2上用loop1接口用于模拟用户其他网段 实验要求 1&#xff0c;在AS100内运行OSPF协议 2.配置路由反射器&#xff0c;使得从R1进入的数据能够反射到全局网络 3.在R1和R2上分别宣告自己的loop1口网段用于观…

CentOS7 离线安装 Postgresql 指南

一、背景 服务器通常都是离线内网环境&#xff0c;想要通过联网方式一键下载安装 Postgresql 不太现实&#xff0c;本文将介绍如何在 CentOS7 离线安装 Postgresql&#xff0c;以及遇到困难如何解决。 二、安装包下载 先在本地下载好 rpm 包&#xff0c;再通过 ftp 上传到服…

vue3项目实践心得-寻找未被使用的最小编号

&#x1f9e1;&#x1f9e1;遇到的问题&#x1f9e1;&#x1f9e1; 在用vue3ts编写编译原理项目中”绘制状态转换图“时&#xff0c;有一个添加状态的功能按钮&#xff0c;用户点击按钮即可添加一个新的状态&#xff0c;至于新的状态的编号值&#xff0c;想着以”最小未被使用…

FPGA简介|结构、组成和应用

Field Programmable Gate Arrays&#xff08;FPGA&#xff0c;现场可编程逻辑门阵列&#xff09;&#xff0c;是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物&#xff0c; 是作为专用集成电路&#xff08;ASIC&#xff09;领域中的一种半定制电路而出现的&#xff0c…

C# 入门简介

关于C# ​ C# &#xff08;读作C Sharp&#xff09;是由微软公司开发的一种面向对象、类型安全、高效且简单的编程语言&#xff0c;最初于 2000 年发布&#xff0c;并随后成为 .NET 框架的一部分。所以学习C#语言的同时&#xff0c;也是需要同步学习.NET框架的&#xff0c;不过…

处理使用 mapstruct 导致分页总数丢失问题

问题 PageHelper 分页总数不对&#xff0c;返回的总数老是等于当前页数目 分析 问题出现在 domain 转 VO 这个步骤&#xff0c;当我把数据库实体类型的 list 转为 vo 类型的 list&#xff0c;然后放进 PageInfo 则会丢失分页信息&#xff1b; 解决方式 从数据库查询出来后…

LabVIEW中的icon.llb 库

icon.llb 库位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform 目录下&#xff0c;是 LabVIEW 系统中的一个重要库。它的主要功能是与图标相关的操作&#xff0c;提供了一些实用的 VI 用于处理 LabVIEW 图标的显示、修改和设置。通过该库&#x…

【ProtoBuf】文件编写及序列化

ProtoBuf文件编写及序列化 文章目录 ProtoBuf文件编写及序列化快速上手ProtoBuf创建.proto 文件指定Proto3语法Package声明符定义消息(message)定义消息字段编译命令 序列化与反序列化的使用小结 快速上手ProtoBuf 为了快速上手以及完整的使用ProtoBuf&#xff0c;我们将编写一…

Java高频面试之SE-22

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; Java中的Optional了解多少&#xff1f; 在 Java 中&#xff0c;Optional 是 Java 8 引入的一个容器类&#xff0c;用于显式处理可能为 null 的…

250217-数据结构

1. 定义 数据结构是数据的存储结构&#xff0c;即数据是按某些结构来存储的&#xff0c;比如线性结构&#xff0c;比如树状结构等。 2. 学习意义 数据结构是服务于算法的&#xff0c;为了实现算法的高效计算&#xff0c;所以将数据按特定结构存储。比如使用快速插入或删除的…

PyCharm2024使用Python3.12在Debug时,F8步进时如同死机状态

在使用时PyCharm2024&#xff0b;Python3.12&#xff0c;在程序进行调试时&#xff0c;按F8步进时如同死机状态。 1、相同的程序在PyCharm2023&#xff0b;Python3.9时是没有问题的&#xff0c;因此决定重装PyCharm2023&#xff0b;Python3.9&#xff0c;进行调试——调试OK。 …