【STM32】新建工程

学习来源:[2-2] 新建工程_哔哩哔哩_bilibili

目前STM32的开发主要有基于寄存器的开发方式基于标准库也就是库函数的方式基于HAL库的方式。本学习是基于库函数的方式。(各种资料去百度云下载)

1 建立工程文件夹

Keil中新建工程,选择型号

选择相应的芯片型号(STM32F103C8T6)

关掉工程小助手

2 在工程文件夹中新建文件

工程文件夹里建立Start、复制固件库里面的文件到工程文件夹;

2.1 STM32的启动文件

在工程文件夹里新建start文件夹

找到STM32的启动文件

\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm

\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\

stm32f10x.h是STM32的外设寄存器描述文件,作用和51单片机的REGX52.H一样,是用来描述STM32有哪些寄存器和它对应的地址的。

两个System文件主要是用了配置时钟的。STM32主频72MHz就是System中的函数配置的。

复制到Start文件夹中。

因为这个STM32是内核和内核外围的饺备组成的,所以添加内核寄存器的描述文件到Start文件下

\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport

2.2 将复制的文件添加到工程

添加启动文件(为什么选这个,后面会说)

剩下的.c和.h文件都要添加进来,结果如图

2.3 在工程选项中添加头文件的路径

添加start的路径

2.4 新建main函数

先在工程目录下添加User文件夹,再在界面新建User目录,添加c文件,将路径改到User下

#include "stm32f10x.h"                  // Device headerint main(void)
{while(1){}}

编译

这个工程目前还没有添加STM32的库函数,所以它还是基于寄存器开发的工程。(想使用寄存器开发STM32到这里就可以了,但是我们是基于库函数的学习)。

调编码格式(UTF-8)、字体、缩进

2.5 通过配置寄存器来完成点灯实验

【了解】

配置调试器

再点击设置按钮

勾上选项之后。我们下载程序后会立马复位并执行。这样方便些。

打开STM32的参考手册(STM32F10xxx参考手册)

(a)首先是RCC的寄存器,来使能GPIO的时钟,GPIO都是APB2的外设

RCC: Reset and Clock Control,即复位和时钟控制。

APB2 外设时钟使能寄存器(RCC_APB2ENR)

这一位就是使能GPIOC的时钟的

写1是打开时钟,即

RCC->APB2ENR = 0x00000010;

(b)需要配置PC13口的模式(端口配置高寄存器(GPIOx_CRH) (x=A..E))

CNF13和MODE13就是配置13号口的

CNF配置为通用推挽输出模式,MODE配置为输出模式。

其他全为0

GPIOC->CRH = 0x00300000;

(c)GPIO输出数据

测试代码

