嵌入式-Stm32-江科大基于标准库通过GPIO点LED灯

news2024/11/17 3:40:12

文章目录

    • 一:新建基于库函数开发的工程
    • 二:截图操作实现
    • 三:main.c 大致代码实现
      • 道友:凡事只想着蒙混过关,困难只会越来越多。我们要有,独立解决问题的能力,才能成长为更好的自己。

基于库函数开发

一:新建基于库函数开发的工程

使用库函数进行开发,需要准备STM32库函数。 这个库函数由ST公司提供,而Keil软件所需的器件支持包是由Keil公司提供
本文使用的是STM32F10x标准外设库的压缩包“STM32F10x_StdPeriph_Lib_V3.5.0”,解压后文件如图

“STM32F10x_StdPeriph_Lib_V3.5.0”固件库解压后文件

1._htmresc:存放两个图片,没用。
2.Libraries:存放库函数的文件。
3.Project:官方提供的工程示例和模板,使用库函数的时候可以参考。
4.Utilities:STM32官方评估板的相关例程,这个评估板是STM32官方自己做的小电路板,专门用于测评STM32。
5.Release_Note.html:库函数的发布文档,有一些版本说明。
6.stm32f10x_stdperiph_lib_um.chm:使用手册,说明如何使用库函数。

新建工程步骤:

1.建立工程文件夹,Keil中新建工程,选择型号。
2.工程文件夹里建立Start、Library、User文件夹,复制固件库里面的文件到工程文件夹。
3.工程里对应建立Start、Library、User等同名文件夹,然后讲文件夹内的文件添加到工程分组里。
4.工程选项(魔法棒),C/C++,Include Paths 内声明所有包含头文件的文件夹。
5.工程选项(魔法棒),C/C++,Define内定义USE_STDPERIPH_DRIVER。
6.工程选项(魔法棒),Debug,下拉列表选择对应调试器,Settings,Flash Download 里勾选Reset and Run(每个项目都要手动设置一次)。

基于库函数的开发方式,就是在基于寄存器开发的基础上,真正引入库函数,并创建文件夹“Library”单独存放。新建工程步骤:

  1. 建立工程文件夹,Keil中新建工程,选择型号。
  2. 工程文件夹里建立Start、User、Library文件夹,复制固件库里面的文件到工程文件夹。
  • Start部分1:启动文件,位于固件库文件夹“.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm”。STM32的程序从启动文件执行。

  • Start部分2:位于固件库目录“.\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”的三个文件。“stm32f10x.h”描述STM32外设寄存器及其对应的地址,作用相当于51单片机中的头文件“REGX52.h”。
    “system_stm32f10x.h”、“system_stm32f10x.c”主要用于配置时钟,比如配置STM32的主频为72MHz。

  • Start部分3:位于固件库目录“.\Libraries\CMSIS\CM3\CoreSupport”的两个文件。“core_cm3.h”、“core_cm3.c”是内核寄存器的描述文件,并且还带了一些内核的配置函数。

  • Library部分1:位于固件库目录“.\Libraries\STM32F10x_StdPeriph_Driver\src”。其中的misc.c是内核的库函数,其他的都是内核外的外设库函数。

  • Library部分2:位于固件库目录“.\Libraries\STM32F10x_StdPeriph_Driver\inc”。是上述库函数的头文件。

  • User部分1:存放用户编写的main.c等文件。 User部分2:位于固件库目录“.\Project\STM32F10x_StdPeriph_Template”中的三个文件。“stm32f10x_conf.h”用于配置库函数头文件的包含关系,并且也有用于参数检查的函数定义,所有的库函数都需要。“stm32f10x_it.h”、“stm32f10x_it.c”这两个文件用于存放中断函数。

