[STM32] Keil 创建 HAL 库的工程模板

Keil 创建 HAL 库的工程模板

跟着100ASK_STM32F103_MINI用户手册V1.1.pdf的第7章步骤进行Keil工程的创建。

文章目录

  • 1 创建相关文件夹
  • 2 创建“main.c/h”和“stm32f1xx_clk.c/h”
  • 3 复制CMSIS和HAL库
  • 4 创建新的Keil工程
  • 5 添加组文件夹和工程文件
  • 6 配置Keil设置

1 创建相关文件夹

在文件夹下新建5个子文件夹:Core、Driver、Main、Project、SDK,如下图所示

image-20221005144721147

将下列的5个文件复制粘贴到 Core 文件夹下

"STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm\startup_stm32f103xb.s"
"STM32Cube_FW_F1_V1.8.0\Projects\STM3210E_EVAL\Templates\Src\system_stm32f1xx.c"
"STM32Cube_FW_F1_V1.8.0\Projects\STM3210E_EVAL\Templates\Src\stm32f1xx_it.c"
"STM32Cube_FW_F1_V1.8.0\Projects\STM3210E_EVAL\Templates\Inc\stm32f1xx_it.h"
"STM32Cube_FW_F1_V1.8.0\Projects\STM3210E_EVAL\Templates\Inc\stm32f1xx_hal_conf.h"

2 创建“main.c/h”和“stm32f1xx_clk.c/h”

并且在 Core 文件夹下新建"stm32f1xx_clk.h"和stm32f1xx_clk.c",这两个文件的内容分别如下

stm32f1xx_clk.h

/*  Copyright (s) 2019 深圳百问网科技有限公司
 *  All rights reserved
 * 
 * 文件名称:文件名称:stm32f1xx_clk.h
 * 摘要:
 *  
 * 修改历史     版本号        Author       修改内容
 *--------------------------------------------------
 * 2020.6.6      v01        百问科技      创建文件
 *--------------------------------------------------
*/

#ifndef __STM32F1XX_CLK_H
#define __STM32F1XX_CLK_H

#ifdef __cplusplus
extern "C" {
#endif

extern void SystemClock_Config(void);

#ifdef __cplusplus
}
#endif /* cplusplus */

#endif /* system_clk.h */

stm32f1xx_clk.c

/*  Copyright (s) 2019 深圳百问网科技有限公司
 *  All rights reserved
 * 
 * 文件名称:stm32f1xx_clk.c
 * 摘要:
 *  
 * 修改历史     版本号        Author       修改内容
 *--------------------------------------------------
 * 2020.6.6      v01        百问科技      创建文件
 *--------------------------------------------------
*/

#include "stm32f1xx_hal.h"
#include "stm32f1xx_clk.h"

/**
  * @brief  System Clock Configuration
  *         The system Clock is configured as follow : 
  *            System Clock source            = PLL (HSI)
  *            SYSCLK(Hz)                     = 72000000
  *            HCLK(Hz)                       = 72000000
  *            AHB Prescaler                  = 1
  *            APB1 Prescaler                 = 2
  *            APB2 Prescaler                 = 1
  *            PLLMUL                         = 9
  *            Flash Latency(WS)              = 2
  * @param  None
  * @retval None
  */
void SystemClock_Config(void)
{    
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    //RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

    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)
    {
        while(1);
    }

    /** Initializes the CPU, AHB and APB busses clocks 
    */
    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)
    {
        while(1);
    }
}

在 Main 文件夹下新建"main.h"和"main.c"两个文件,内容分别如下

main.h

/*  Copyright (s) 2019 深圳百问网科技有限公司
 *  All rights reserved
 * 
 * 文件名称:main.h
 * 摘要:
 *  
 * 修改历史     版本号       Author       修改内容
 *--------------------------------------------------
 * 2020.6.6      v01        百问科技      创建文件
 *--------------------------------------------------
*/
#ifndef __MAIN_H
#define __MAIN_H

#include "stm32f1xx_hal.h"
#include "stm32f1xx_clk.h"

#endif

main.c

/*  Copyright (s) 2019 深圳百问网科技有限公司
 *  All rights reserved
 * 
 * 文件名称:main.c
 * 摘要:
 *  
 * 修改历史     版本号       Author       修改内容
 *--------------------------------------------------
 * 2022.1.4      v01        百问科技      创建文件
 *--------------------------------------------------
*/
#include "main.h"

