【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.mzph.cn/news/168869.shtml

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

相关文章

2824. 统计和小于目标的下标对数目 : 详解 “左找右“ “右找左“ 两种方式

题目描述 这是 LeetCode 上的 「2824. 统计和小于目标的下标对数目」 &#xff0c;难度为 「简单」。 Tag : 「排序」、「二分」、「双指针」 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target&#xff0c;请你返回满足 0 < i < j < n 且 nums[i] n…

ultralytics yolov8 实例分割 训练自有数据集

参考: https://docs.ultralytics.com/datasets/segment/coco/ http://www.bryh.cn/a/613333.html 1、数据下载与转换yolo格式 1)数据集下载: 参考:https://universe.roboflow.com/naumov-igor-segmentation/car-segmetarion 下载的是coco格式,需要转换 2)coco2yolo t…

C语言——指针(二)

&#x1f4dd;前言 上篇文章C语言——指针&#xff08;一&#xff09;初步讲解了&#xff1a; 1&#xff0c;指针与指针变量 2&#xff0c;指针变量的基本使用&#xff08;如何定义&#xff0c;初始化&#xff0c;引用&#xff09; 这篇文章我们进一步探讨&#xff0c;使用指针…

常见树种(贵州省):017柳树、喜树、珙桐、木棉、楝、枫杨、竹柏、百日青、翅荚香槐、皂荚、灯台树

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、柳树 …

idea自动切换输入法Smart Input

idea搜索后下载 红色表示中文输入法 再ideavim场景下会自动切换成英文非常好用强烈推荐下载一个

vue3(一)-基础入门

一、导入vue.js 1.可以借助 script 标签直接通过 CDN 来使用 Vue <!-- <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> -->2.也可以下载vue.global.js文件并在本地导入 <script src"./lib/vue.global.js">&…

Java中HashMap、Hashtable和ConcurrentHashMap的区别

介绍&#xff1a; 在Java编程中&#xff0c;HashMap、Hashtable和ConcurrentHashMap都是用于存储键值对的常见数据结构。尽管它们在表面上看起来很相似&#xff0c;但实际上它们之间存在一些重要的区别。本文将深入探讨HashMap、Hashtable和ConcurrentHashMap的区别&#xff0c…

代码随想录算法训练营第四十四天|57. 爬楼梯、322.零钱兑换、279. 完全平方数

KamaCoder 57. 爬楼梯 题目链接&#xff1a;题目页面 (kamacoder.com) 这道题使用完全背包来实现&#xff0c;我们首先考虑的是总的楼梯数&#xff0c;因此dp数组大小为n 1 &#xff0c;其意义是&#xff0c;在n阶时有多少种方法爬到楼顶&#xff0c;因此&#xff0c;当前n状…

电源控制系统架构(PCSA)之系统分区电压域

目录 4.1 电压域 4.1.1 系统逻辑 4.1.2 Always-On逻辑 4.1.3 处理器Clusters 4.1.4 图形处理器 4.1.5 其他功能 4.1.6 SoC分区示例 本章描述基于Arm组件的SoC划分为电压域和电源域。 所描述的选择并不详尽&#xff0c;只是可能性的一个子集。目的是描述基于Arm组件的SoC…

LV.12 D19 ADC实验 学习笔记

一、ADC简介 1.1 ADC ADC(Analog to Digital Converter)即模数转换器&#xff0c;指一个能将模拟信号转化为数字信号的电子元件 1.2 ADC主要参数 分辨率 ADC的分辨率一般以输出二进制数的位数来表示&#xff0c;当最大输入电压一定时&#xff0c;位数越高&#xff0c…

LeetCode90. Subsets II

文章目录 一、题目二、题解 一、题目 Given an integer array nums that may contain duplicates, return all possible subsets (the power set). The solution set must not contain duplicate subsets. Return the solution in any order. Example 1: Input: nums [1,2…

逸学java【初级菜鸟篇】10.I/O(输入/输出)

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 目标&#xff08;任务驱动&#xff09; 1.请重点的掌握I/O的。 场景&#xff1a;最近你在企业也想搞一个短视频又想搞一个存储的云盘&#xff0c;你一听回想到自己对于这些存储的基础还不是很清楚&#xff0c;于是回家开始了…

java中关键字 volatile 和 synchronized 有什么区别

java中 volatile 和 synchronized 有什么区别&#xff1f;

uniapp H5、小程序、APP端自定义不同运行环境(开发、测试、生产)、自定义条件编译平台、以及动态修改manifest.json值讲解

文章目录 前言一、自定义条件编译平台是什么&#xff1f;二、新增自定义条件编译平台三、动态设置服务器请求地址四、动态修改manifest.json1.根目录新增文件 modifyManifest.js2.vue.config.js引入modifyManifest.js 总结示例代码 前言 企业项目开发流程上一般都要配置多个运…

Python逆向全版本MagicNumber表

参考pycdc的项目源码https://github.com/zrax/pycdc enum PycMagic {MAGIC_1_0 0x00999902,MAGIC_1_1 0x00999903, /* Also covers 1.2 */MAGIC_1_3 0x0A0D2E89,MAGIC_1_4 0x0A0D1704,MAGIC_1_5 0x0A0D4E99,MAGIC_1_6 0x0A0DC4FC,MAGIC_2_0 0x0A0DC687,MAGIC_2_1 0x0A…

npm WARN npm npm does not support Node.js v13.9.0

Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。C:\Users\Administrator>node -v v13.9.0C:\Users\Administrator>npm -v npm WARN npm npm does not support Node.js v13.9.0 npm WARN npm You should probably upgrade to a newe…

NX二次开发UF_CURVE_ask_combine_curves 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_combine_curves Defined in: uf_curve.h int UF_CURVE_ask_combine_curves(tag_t combine_curve_feature, tag_t * first_curve_tag, UF_CURVE_combine_curves_directi…

Pycharm 教育版下载

1 访问 Jetbrains 主站-->Developer Tools-->PyCharm JetBrains: Essential tools for software developers and teams 2 页面往下划找到 PyCharm for Education-->CHECK IT OUT! PyCharm: the Python IDE for Professional Developers by JetBrains 3 点击 Downloa…

PHP 逻辑运算符 学习资料

PHP 逻辑运算符 在 PHP 中&#xff0c;逻辑运算符用于对布尔值进行逻辑操作&#xff0c;包括与、或、非等操作。以下是 PHP 中常用的逻辑运算符的介绍和示例&#xff1a; 与运算符 逻辑与运算符 && 或 and 用于判断多个条件是否同时为真。如果所有条件都为真&#x…