要知道先在项目的文件夹里面从固件库复制所需的文件到各自分配的文件夹中,接着在keil里面添加文件,两者并不会自动同步
在这里插入图片描述
3.工程里对应建立Start、User、Library同名称的分组,然后将文件夹添加到工程分组里。

  • Start分组:注意启动文件的选择,只能根据下表选择其中一个 .s文件
    在这里插入图片描述
  • User部分1:注意添加main.c文件时,路径要选上User文件夹,否则默认路径在文件外。下面是给出main.c文件中的代码:
#include "stm32f10x.h"                  // Device header
int main(void){
 while(1){
 }
}

//注意最后一行必须是空着
  • User部分2:配置宏定义。要使“stm32f10x_con.h”被添加进来,而从使得所有的库函数定义生效,需要宏定义USE_STDPERIPH_DRIVER。右击“stm32f10x.h”滑到最下面,可以看见此条定义语句。打开“魔术棒”→C/C++→Define项目栏粘贴USE_STDPERIPH_DRIVER→OK"。

4.工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹,否则软件找不到 .h文件。

  • 点击魔术棒按钮→C/C++→Include Path →右侧的三个点按钮,将三个文件夹都添加进来。

5.要使用STLINK下载程序的话,需要在“魔术棒 → debug → use → ST-Link Debugger”,然后进一步点击右侧的“settings”,在第一个界面“debug”的port选择SW,在第三个界面“Flash Download”勾选Reset and Run”。

6.最后进行编译,通过。点击编译按钮右侧的“Download”按钮,便可以将程序下载在开发板上。

  • 若报错,可以试一下点击魔法棒,target → ARMCompiler 选择V5.06。
  • 注:为了防止乱码问题,可以在扳手工具那里选择UTF-8编码。
  • 小技巧:点击“三个箱子”按钮,可以改变组函数顺序。

工程到目前为止搭建完成。库函数本质上也是间接配置寄存器,所以总体步骤和上面基于寄存器点灯相似。下面展示如何基于库函数,点亮LED,上面代码是基于寄存器实现,下面代码是基于库函数实现

#include "stm32f10x.h"                  // Device header           

int main(void){
//  //配置RCC寄存器,使能GPIOC的时钟。GPIO都属于APB2外设
//  RCC->APB2ENR = 0x00000010;
//  //配置寄存器PC13:通用推挽输出模式、输出模式50MHz
//  GPIOC->CRH = 0x00300000;
//  //输出数据寄存器PC13:
//  //GPIOC->ODR = 0x00002000;//LED灭
//	GPIOC->ODR = 0x00000000;//LED亮
	
	//1.开启GPIO的外设时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	//2.配置寄存器PC13的端口模式
	//2.1 首先配置GPIO结构体
	GPIO_InitTypeDef GPIO_InitStructure ;//给结构体起名字
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//寄存器模式为通用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//寄存器引脚为13
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速度为50MHz
	//2.2 然后才能调用函数配置寄存器
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	//3.配置数据寄存器PC13的输出
	GPIO_SetBits(GPIOC,GPIO_Pin_13);//设置高电平,灯灭
//	GPIO_ResetBits(GPIOC,GPIO_Pin_13);//设置低电平,灯亮
	  
  while(1)
{}
}


二:截图操作实现

代码调用本质上就是一个User文件夹里面的main.c函数,其他的都是复制的,下面是上述操作细节。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

三:main.c 大致代码实现

3.1 开启GPIO的外设时钟
在这里插入图片描述

选中这个函数,看这个函数定义,按F12进入右击或者点 GO TO Definition Of “xxx”
在这里插入图片描述

在这里插入图片描述
3.2 配置寄存器PC13的端口模式

//2.配置寄存器PC13的端口模式
	//2.1 首先配置GPIO结构体
	GPIO_InitTypeDef GPIO_InitStructure ;//给结构体起名字
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//寄存器模式为通用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//寄存器引脚为13
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速度为50MHz
	//2.2 然后才能调用函数配置寄存器
	GPIO_Init(GPIOC,&GPIO_InitStructure);

在这里插入图片描述
3.2.1 首先配置GPIO结构体

按F12

在这里插入图片描述在这里插入图片描述

