看到这篇笔记的小伙伴可能会觉得我在做无用功,明明可以通过 STM32CubeMx 软件直接生成的,还在这里慢慢的创建项目。我觉得在学习的时候最好少借助工具,当我们过度依赖工具的时候,决绝问题的能力可能就下降了,所以这是我记录此笔记的主要原因,至少要明白我们都使用了什么文件,在遇到问题的时候可以不那么慌。

由于不使用 STM32CubeMx 软件,所以在使用的时候需要下载 HAL库。

注意:此笔记中使用开发板的是 STM32F103C8T6

一、HAL 库下载

  1. 进入官网:https://www.st.com/content/st_com/zh.html

  2. 找到自己使用的芯片类型

  3. 下载自己需要的 HAL 库的版本,点击获取即可

  4. 解压后目录如下所示:

二、创建功能模板

  1. 新建一个名为 “stm32_template_hal” 的文件,并在文件中创建相应文件,如下图所示

  2. 先拷贝 HAL 库到 lib 文件中,文件在 “STM32Cube_FW_F1_V1.8.0\Drivers\STM32F1xx_HAL_Driver”,保证文件命名格式同一,这里我将文件名给为小写了,如下图所示:



    注意: 其中 STM32F100xX_User_Manual.chm 是 HAL 的 API 文档,至于其中四个文档有啥区别,我还没发现

  3. 在功能的 cmsis 文件中创建如下文件

  4. 将启动文件拷贝到 startup 中,文件在 “STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates”

    **注意:根据自己的需要拷贝相应的启动文件,这里我使用的是 arm\startup_stm32f103xb.s,如下图所示

  5. 拷贝 system_stm32f1xx.c 到工程的 stm32_template_hal\cmsis\stm32_drivers\src 文件中,文件在 “STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates”,如下图所示:

  6. 拷贝相应的头文件到功能的 stm32_template_hal\cmsis\stm32_drivers\inc 文件中,路径在 “STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Include”,如下图所示:

  7. 拷贝 CMSIS 所需的文件到 stm32_template_hal_aaa\cmsis\core 文件中,文件路径在 “STM32Cube_FW_F1_V1.8.4\Drivers\CMSIS\Core\Include” 文件中,如下图所示:



    注意:



    下载①插件时,是 STM32CubeMx 的安装插件,需要安装后才会有 “STM32Cube_FW_F1_V1.8.4\Drivers\CMSIS\Core\Include” 目录,当然步奏7的文件也可以不用拷贝,只需要在想目中添加CMSIS 组件即可

    如果想要找到此步奏的文件,只需要选择②下载即可

  8. 将项目 stm32_template_hal\lib\stm32f1xx_hal_driver\Inc 文件中的 stm32f1xx_hal_conf_template.h 文件复制一份到 stm32_template_hal\application 文件中,并重命名为 stm32f1xx_hal_conf.h,如下图所示:

  9. 将项目 stm32_template_hal\lib\stm32f1xx_hal_driver\Src 文件中的 stm32f1xx_hal_msp_template.c 文件复制一份到 stm32_template_hal\application 文件中,并重命名为 stm32f1xx_hal_msp.c,如下图所示:

  10. 在 stm32_template_hal\application 文件中创建 main.c、main.h、stm32f1xx_it.c、stm32f1xx_it.h,如下图所示:

注意:到此我们需要使用的文件已经拷贝完成了,接下来便可创建工程

三、创建 MDK 工程

  1. 打开Keil软件,创建项目,项目名为STM32F10x_Temp





  2. 添加GROUP,添加GROUP





  3. 勾选 hex 文件生成选项

  4. 设置头文件路径

  5. 添加项目所需的宏,USE_HAL_DRIVER,STM32F103xB

  6. 设置默认编译版本