#include "stm32f10x.h"                  // Device headerint main(void)
{RCC->APB2ENR = 0x00000010;GPIOC->CRH = 0x00300000;GPIOC->ODR = 0x00000000;		// 低电平点亮
//	GPIOC->ODR = 0x00002000;		// 灭while(1){}}

需要不断查手册,来了解寄存器的功能。(不方便)

2.6 通过库函数实现点灯实验

在工程目录下新建Library文件夹,将下述文件夹下的所有文件粘贴到Library下(库函数的源文件和头文件)

\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src
\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc

结果如图

此时库文件还不能使用,需要再添加配置文件,将下述文件粘贴到User路径下,再在keil中将新加的文件加入

\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template

结果如图

最后需要一个宏定义

USE_STDPERIPH_DRIVER

将文件夹添加进来

代码步骤和配置寄存器是一样的

(1)配置时钟-RCC_APB2PeriphClockCmd

本质函数配置寄存器

(2)配置端口模式-GPIO_Init

两个参数,GPIO_TypeDef* GPIOx和GPIO_InitTypeDef* GPIO_InitStruct

GPIOx选择GPIOC即可;

GPIO_InitStruct是一个结构体

GPIO_Pin

GPIO_Mode

GPIO_Speed

测试代码

#include "stm32f10x.h"                  // Device headerint main()
{// 使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);// 配置端口模型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_SetBits(GPIOC, GPIO_Pin_13);       // 高电平  灭GPIO_ResetBits(GPIOC, GPIO_Pin_13);       // 低电平  亮GPIO_Init(GPIOC, &GPIO_InitStructure);while (1){}}

3 型号分类及缩写

前面选择启动文件的时候,选择后缀为md的文件。我们的型号是STM32F103,64k

4 总结新建工程

  • 建立工程文件夹,Keil中新建工程,选择型号
  • 工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹
  • 工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里
  • 工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹
  • 工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER
  • 工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run

5 工程架构

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

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

相关文章

线程的状态以及状态转移

一. 线程的状态 NEW: 线程刚被创建, 但是并未启动. 还没调用start方法.RUNNABLE: 这里没有区分就绪和运行状态. 因为对于Java对象来说, 只能标记为可运行, 至于什么时候运行, 不是JVM来控制的了, 是OS来进行调度的, 而且时间非常短暂, 因此对于Java对象的状态来说, 无法区分.T…

顶级安卓数据恢复工具—— 15 个 Android 数据恢复程序榜单

探索并比较顶级 Android 数据恢复软件,并选择最好的 Android 恢复应用程序来恢复您的宝贵数据: 特别是您的智能手机或 Android 设备可以完成许多繁重的工作,其中最有用的是存储数据。Android 设备可以伪装成照片、视频、电子邮件甚至敏感商业…

蓝桥杯第四场双周赛(1~6)

1、水题 2、模拟题,写个函数即可 #define pb push_back #define x first #define y second #define int long long #define endl \n const LL maxn 4e057; const LL N 5e0510; const LL mod 1e097; const int inf 0x3f3f; const LL llinf 5e18;typedef pair…

flex布局实战之自动填充剩余

案例目标 文字部分自适应并且居中 图中是一个弹窗&#xff0c;我现在使用flex的布局来实现&#xff0c;标题和关闭按钮。因为是uni-app,所以标签是view 。你可以自行替换为 代码 <view class"popup-box"><view class"title"><view class&…

积跬步至千里 || 为循环添加进度条

有时候&#xff0c;我们的Python程序需要运行较长时间&#xff0c;原因是一些环节占用时间太长&#xff08;如for循环&#xff09;。如果我们要观察那些占用时间任务的执行进度&#xff0c;那么有一个进度条能实时的显示任务进度情况的话&#xff0c;将会非常方便。而tqdm库就是…

C语言—二维数组

一、二维数组的创建 int arr[3][4];char arr[3][5];double arr[2][4]; 数组创建&#xff1a;“[ ]”中要给一个常量&#xff0c;不能使用变量 二、二维数组的初始化 int arr[3][4]{1,2,3,4};int arr[3][4]{{1,2},{4,5}};int arr[][4]{{2,3},{4,5}}; 前面的为行&#xff0c…

JavaScript之DOM操作

第一章 API介绍 ​API是一种事先定义好的函数&#xff0c;用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。 ​Web API接口&#xff1a;浏览器提供的一系列操作浏览器功能和页面元素的API(BO…

dat文件转换成excel教程

dat文件存在于很多的日用场合&#xff0c;为了更好的去进行办公使用&#xff0c;很多的用户都会将dat文件转换成excel&#xff0c;但是不知道怎么操作的却很多&#xff0c;下面来看看教程吧。 dat文件转换成excel&#xff1a; 1、首先打开excel&#xff0c;然后点击上面的“数…

2023-3年CSDN创作纪念日

机缘 今天开开心心出门去上班&#xff0c;就收到了一个csdn私信&#xff0c;打开一看说是给我惊喜来着&#xff0c;我心想csdn还能给惊喜&#xff1f;以为是有什么奖品或者周边之类的&#xff0c;结果什么也没有&#xff0c;打开就是一份信&#x1f602;。 也挺不错的&#xf…

与Windows 10更新大同小异!一步一步教你如何更新Windows 11

如果你想让你的Windows 11设备获得最佳性能&#xff0c;那么定期更新是至关重要的。即使是最好的电脑如果不更新也会受到影响&#xff0c;因为更新会应用软件调整&#xff0c;帮助你的设备更快、更平稳地运行。它还提高了安全性&#xff0c;意味着你可以从Microsoft的最新功能中…

YOLOv5小目标检测层

目录 一、原理 二、yaml配置文件 一、原理 小目标检测层,就是增加一个检测头,增加一层锚框,用来检测输入图像中像素较小的目标 二、yaml配置文件 # YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters nc: 3 # number of classes depth_multiple: 0.33 # model…

RocketMq 队列(MessageQueue)

RocketMq是阿里出品&#xff08;基于MetaQ&#xff09;的开源中间件&#xff0c;已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现&#xff0c;十万级数据吞吐量&#xff0c;ms级处理速度&#xff0c;分布式架构&#xff0c;功能强大&#xff0c;扩展性强。 官方…