芯片设计的模式,其中内部的001011信号已经由内部的电路决定,应用的话会调用“GPIO_Mode_Out_PP”就行

GPIO_Mode_AIN:模拟输入模式
GPIO_Mode_IN_FLOATING:浮空输入模式
GPIO_Mode_IPD:下拉输入模式
GPIO_Mode_IPU:上拉输入模式
GPIO_Mode_Out_OD:开漏输出模式
GPIO_Mode_Out_PP:推挽输出模式
GPIO_Mode_AF_OD:复用开漏输出模式
GPIO_Mode_AF_PP:复用推挽输出模式

问题:为什么GPIO_Mode_Out_PP = 0x10?

先是寄存器写法
在这里插入图片描述
这是库函数写法
在这里插入图片描述
两者放在一起看,
在这里插入图片描述
答案:
在这里插入图片描述
3.2.2 寄存器引脚
在这里插入图片描述

在这里插入图片描述

在注释里面按F12是跳转不了的,只能查找,注释内说GPIO_Pin这个参数被定义了

在这里插入图片描述

在GPIO_pins_define找被定义的PC13端口

在这里插入图片描述
3.2.3 输出速度为50MHz

同理可得
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速度为50MHz

在这里插入图片描述3.3 调用函数配置寄存器

GPIO_Init(GPIOC,&GPIO_InitStructure);

在这里插入图片描述
4.1 配置数据寄存器PC13的输出

GPIO_SetBits(GPIOC,GPIO_Pin_13);//设置高电平,灯灭
GPIO_ResetBits(GPIOC,GPIO_Pin_13);//设置低电平,灯亮
在这里插入图片描述

参考博主:【哈工大虎慕】

道友:凡事只想着蒙混过关,困难只会越来越多。我们要有,独立解决问题的能力,才能成长为更好的自己。

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

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

相关文章

Java的helloworld、IDEA一些快捷键、导入模块

一、Java的helloworld IDEA管理Java程序的结构 1.project(项目、工程) 2.moudule(模块) 3.package(包) 4.class(类) 上级包含多个下级,开发程序也是创建工程再创建…

算法34:贴纸拼词(力扣691题)

题目: 我们有 n 种不同的贴纸。每个贴纸上都有一个小写的英文单词。 您想要拼写出给定的字符串 target ,方法是从收集的贴纸中切割单个字母并重新排列它们。如果你愿意,你可以多次使用每个贴纸,每个贴纸的数量是无限的。 返回你…

在linux中 centos7 连接xhell

网卡配置 仅主机要对应仅主机模式,NAT模式要对应NAT模式 一、在linux中centos7 连接xhell 实验:NAT模式对应NAT模式 以192.168.246.0段为例 1.进入虚拟机: 2.去真机修改: 3.然后去虚拟机里: 4.进入xhell修改: 再输…

【深度学习】Anaconda3 + PyCharm 的环境配置 1:手把手带你安装 PyTorch 并创建 PyCharm 项目

前言 文章性质:实操记录 💻 主要内容:这篇文章记录了 PyTorch 的安装过程,包括: 1. 创建并激活新的虚拟环境; 2. 查看电脑是否支持 CUDA 以及 CUDA 的版本; 3. 根据 CUDA 的版本安装 PyTorch&am…

企业网络出口部署案例

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…

uniapp运行自定义底座到真机没反应

同步资源失败,未得到同步资源的授权,请停止运行后重新运行,并注意手机上的授权提示。 如果此时手机没有任何反应,请检查自定义基座是否正确;如果是离线制作的自定义基座包, 请检查离线包制作是否正确。 网上各种查找报…

移动通信系统关键技术多址接入MIMO学习(8)

1.Multiple-antenna Techniques多天线技术MIMO,从SISO到SIMO到MISO到如今的MIMO; 2.SIMO单发多收,分为选择合并、增益合并;SIMO,基站通过两路路径将信号发送到终端,因为终端接收到的两路信号都是来自同一天…