四、完成程序

  1. main.c

    
    
    #include "main.h"
    
    #define USR_LED_Pin GPIO_PIN_13
    #define USR_LED_GPIO_Port GPIOC void Error_Handler(void); /**
    * @brief 系统时钟配置
    * @retval None
    */
    void SystemClock_Config(void)
    {
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /* 根据 RCC_OscInitTypeDef 结构中的指定参数初始化RCC振荡器 */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
    Error_Handler();
    }
    /* 初始化CPU、AHB和APB总线时钟 */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
    |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
    {
    Error_Handler();
    }
    } /**
    * @brief GPIO初始化功能
    * @param None
    * @retval None
    */
    static void MX_GPIO_Init(void)
    {
    GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */
    HAL_GPIO_WritePin(USR_LED_GPIO_Port, USR_LED_Pin, GPIO_PIN_RESET); /*Configure GPIO pin : USR_LED_Pin */
    GPIO_InitStruct.Pin = USR_LED_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(USR_LED_GPIO_Port, &GPIO_InitStruct); } /**
    * @brief 主程序
    * @param None
    * @retval None
    */
    int main(void)
    {
    /* 重置所有外围设备,初始化Flash接口和Systick */
    HAL_Init(); /* 配置系统时钟 */
    SystemClock_Config(); /* 初始化GPIO引脚 */
    MX_GPIO_Init(); while (1)
    {
    /* 将 LED 灯的状态进行取反 */
    HAL_GPIO_TogglePin(USR_LED_GPIO_Port, USR_LED_Pin);
    HAL_Delay(1000);
    }
    } /**
    * @brief 此功能在发生错误时执行
    * @retval None
    */
    void Error_Handler(void)
    {
    /* 可以添加自己的实现来报告HAL错误返回状态 */
    __disable_irq();
    while (1)
    { }
    }
  2. main.h


    #ifndef __MAIN_H
    #define __MAIN_H #include "stm32f1xx_hal.h" #endif /* __MAIN_H */
  3. stm32f1xx_it.c

    /**
    ******************************************************************************
    * @file Templates/Src/stm32f1xx.c
    * @author MCD Application Team
    * @brief Main Interrupt Service Routines.
    * This file provides template for all exceptions handler and
    * peripherals interrupt service routine.
    ******************************************************************************
    * @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
    *
    ******************************************************************************
    */ /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "stm32f1xx_it.h" /** @addtogroup STM32F1xx_HAL_Examples
    * @{
    */ /** @addtogroup Templates
    * @{
    */ /* Private typedef -----------------------------------------------------------*/
    /* Private define ------------------------------------------------------------*/
    /* Private macro -------------------------------------------------------------*/
    /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/
    /* Private functions ---------------------------------------------------------*/ /******************************************************************************/
    /* Cortex-M3 Processor Exceptions Handlers */
    /******************************************************************************/ /**
    * @brief This function handles NMI exception.
    * @param None
    * @retval None
    */
    void NMI_Handler(void)
    {
    } /**
    * @brief This function handles Hard Fault exception.
    * @param None
    * @retval None
    */
    void HardFault_Handler(void)
    {
    /* Go to infinite loop when Hard Fault exception occurs */
    while (1)
    {
    }
    } /**
    * @brief This function handles Memory Manage exception.
    * @param None
    * @retval None
    */
    void MemManage_Handler(void)
    {
    /* Go to infinite loop when Memory Manage exception occurs */
    while (1)
    {
    }
    } /**
    * @brief This function handles Bus Fault exception.
    * @param None
    * @retval None
    */
    void BusFault_Handler(void)
    {
    /* Go to infinite loop when Bus Fault exception occurs */
    while (1)
    {
    }
    } /**
    * @brief This function handles Usage Fault exception.
    * @param None
    * @retval None
    */
    void UsageFault_Handler(void)
    {
    /* Go to infinite loop when Usage Fault exception occurs */
    while (1)
    {
    }
    } /**
    * @brief This function handles SVCall exception.
    * @param None
    * @retval None
    */
    void SVC_Handler(void)
    {
    } /**
    * @brief This function handles Debug Monitor exception.
    * @param None
    * @retval None
    */
    void DebugMon_Handler(void)
    {
    } /**
    * @brief This function handles PendSVC exception.
    * @param None
    * @retval None
    */
    void PendSV_Handler(void)
    {
    } /**
    * @brief This function handles SysTick Handler.
    * @param None
    * @retval None
    */
    void SysTick_Handler(void)
    {
    HAL_IncTick();
    } /******************************************************************************/
    /* STM32F1xx Peripherals Interrupt Handlers */
    /* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
    /* available peripheral interrupt handler's name please refer to the startup */
    /* file (startup_stm32f1xx.s). */
    /******************************************************************************/ /**
    * @brief This function handles PPP interrupt request.
    * @param None
    * @retval None
    */
    /*void PPP_IRQHandler(void)
    {
    }*/ /**
    * @}
    */ /**
    * @}
    */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  4. stm32f1xx_it.h

    /**
    ******************************************************************************
    * @file Templates/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 __cplusplus
    extern "C" {
    #endif /* Includes ------------------------------------------------------------------*/
    /* Exported types ------------------------------------------------------------*/
    /* Exported constants --------------------------------------------------------*/
    /* Exported macro ------------------------------------------------------------*/
    /* Exported functions ------------------------------------------------------- */ 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 /* __STM32F1xx_IT_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

五、常见问题

  1. 程序在 HAL_Delay 延时函数中卡死,是因为没有定义 void SysTick_Handler(void) 中断函数

STM32新建模板【HAL库】的更多相关文章

  1. STM32新建模板之库文件

    一.新建项目文件夹 在桌面创建项目文件夹,用于存放工程,命名为"stm32f10x_project" 在项目文件夹中创建3个文件夹,分别命名为:CMSIS.OUTPUT.STM32 ...

  2. STM32新建模板之寄存器

    创建寄存器的项目模板相对比较简单,这里是基于库文件的模板进行更改的,有不明白的小伙伴可以浏览STM32新建模板之库文件. 一.项目文件 拷贝库文件的工程模板重命名为"stm32f10x_re ...

  3. STM32,下载HAL库写的代码后J-Link识别不到芯片,必须要按住复位才能下载?

    问题描述:最近在学STM32的HAL库,据说可以统一STM32江湖,前途无量.最近一段时间参照STM32CubeMX和原子的资料自己学着建了两个HAL库的工程模板,F4的还好说,F1的出现了一个玄学问 ...

  4. 【stm32】基于hal库使用野火指南者esp8266 WIFI模块进行TCP传输

    UART.c #include "stm32f1xx_it.h" #include "LED.h" #include "UART.h" #i ...

  5. 新建基于STM32F103ZET6的工程-HAL库版本

    1.STM32F103ZET6简介 STM32F103ZET6的FLASH容量为512K,64K的SRAM.按照STM32芯片的容量产品划分,STM32F103ZET6属于大容量的芯片. 2.下载HA ...

  6. STM32标准外设库、 HAL库、LL库

    工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是常用的库,后面的LL库是ST最近才添加,目前支持的 ...

  7. STM32之HAL库、标准外设库、LL库(STM32 Embedded Software)-(转载)

    STM32 Embedded Software  工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是 ...

  8. STM32 之 HAL库(固件库) _

    1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...

  9. STM32 之 HAL库(固件库)

    1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...

  10. (4)STM32使用HAL库实现串口通讯——理论讲解

    一.查询模式 1. 二.中断模式 1.中断接收. 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandle ...

随机推荐

  1. c++结对编程

    || |:--|:--| |Github项目|Github地址 |结对伙伴|伙伴地址1伙伴地址2 PSP表格 ||| |:--|:--|:--|:--| |PSP2.1|Personal Softwa ...

  2. Nginx系列---【配置文件中静态资源文件禁止通过目录查看】

    配置文件中静态资源文件禁止通过目录查看 1.问题 nginx作为文件服务器时,默认是可以通过目录路径查看该目录下的所有文件的,这样很不安全,容易造成静态资源泄露. 2.方案 location /ima ...

  3. 微信小程序安装vant

    1.初始化npm并安装 npm init -y npm install 2.修改project.config.json { "setting": { "packNpmMa ...

  4. JavaScript ES6 类和对象 简单记录

    一/*1.在ES6之前如果定义一个类?通过构造函数来定义一个类*/ function Person(myName, myAge) { // 实例属性 // this.name = "lnj& ...

  5. 二、pycharm的安装

    1.python安装教程在上一篇已描述,详情查看: 2.安装pycharm 首先从网站下载pycharm:链接为:http://www.jetbrains.com/pycharm/download/# ...

  6. 关于使用antd-proTable,报错 ResizeObserver loop limit exceeded

    错误如上,原因有几种情况 一:columns中,属性又ellipsis属性,但是没有设置width,导致table不知道如何计算在什么时候,开始对内容进行加省略号,出现了计算错误 如  const c ...

  7. Nodejs 发送 TCP 消息的正确姿势

    最近使用 NODE-RED 跟 TCP 打交道.NODE-RED 里内建了一个节点叫"tcp-out",看文档呢使用这个节点可以很方便的把 payload 用 TCP 协议发送出去 ...

  8. Flink双流消费kafka合并数据,并包含滑动窗口、算子、输出到MySQL的示例

    Java示例 import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.api.java.fu ...

  9. CentOS7.6 单用户模式下修改root密码

    第一种方法: 1.启动时用上下键选择要进入的内核,输入'e'进入编辑 2.可以使用上下键移动找到linux16这行编辑ro 为 rw init=/sysroot/bin/sh 并使用ctrl + x进 ...

  10. 一文读懂字符编码ASCII、Unicode与UTF-8

    先说一下,为什么写这篇文章? 最近在写一个Http协议栈当涉及CRLF控制字符写入时,发现自己对CRLF与\r\n的关系不太了解,因此决定详细学习一下:查阅资料的同时,又遇到UTF-8与ASCII编码 ...