int main(void)
{    
    //uint32_t sys_clk = 0;
    // 初始化HAL库函数必须要调用此函数
    HAL_Init();

    /*
     * 系统时钟即AHB/APB时钟配置
     * 当使用内部高速时钟HSE(8MHz)配置系统时钟时,使用PLL前可以选择不分频或者二分频,我们要配置到最大72MHz的系统频率此处当然是不分频
     * 然后经过一个放大器,最大放大倍数为16,我们要想得到72MHz,此处选择9倍放大系数,即8*9=72MHz即可达到目标
    */
    SystemClock_Config();
    

    while(1)
    {
    }
}

/*
 *  函数名:void Error_Handler(void)
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
 *  函数作用:程序错误处理函数,此处暂时设为死循环,不做任何动作
*/
void Error_Handler(void)
{
    while(1)
    {
    }
}

3 复制CMSIS和HAL库

将下面两个文件夹复制粘贴到 SDK 文件夹

"STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS"
"STM32Cube_FW_F1_V1.8.0\Drivers\STM32F1xx_HAL_Driver"

最终结果如下面的5张图片所示

image-20221005151244362

image-20221005151308479

image-20221005151329923

image-20221005151350529

image-20221005151407137

4 创建新的Keil工程

打开 Keil-MDK,点击"Project"下的"New uVision Project…",如下图所示

image-20221005151702091

然后在弹出的文件路径选择界面,选择"Project"目录,工程名字为"Template",如下图所示。

image-20221005151936546

接着在设备选择界面的搜索框输入"STM32F103C8",然后选择"STM32F103C8",点击"OK",如下图所示

image-20221005152157143

随后弹出运行时环境(Run-Time Environment,RTE),目前用不到,直接选择"Cancel",如下图所示

image-20221005152309306

5 添加组文件夹和工程文件

接着进入主界面,点击"管理工程项目"按钮,为工程添加文件,如下图所示

image-20221005152515236

在管理工程项目界面,有三个窗口,分别是目标工程(Project Targets)、分组(Groups)、文件(Files)。 如下图所示

image-20221005152700041

双击“Project Targets”下的“Target 1”,可修改名字,这里改为“Template”,双击“Groups”下的“Source Groups 1”,改为“Core”,如下图所示

image-20221005152809726

接着选中“Core”,点击“Add Files…”,如下图所示

image-20221005152903880

接着在弹出的文件选择界面,进入“Core”目录,然后需要 修改“文件类型”下拉选择框为“All files(.)”,才能看到所有文件,如下图所示

image-20221005153012444

然后选中“startup_stm32f103xb.s”,点击“Add”,如此循环直至如图所示的五个文件全部加入“Core”。如下图所示

image-20221005153245240

image-20221005153334649

再点击“Groups”的新建图标,创建一个新的组,名为“Main”,如下图所示。

image-20221005153446854

接着选中“Main”组后,点击“Add Files…”,选中“main.c”,再点击“Add”,如下图所示。

image-20221005153548457

再点击“Groups”的 新建图标,创建一个新的组,名为“Driver”,该组没有文件,无需添加。再新 建“SDK”,加入“SDK\STM32F1xx_HAL_Driver\Src”下的几个必须文件,如下图所示。

image-20221005153952916

所有文件添加完成后,效果如下图4张图所示。

image-20221005154034457

image-20221005154113340

image-20221005154134242

image-20221005154211122

按上图添加完后,点击“OK”保存,如下图所示。

image-20221005154243008

6 配置Keil设置

接着进入主界面,点击“工程项目选项”按钮,如下图所示

image-20221005154348182

在弹出的窗口,选择“Target”标签,如下图所示。追求稳定,这里设置ARM交叉编译工具链为“Use default compiler version”。“Use MicroLIB”也可以勾选上,编译出来的文件占用资源会更小,也为后面调试串口实验提供printf。再下面是Flash和RAM的起始地址和大小,与Figure 11所示的Flash和RAM是吻合的,这里无需修改。

image-20221005154551963

1_STM32F103x8数据手册【重要】_34

