新建一个STM32的工程

一、SMT32开发方式

1、基于寄存器的方式:和51单片机开发方式一样,是用程序直接配置寄存器,来达到我们想要的功能,这种方式最底层、最直接、效率会更高一些,但是STM32的结构复杂、寄存器太多,所以不推荐基于寄存器的方式

2、基于标准库(库函数的方式):使用ST官网提供的封装好的函数,通过调用这些函数间接地配置寄存器,ST对寄存器封装的比较好,所以这种方式既能满足对寄存器的配置,对开发人员也比较友好,有利于提高开发效率

3、基于HAL库的方式:可以用图形化界面快速配置STM32,这个比较适合快速上手STM32的情况,但是这种方式隐藏了底层逻辑

二、基于库函数的方式

1、需要准备一个STM32库函数的压缩包

2、新建一个基于标准库的工程

建立一个存放工程的文件夹,把所有32个工程都放在里面

打开keil5软件,选择【project】=>【New uVision Project】

 

 

弹出一个keil软件新建工程小助手,帮助我们快速新建工程,暂时不用这个小助手

3、添加工程的必要文件

STM32是内核和内核外围的设备组成,这个内核的寄存器描述和外围设备的描述文件不是在一起的,所以还需要添加一个内核寄存器的描述文件

工程必要文件就复制完成了

 4、将复制的必要文件添加到工程里

 首先添加一下启动文件,这个启动文件有很多分类,我们只能添加其中一个

 

选择md后缀是因为我们选择的是STM32F103,中容量产品

 5、在工程选项里添加上这个文件夹的头文件路径,不然软件找不到.h文件

6、新建一个main函数

在工程文件夹下,新建一个User文件夹,main函数就放在这个文件夹里

keil里,在Target这里右键,点击添加组

在main.c里,右键插入头文件,选择stm32发0x.h

写一个main函数(main函数是一个int型返回值,void参数的函数)

这个工程目前还没有添加STM32的库函数,所以现在还是一个基于寄存器开发的工程

三、通过配置寄存器完成点灯的操作

1、调节字体大小

 选择UTF-8编码格式,防止中文乱码的问题

 2、拿出STM32的最小系统板、STLINK和四根母对母的杜邦线

按照插针边上的标识,把3.3V、SWDIO、SWCLK、GND对应连接好,并将STLINK插在电脑上

插上电源后,这个板子上的电源灯应该会常亮,另一个连接在PC13口上的灯默认应该是闪烁状态,这是芯片里的一个测试程序

3、在keil5中,配置调试器

#include "stm32f10x.h"                  // Device headerint main(void)
{RCC->APB2ENR=0x00000010;GPIOC->CRH=0x00300000;GPIOC->ODR=0x00002000;	//全为0时PC13的灯亮起,ODR为2000时PC13灯灭了while	(1){}
}

 四、为工程添加库函数

1、打开工程文件夹,新建一个【Library】文件夹,用来存放库函数

 2、keil里,在Target这里右键,点击添加组

打开Library,Ctrl+A选择全部文件,选择【Add】

 3、添加库函数头文件包含关系的相关文件

4、宏定义

头文件右键,打开文件

滑到文件最下面,看到条件编译语句,如果你定义了USE_STDPERIPH_DRIVER(使用标准外设)这个字符串,下面这个include conf.h语句才有效

 在Define栏目粘贴这个字符串,这样才能包含标注外设库,以及头文件路径User和Library路径也都添加上

 将Library向上调一下,将不用更改的文件夹放在最上面

 五、用库函数实现点灯的操作

不自动提醒的按照以下操作(或者按一下快捷键Ctrl+Alt+空格

 点击函数,右键跳到函数定义

#include "stm32f10x.h"                  // Device headerint main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	//GPIOC的外设时钟就配置好了GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);
//	GPIO_SetBits(GPIOC,GPIO_Pin_13);	//将PC13号口置为高电平GPIO_ResetBits(GPIOC,GPIO_Pin_13);	//将PC13号口置为低电平while	(1){}
}

六、总结

1、建立工程文件夹,Keil中新建工程,选择型号

2、工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹

这一步是为了添加工程文件准备的,建文件夹是因为文件比较多需要分类管理一下,需要用的文件夹一定要复制到工程文件夹里面来

3、工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里

在keil里方便管理文件,因为keil没法直接添加文件夹,所以要重复一下,在keil里建立分组,然后添加文件,这个添加文件是把所有的.h文件和.c文件都添加进来了,因为.h文件是不参与编译的,所以很多工程都不添加.h文件,但是添加.h文件比较方便经常打开看

4、工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹

因为Start、Library、User文件夹是自己建立的,keil软件它并不知道,所以要用自己文件夹里面的.h文件,就必须声明一下这个路径

5、工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER

使用库函数的条件编译,使用库函数就必须定义这个,另外其他工程在这里还声明了一个STM32F10X_MD的字符串,但是keil5新建工程后自动就声明好了,不需要额外声明了

6、工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run

这个就是选择调试器来进行下载的选项了,用STLINK就选择STLINK的那一项即可

工程框架

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

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

相关文章

【408真题】2009-15

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

OmicsTools新增了22种发表级的配色方案

OmicsTools新增了22种发表级的配色方案 我开发了一款本地电脑无限使用的零代码生信数据分析作软图神器电脑软件OmicsTools,欢迎大家使用OmicsTools进行生物医学科研数据分析和作图,该软件件能让大家在不需要任何编程和代码编写的基础上,分析…