【算法与数据结构】63、LeetCode不同路径 II

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:参考【算法与数据结构】62、LeetCode不同路径的题目,可以发现本题仅仅是多了障碍物。我们还…

Kubernetes(K8S)云服务器实操TKE

一、 Kubernetes(K8S)简介 Kubernetes源于希腊语,意为舵手,因为首尾字母中间正好有8个字母,简称为K8S。Kubernetes是当今最流行的开源容器管理平台,是 Google 发起并维护的基于 Docker 的开源容器集群管理系统。它是大名鼎鼎的Google Borg的开源版本。 K8s构建在 Docker …

计算机网络系统结构-2020期末考试解析

【前言】 不知道为什么计算机网络一门课这么多兄弟,这份看着也像我们的学科,所以也做了。 一. 单选题(每题 2 分,共 20 题,合计 40 分) 1 、当数据由主机 A 发送到主机 B ,不参…

回顾2023,展望未来

回顾2023 重拾博客 CSDN博客创建和写作,几乎是和我正式开始学习编程开始,至今已经6年。刚上编程课的时候,刚上C语言课的时候,老师说可以通过写技术博客来帮助自己更好学习,于是我就开始自己的技术博客编写之旅。 我…

架构02 - 架构的基础: 特点,本质...

软件架构简介: 架构是对系统中各个实体以及它们之间关系的抽象描述,是对功能和形式元素之间对应关系的分配,也是对元素之间关系及与周边环境关系的定义。软件架构的核心价值在于控制系统的复杂性,实现核心业务逻辑和技术细节的解耦…

C++I/O流——(1)I/O流的概念

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 勤奋,机会,乐观…

小红书私信组件功能解读,商家如何使用

今年八月,小红书私信组件上新了两大新功能。新功能的出现,无疑为商家与消费者的沟通建联,提供了新的可能。今天我们来针对小红书私信组件功能解读! 一、小红书私信组件新功能 这次小红书私信组件上新的两大功能分别是,…

SQL-分页查询and语句执行顺序

🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:重拾MySQL 🍹文章作者技术和水平很有限,如果文中出现错误&am…

Inis博客系统本地部署结合内网穿透实现远程访问本地站点

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总…

011集:复制txt文件(编码:ANSI复制到UTF-8模式)—python基础入门实例

下面给出一个文本文件复制示例。 代码如下: f_name rD:\mytest2.txt with open(f_name, r, encodinggbk) as f:lines f.readlines()copyfile rD:\copytest2.txtwith open(copyfile, w, encodingutf-8) as copy_f:copy_f.writelines(lines)print(文件复制成功) …

YOLOv8改进 | 二次创新篇 | 在Dyhead检测头的基础上替换DCNv3 (全网独家首发)

一、本文介绍 本文给大家带来的改进机制是在DynamicHead上替换DCNv3模块,其中DynamicHead的核心为DCNv2,但是今年新更新了DCNv3其作为v2的升级版效果肯定是更好的,所以我将其中的核心机制替换为DCNv3给Dyhead相当于做了一个升级,效果也比之前的普通版本要好,这个机制我认…

【2023年度总结与2024展望】---23年故事不长,且听我来讲

文章目录 前言一、学习方面1.1 攥写博客1.2 学习内容1.3 参加比赛获得证书 二、生活方面2.1写周报记录生活 三、运动方面四、CSDN的鼓励五、24年展望总结 前言 时光飞逝,又是新的一年,遥想去年2023年我也同样在这个时间段参加了CSDN举办的年度总结活动&a…

数据库期末复习重点总结

数据库期末复习重点总结 本文为总结&#xff0c;如有不对的地方请指针 第2章 关系模型的介绍 名称符号选择σ投影∏笛卡儿积连接并∪集差-交∩赋值<-更名ρ 除操作 设R和S除运算的结果为T&#xff0c;则T包含所有在R中但不在S中的属性和值&#xff0c;且T的元组与S的元…