切换到“Output”,勾选上“Create HEX File”,生成hex文件供其它烧写工具使用,如下图所示

image-20221005154645426

再切换到“C/C++”标签,在“Define”栏填入“USE_HAL_DRIVER,STM32F103xB”(注意两个宏之间是英文的逗号),分别表示使用HAL库,使用的芯片型号系列。HAL库很多C语言语法采用C99标准,这里需要勾选上“C99 Mode”,不 然会编译报错。最后点击“Include Paths”最右边的按钮 添加头文件,如下图所示

image-20221005154855814

在弹出的文件夹设置窗口,点击 按钮,依次添加如下面第3张图所示路径,最后点击“OK”。

image-20221005155002433

image-20221005155022347

image-20221005155307317

切换到“Debug”标签,我们使用ST-Link,因此需要选择“ST-Link Debugger”,最后点击“OK”, 如下图所示

image-20221005155402581

以上全部设置完后,点击 编译,

image-20221005160017181

编译完后,点击 下载(这里需连接ST-Link才能点击下载,否则使用100ASK_STM32F103_TOOLS的自动下载)

image-20221005160607175

image-20221005161516449

image-20221005161536410

image-20221005162450145

删除重新添加下载算法

image-20221005163825347

image-20221005163907352

出现如下图所示的红色下划线提示,即表示编译、烧写都正常(当前工程主函数没有任何内容,开发板无任何现象)。之后便可以,以此工程为模板,编辑 main.c,向“Driver”添加外设驱动程序,进行开发。

image-20221005164157971

参考资料:
100ASK_STM32F103_MINI开发板资料下载

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ollama使用

当前各种大模型层出不穷,但想要在本地运行起来一个大模型还是有一定门槛的。 并且模型众多, 每个模型都有自己不同的配置和使用方法,使用非常不便。 Ollama就是一个非常好的工具, 可以让你方便在本地运行各种大模型。 1 安装 支…

【前端学习——js篇】11.元素可见区域

具体见:https://github.com/febobo/web-interview 11.元素可见区域 ①offsetTop、scrollTop offsetTop,元素的上外边框至包含元素的上内边框之间的像素距离,其他offset属性如下图所示: 下面再来了解下clientWidth、clientHeight…

报错there is no HDFS_NAMENODE_USER defined

在Hadoop安装目录下找到sbin文件夹,修改里面的四个文件 1、对于start-dfs.sh和stop-dfs.sh文件,添加下列参数: HDFS_DATANODE_USERroot HDFS_DATANODE_SECURE_USERhdfs HDFS_NAMENODE_USERroot HDFS_SECONDARYNAMENODE_USERroot 2、对于st…

云贝教育 |【技术文章】pg_bulkload介绍

注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 pg_bulkload 是一个高性能的数据加载工具,专门为PostgreSQL数据库设计,用于大批量数据的快速导入。pg_bulk…

【YOLOV5 入门】——detect.py简单解析模型检测基于torch.hub的检测方法