电子电器架构 - AUTOSAR软件架构Current Features in a Nutshell

电子电器架构 - AUTOSAR软件架构Current Features in a Nutshell 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的…

C++ windows api BYTE数据类型详解

说明 BYTE数据类型是unsigned char的别名,也就是说他的长度是一个字节。0x00-0xFF之间,并且通常没有固定的读取方式。 我们可以用BYTE类型来存储原始二进制数据,例如图像视频流数据,网络数据包,文件I/O等。 BYTE更广…

【笔记】Pytorch安装配置

参考视频 安装前建议预留至少10个G的空间,会省下很多麻烦 查看安装是否成功,可以在Anaconda Prompt里输入conda list查看conda环境是否配置了pytorch/torchvision 1.安装anaconda 2.安装 CUDA CUDA在官网直接安装即可,需要先查看自己电脑…

二分查找(经典)

文章目录 二分查找循环不变量算法实现 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums …

java list<AnalystEducationDO> 转成List<AnalystEducationRespVO>两个对象的属性一样

如果AnalystEducationDO和AnalystEducationRespVO两个类的属性完全相同,且遵循Java Bean的命名规范(即具有相应的getter和setter方法),你可以利用一些库来简化转换过程,比如Apache BeanUtils或Spring Framework的BeanU…

容器是什么

什么是容器? 容器是一种轻量级、可移植的软件包,它包含软件运行所需的所有内容,包括代码、运行时环境、系统工具、系统库和设置。容器使得开发、部署和管理应用程序变得更加高效,因为它们提供了一个标准化的环境,确保…

云原生安全攻防--快速识别虚拟机、Docker和K8s集群环境

今天我们将一起学习一个非常实用的技巧,快速识别云原生环境。 对于攻击者而言,随着云原生应用普及,当攻击者获得一个shell权限时,那么这个shell可能处于虚拟主机里,也有可能在一个Docker环境里,或者在K8s集…

近邻算法模型

目录 1.概述 2.定义 3.优缺点 4.应用场景 5.未来展望 6.代码实现 7.应用实例 1.概述 近邻算法(K-Nearest Neighbor,KNN)是一种基本的机器学习算法,基本思想是:如果一个样本在特征空间中的 k 个最相似&#xff…

聚合函数查询语法,利用人工智能生成DDL,DML语句会省时省力

#聚合函数查询语法 #查询员工最大年龄 select max(age) from student; #查询名字叫做张三的人数 select userName,count(userName) from student where userName张三; #基本语法 select max/min/count/avg/sum(字段名) from 表名 where 字段名 ;#分组函数 #利用group by进行分…

数据结构面试题总结

本文总结面试题&#xff1a; 用Java实现一个栈用Java实现一个队列用Java实现一个链表 1. 用Java实现一个栈 import java.util.ArrayList; import java.util.EmptyStackException; import java.util.List;// 使用泛型&#xff0c;兼容各种数据类型 public class MyStack<T…

创客贴:极简高效的智能平面设计神器测评

给大家推荐一款智能平面设计作图软件——创客贴&#xff0c;简单来说&#xff0c;就是给那些需要频繁进行平面设计的人提供帮助的。它作为一款在线图片编辑器&#xff0c;可以免费使用&#xff0c;让你轻松进行创意设计。创客贴不仅提供了海量正版设计模板和图片素材&#xff0…

vue3 依赖-组件tablepage-vue3版本1.1.2~1.1.5更新内容

github求⭐ 可通过github 地址和npm 地址查看全部内容 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例-汇总 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#…

美甲店会员预约系统管理小程序的作用是什么

女性爱美体现在方方面面&#xff0c;美丽好看的指甲也不能少&#xff0c;市场中美甲店、小摊不少&#xff0c;也跑出了不少连锁品牌&#xff0c;70后到00后&#xff0c;每个层级都有不少潜在客户&#xff0c;商家需要获取和完善转化路径&#xff0c;不断提高品牌影响力与自身内…

JSON解析库之 Fastjson

在开发的过程中我们避免不了需要对json格式的数据进行处理&#xff0c;我们可以借助fastjson来帮助我们快速处理json。 1、特点 高性能&#xff1a;Fastjson通常被认为是最快的JSON解析库之一&#xff0c;具有较快的序列化和反序列化速度。广泛的Java对象支持&#xff1a;Fas…

wsl 无法进行域名解析

修改/etc/revsolv.conf /etc/resolv.conf nameserver 8.8.8.8 nameserver 114.114.114.114 nameserver 【本地电脑ipconfig下的网卡网关地址】 However, for some reason my resolv.conf keep getting recreated on every boot. So I had to make it immutable, like so: sudo …

stringcstring

<string>是C标准库头文件&#xff0c; <cstring>是C标准库头文件. string中可以进行 >等运算&#xff0c; 而cstring中不能进行相关运算。 using namespace std; #include <string> //可以定义string s&#xff1b;可以用到strcpy等函数 using …

002 仿muduo库实现高性能服务器组件_整体框架

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言项目框架小结 前言 本文不会包含任何项目模块的代码&#xff0c;旨在向你介绍项目具体分为哪几个模块&am…

RAM 与 ROM

RAM (Random Access Memory) 定义&#xff1a;随机访问内存&#xff08;RAM&#xff09;是一种可以随机访问的存储设备&#xff0c;意味着可以在几乎相同的时间内访问存储数据的任何位置。它是一种易失性内存&#xff0c;意味着一旦断电&#xff0c;存储在其中的数据就会丢失。…