声明:笔记是毕设时根据B站博主视频学习时自己编写,请勿随意转载! 一、打开detect.py(文件解析) 打开上节桌面创建的yolov5-7.0文件夹里的detect.py文件(up主使用的是VScode,我这里使用pycharm…

电商数据采集平台兼具海量采集国内淘系京东国外LAZADA亚马逊阿里巴巴等平台数据采集

很多的电商数据采集API接口可以使用国内电商平台淘系、京东的行业数据,境外Lazada等平台的行业数据,以及各类直播电商数据等,相对淘数据来说,平台更多一些,但是价格也比较贵,一般是按照行业下类目来销售的&…

华为耳机快速配对新设备,一招搞定

耳机现在已经是我们形影不离的随身设备,如果我们碰见华为手机或平板无法连接或连接不上华为耳机(如FreeBuds、FreeLace系列及FreeClip蓝牙耳机)的问题,其实很简单,今天分享一个小妙招,帮助我们快速解决这个…

ConcurrentHashMap 是如何保证并发安全的

ConcurrentHashMap JDK1.7 ConcurrentHashMap 是如何保证并发安全的?使用分段锁的概念: 例如这张图,共有 256 个槽位,如果整个哈希表用一把锁,势必性能低下 如果256个槽位,每个槽位都有一把锁&#xff0…

懒人方法|(一)分享:NHANES数据库怎么下载整理

1.前言 继前面孟德尔随机化的代码分享,应粉丝要求出一篇关于NHANES数据库的数据整理入门教程 前面MR代码:全代码分享|R语言孟德尔随机化怎么做?TwoSampleMR包MR一套标准流程 2.数据库界面 NHANES(National Health …

数据结构算法刷题笔记——题型解法

数据结构算法刷题笔记——题型解法 一、常用容器1.1 vector1.1.1 vector基本操作1.1.1.0 头文件#include<vector>1.1.1.1 构造一个vector容器1.1.1.2 元素访问1.1.1.3 元素个数 .size()1.1.1.4 最大容量 .capacity()1.1.1.5 改变容器有效元素个数 .resize(n)1.1.1.6 改变…

详解智慧路灯杆网关的集中供电能力

智慧路灯杆网关是智慧杆物联网系统中不可或缺的设备。智慧杆网关不仅可以作为杆载设备与云平台、设备与设备之间的桥梁&#xff0c;促进数据的无缝传输&#xff0c;而且还能提供高效的能源管理和供电功能。 BMG8200系列交流型智慧路灯杆网关就集成了强大的供电能力&#xff0c;…

数字信号转模拟信号 DA变换 高精度PWM脉宽调制信号100Hz PWM/5KHz PWM /10KHz PWM转4-20mA/0-10V/1-5V/0-5V

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

如何确保六西格玛培训效果最大化?

近年来&#xff0c;如何确保六西格玛培训的效果&#xff0c;使其真正转化为企业的生产力&#xff0c;成为许多管理者关注的焦点。本文&#xff0c;天行健Six Sigma咨询公司将分享如何确保六西格玛培训效果最大化&#xff0c;帮助企业在实施六西格玛管理的过程中取得更好的成效。…

Java基础-多线程基础

文章目录 1.线程相关概念1.程序2.进程3.线程4.单线程5.多线程6.并发7.并行查看当前电脑cpu数量 2.线程基本使用1.线程类图2.继承Thread创建线程细节说明代码实例 3.实现Runnable来创建线程&#xff08;包括静态代理演示&#xff09;代码实例 3.多线程机制简要介绍代码实例为什么…

qtxlsx 学习

简介&#xff1a; QXlsx是一个可以读写Excel文件的库。不依赖office以及wps组件&#xff0c;可以在Qt5支持的任何平台上使用。 QXlsx和QAxObject 比较 QAxObject使用需要系统中安装了offie或wps&#xff0c;这种方法不推荐使用&#xff1b; 因为如果安装了wps&#xff0c;可…

puzzle(1122)连线迷宫

目录 一&#xff0c;连线迷宫-经典模式 1&#xff0c;规则 2&#xff0c;策略 3&#xff0c;调整的局部性 4&#xff0c;八连通端点的线条合并 taptap小游戏 迷宫解谜 连线迷宫模式 一&#xff0c;连线迷宫-经典模式 1&#xff0c;规则 2&#xff0c;策略 分2步&#x…

Kali远程操纵win7

一.准备 1.介绍 攻击方&#xff1a;kali IPV4:192.168.92.133 被攻击方&#xff1a;win7 IPV4:192.168.92.130 2.使用永恒之蓝漏洞 (1.使用root权限 (2.进入msfconsole (3.添加rhosts (4.run进行一下 二.进行远程操作 1.获取用户名和密码 在cmd5查询 2.获取syste…

Windows下如何查看端口被谁占用

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 开始时经常遇到这种…

LVS负载均衡-DR模式配置

LVS&#xff1a;Linux virtual server ,即Linux虚拟服务器 LVS自身是一个负载均衡器&#xff08;Director&#xff09;&#xff0c;不直接处理请求&#xff0c;而是将请求转发至位于它后端的真实服务器real server上。 LVS是四层&#xff08;传输层 tcp/udp&#xff09;负载均衡…

SpringBoot SpringMVC (详解)

6. SpringBoot Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 是为了快速开发 Spring 程序开发而诞生的。 Spring Boot 的优点&#xff1a; 快速集成框架&#xff0c;Spring Boot 提供了启动添加依赖的功能&#xff0c;⽤于秒级集成各种框架。内置运⾏…