江科大笔记——新建工程

news2024/11/17 19:36:43

STM32的开发方式

目前STM32的开发方式主要有基于寄存器的方式、基于标准库的方式(库函数的方式)、基于HAL库的方式:

  • 基于库函数的方式是使用ST官方提供的封装好的函数,通过调用这些函数来间接地配置寄存器。
  • 基于HAL库的方式可以用图形化界面快速配置STM3,但这种方式隐藏了底层逻辑。

基于标准库的方式新建工程

使用库函数的方式,需要准备一个STM32库函数的压缩包,在资料包固件库资料里面的文件:
在这里插入图片描述

解压完成后,是库函数文件夹目录:

  • Libraries里面就是库函数的文件,之后建工程会用到。
  • Project里是官方提供的工程示例和模版,使用库函数可以参考一下。
  • Utilities是stm32官方评估板的相关例程,这个评估板是官方用STM32做的一个小电路板用来测评stm32的,这个文件夹存的就是这个小电路板的测评程序。
  • 最后面两个文件,一个是库函数的发布文档(有一些版本的说明),一个是使用手册(教如何使用库函数)。
    在这里插入图片描述

新建工程步骤

1.在桌面新建一个文件夹命名STM32Project。
在这里插入图片描述
2.新建工程:打开keil——点击project——New Project——选择STM32Project——新建文件夹(2-1 STM32工程模版)——点进去

在这里插入图片描述
3.接下来给工程文件起个名字(Project)——保存

在这里插入图片描述

4.接下来选择器件型号:
选择芯片STM32F103C8
在这里插入图片描述
5.这里弹出的是新建工程小助手,可以帮助快速新建工程,暂时不用,先关掉。
在这里插入图片描述
6.工程文件是空的,现在这个工程还不能用,需要添加一点工程的必要文件
在这里插入图片描述
7.打开固件库的文件夹:

启动文件的文件路径:Libraries——CMSIS——CM3——DeviceSupport——ST——STM32F10x——startup——arm

如下就是STM32的启动文件,STM32的程序就是从启动文件开始执行的。

将全部启动文件全部复制下来,然后回到工程文件夹里
在这里插入图片描述
工程文件夹如下,里面是新建工程自动生成的文件
在这里插入图片描述
工程文件夹里,新建文件夹(start)用来存放复制过来的启动文件
在这里插入图片描述
8.接着回到固件库的STM32F10x文件,可以看到stm32f10x.h和两个system开头的文件。

system_stm32f10x.c和system_stm32f10x.h文件,将这三个文件复制下来,也粘贴到Start文件夹下。

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

    两个system文件是用来配置时钟的,stm32主频72MHz,就是system文件里的函数配置的。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
9.接下来,还需要添加一个内核寄存器的描述文件。打开固件库文件夹下的 CM3-CoreSupport-——文件夹,这两个cm3(Cortex-M3)文件就是内核的寄存器描述,当然还有一些内核的配置函数,所以多了个.c文件。
在这里插入图片描述
将两个cm3文件复制粘贴到工程文件夹的Start文件夹下。
在这里插入图片描述
10.然后回到keil软件,将刚才复制的文件(start)添加到工程里。

  • 点击选中Source Group 1,然后再点击一下,把这个组改一下名字,也叫Start
    在这里插入图片描述
    在这里插入图片描述
  • 接着右键,选择添加已经存在的文件到组里

在这里插入图片描述

  • 打开start文件节,把下面这个文件过滤器,选择ALL files,这样就可以看到文件节里的所有文件了

在这里插入图片描述

  • 首先添加一下启动文件,启动文件有很多分类,我们只能添加其中一个,我们所用型号需要选择这个后缀为md.s得启动文件(为什么选择这个启动文件,在后面
    “新建工程里的启动文件选择” 这个章节解释),选中它点击Add。

在这里插入图片描述

  • 然后剩下的.c和.h文件都要添加进来,按住Ctrl键,依次添加Add。然后close,这样我们的Start文件夹里面的文件就添加好了

在这里插入图片描述

  • 这里的文件都是stm32里最基本的文件,是不需要我们修改的,我们添加进来就可以。文件图标上的小钥匙,意思是文件是只读文件,不可修改。

在这里插入图片描述
12.最后我们需要在工程选项里添加上这个文件夹的头文件路径,要不然软件是找不到.h文件的。

  • 点击魔术棒按钮,打开工程选项,在c/c++里,找到这个Include Paths栏,然后点击右边的三个点的按钮,然后再点击新建路径,然后再点三个点的按钮,把start的路径添加进来,点击ok,就把这个文件夹的头文件路径添加进来了。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
13.接下来我们再新建一个main函数,看看工程是否可行:

  • 打开工程文件夹,新建一个(user)文件夹,main函数就放在这个文件夹里。

在这里插入图片描述

  • 在keil中,在Target点击右键,点击添加组,命名为User

在这里插入图片描述

  • 然后在user右键,点击添加新文件,选择c文件,名字为main。路径需要注意为User文件夹,要不然默认是放在文件夹外面的,这样我们就有了main.c文件了。

在这里插入图片描述

在这里插入图片描述

  • 在main.c里,右键,插入头文件,选择stm32f10x.h

在这里插入图片描述

  • 写一个main函数,点击build按钮,编译并建立工程。目前工程还没有添加stm32的库函数,所以还是基于寄存器开发的工程。

在这里插入图片描述

  • 调节字体,点击扳手,把字号调节14。

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

  • 点击扳手,选择utf-8,避免中文乱码,如打开别人工程,看到中文乱码,需改这个编码格式。tab缩进为4比较舒服。

在这里插入图片描述

寄存器方式点灯操作

接下来,进行配置寄存器来完成点灯操作

需要stm32最小系统板,stlink,四根母对母的杜邦线(母对母的杜邦线是指两端都是母插头的杜邦线。这意味着该电缆可以连接两个具有相同或兼容的插头的设备。

在这里插入图片描述
stm32板子上,电源灯会常量,另一个连接在PC13口上灯默认是闪烁状态(芯片里的测试程序)
在这里插入图片描述
然后,在keil中配置一下调试器,点击魔术棒,选择debug,调试器默认是ULINK,更换为stlink调试器,然后再点击右边的设置按钮,在flash下载这一项,把reset and run 勾上(勾上后,我们下载程序后会立马复位并执行,否则每次下载后,还需要按一下板子上的复位按键才能执行程序),配置好调试器后,点击确定,ok。
在这里插入图片描述
在这里插入图片描述
然后重新编译一下,再点击LOAD按钮(程序下载到stm32里),板子上灯不闪(因为程序为空)
在这里插入图片描述
在这里插入图片描述
接下来,配置寄存器,来点亮灯,我们只需要配置3个寄存器就可以点灯了:

1.打开GPIOC的时钟(PC13亮灯)
2.配置PC13口的模式
3.端口输出数据寄存器
在这里插入图片描述

库函数工程建立

1.打开工程文件夹,新建一个文件夹叫library,用来存放库函数,接着打开固件库的文件夹。

在这里插入图片描述

打开librarys——stm32标准外设驱动——src——这些就是库函数的源文件。misc(混杂的意思)是内核的库函数,其它的就是内核外的外设库函数。

全选这些库函数文件粘贴到工程文件夹的library下。
在这里插入图片描述
然后再打开固件库的inc文件夹,这些是库函数的头文件,全部复制粘贴到工程文件夹library下。
在这里插入图片描述
在这里插入图片描述
2.接着回到keil软件,同样在Target处右键,然后添加组,然后改名为library,再右键,添加已经存在的文件,打开library,全选,添加,这样就把所有的库函数文件都添加进来了,但是对于这个库函数来说,现在还不能直接使用,需要再添加一个文件,

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

在这里插入图片描述
3.打开固件库文件夹–打开project——打开——stm32Template文件夹里

有两个it结尾的文件和一个conf.h的文件:
conf(configuration)文件是用来配置库函数头文件的包含关系的,以及里面还有个用来参数检查的函数定义,这是所有库函数都需要的。

两个it(interrupt)文件是用来存放中断函数的。将这三个文件复制粘贴到工程的user目录下,接着回到keil软件,在user组里,将刚才的三个文件添加进来。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.最后还需要一个宏文件,可以在这个 #include “stm32f10x.h” 文件右键,打开文件,划到最下面
在这里插入图片描述
看到这个语句,这是一个条件编译,意思是,如果你定义了USE_STDPERIPH_DRIVER (使用标准外设驱动)这个字符串,下面这个 #include "stm32f10x_conf.h"语句才有效。

在这里插入图片描述
所以,我们还需要复制一下这个USE_STDPERIPH_DRIVER 字符串,然后打开工程选项(魔术棒),在c/c++的Define栏目粘贴这个字符串,这样才能包含标准外设库(库函数 )

在这里插入图片描述
当然还有下面的头文件目录,把user和library目录的路径也都添加上
在这里插入图片描述
在这里插入图片描述
这样,我们基于库函数的的工程就建好了。
可以看到Library里面的库函数也带了钥匙,不需要我们进行更改,我们唯一需要更改的是user组的文件。
点一下三个箱子的按钮,将这个Library往上挪一下,将不用改的放到最上面,看着舒服。
在这里插入图片描述

keilkill批处理

分享工具:keilkill批处理,作用:可以把工程编译产生的中间文件都删除。

(1)可以复制到工程文件夹里。
(2)如要把工程分享给别人的话——双击批处理文件,就会把中间的文件删掉。
(3)如要恢复中间文件,重新编译即可。

在这里插入图片描述
可以复制到工程文件夹里
在这里插入图片描述
在这里插入图片描述

库函数方式点灯操作

库函数其实也是间接配置寄存器,所以和上面寄存器方式操作步骤一样。

1.首先是使能时钟

使用如下函数来开启时钟,有两个参数,第一个是选择外设,第二个是选择新的状态
在这里插入图片描述

  • 右键,跳转到函数定义,有函数的简介和参数说明,brief是简介,param是参数,一共两个参数。第一个参数可以是arg里的任意一个,第二个参数可以是enable或者disable

在这里插入图片描述

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

2.第二步是配置端口模式

函数GPIO_Init():有两个参数,第一个是选择哪个GPIO,第二个是参数的结构体。这里使用了结构体来配置参数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 我们需要先定义一个结构体,在上面先把这个结构体的类型写上,然后给结构体起个名字,根据官方的推荐,我们最好起一个这样的名字,叫GPIO-InitStructure,然后把结构体的每个参数填上,复制粘贴结构体的名字,然后用**(点)**来引出结构体的参数(三个参数:GPIO模式、GPIO端口、GPIO速度)

在这里插入图片描述
最后,右键转到Mode的定义介绍是说这个参数可以是GPIOMode-TypeDef里的一个值,可以选中GPIOMode-TypeDef这个字符,按一下Ctrl+F,搜索一下这个定义的位置,点击find next。

可以看到,这是个枚举类型的结构体,GPIOMode就是这里的其中一个值,然后我们选择Out-PP这一项,是通用推挽输出。

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

  • 然后我们继续看下一个参数GPIO_InitStructure.GPIO_Pin,转到它的定义,这里下面出现了一个框,这个是说他的定义有很多个,我们在框中选择member这一项,双击,然后跳转的其实还是刚才那个函数说明位置。

在这里插入图片描述

  • 这个GPIO_Pin的说明是说这个参数在GPIO_pins_define里面定义了,我们还是一样,选中,Ctrl+F, findnext,可以看到这里有个宏定义的列表,我们选择GPIO_PIN_13,复制,然后填到第二个参数位置。

在这里插入图片描述

  • 结构体第三个参数也是一样,右键,跳到定义,选中,Ctrl+F,Find Next,选中50MHz的速度,复制粘贴

在这里插入图片描述

  • 现在,这个GPIO_Init的第二个参数了,第二个参数的说明是一个指向结构体的指针,所以这里我们需要传递结构体的地址,那我们复制结构体的名字,粘贴到第二个参数位置,然后前面加一个取地址的符号(&),这样,GPIO模式就配置完成了。
GPIO_Init(GPIOC,&GPIO_InitStructure);

3.最后,设置端口的高低电平来进行点灯。

函数GPIO_SetBits,可以把指定端口设置为高电平,第一个是GPIOC,第二个是GPIO_Pin_13,这一句就可以将PC13口置为高电平;GPIO_SetBits函数可以置低电平,这一句可以将pc13口置为低电平。

GPIO_SetBits(GPIOC,GPIO_Pin_13); // 设置端口的高电平
GPIO_ResetBits(GPIOC,GPIO_Pin_13);// 设置端口的低电平

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

总结

新建工程里的启动文件选择
我们新建工程第一个加的就是启动文件,这个启动文件有很多类型,至于选择哪一个,我们要根据芯片型号来选择。

在下面的表中,这是stm32f1系列中的型号分类,其中根据Flash的大小,分为了小容量产品LD,中容量产品MD、大容量产品HD…。stm32f100系列为超值系列,简写为VL,F105和F107为互联型产品CL,这个就没有根据Flash大小来分类.stm32f103c8t6的Flash为64K,所以选择MD的启动文件。

在这里插入图片描述
与之对应

在这里插入图片描述
新建文件步骤总结
在这里插入图片描述

工程架构

1.工程结构主动执行的部分(工程架构左边两个图)
在这里插入图片描述
首先是startup启动文件,这个是程序执行最基本的文件,keil中启动文件是用汇编写的,启动文件内定义了中断向量表,中断服务函数等。

这个中断函数中有个复位中断,这就是整个程序的入口,当stm32上电复位或者按下复位开关之后,程序就会进入复位中断函数执行。

复位函数中断就主要做了两件事情,第一个是调用SystemInit函数,第二个是调用main函数,然后程序就结束了。对应启动文件如下所示:
在这里插入图片描述

当然,实际上单片机的程序永远都不会结束,所以在main函数的最后一定有一个死循环。
在这里插入图片描述

SystemInit函数就是定义在System_xx开头的.c里的,在keil里也可以看到这个函数的定义(在main函数之前,单片机就已经执行了一堆东西了,帮我们把闪存接口,时钟等一系列杂碎的东西都配置好了)。
在这里插入图片描述

其他中断:就是在启动文件的下面那些

在这里插入图片描述

另外在启动文件还定义了stm32所有的其他中断,这些中断达到触发条件后就会自执行。**其他中断函数的定义就是在stm32fx_it里面的。**以上就是中断部分的逻辑。

在这里插入图片描述

另外,你也可以自己定义一些用户文件,来封装一些模块供主程序和中断调用,有利于程序结构的模块化,要不然所有的程序都在主函数里,那主函数就太长了。

在这里插入图片描述
到此为止,这个工程结构主动执行的部分就介绍完了

2.被动执行部分(工程架构右1图)
在这里插入图片描述

被动执行部分,相当于stm32的资源了,我们在主函数或者中断函数里,就可以调用这些资源,

右上角这两个stm32f10x.h和core_cm3这些文件就是外设和内核外设的寄存器描述,

在keil可以看到,都是寄存器和寄存器名字,还有地址信息等,如果直接调用这些寄存器来使用stm32,那就是寄存器的开发方式,很麻烦。
在这里插入图片描述

所以就提供了库函数文件,在keil中可以看到,这每个外设都提供了一大堆函数,这些函数封装了寄存器的操作,给我们提供更加人性化的函数调用方式。
在这里插入图片描述

这个conf的文件就是用来配置头文件的包含关系的,在keil中可以看到conf文件include了所有的库函数头文件,
在这里插入图片描述

在这里插入图片描述
同时我们在stm32f10x.h的最后又包含了conf,在这里插入图片描述
所以在使用这些库函数时,**我们只需要包含stm32f10x.h这一个头文件,就相当于包含了所有的库函数头文件,**这样我们就可以任意地调用库函数了。
在这里插入图片描述

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

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

相关文章

8000多道超全题库+高频题+大厂面试官原创题解+真实面经,绝对的求职秘密武器

正在找工作或者想要提升技术的程序员都可以去试试这款刷题神器【面试鸭】。你能想到的各种题目都被整理得明明白白,再也不用自己到处找七零八落的资料。8000多道超全题库高频题大厂面试官原创题解真实面经,绝对的求职秘密武器,扫码即可体验⬇…

数据结构:树、森林

二叉树与树结构差异 树(一般树):树是一种数据结构,其中每个节点可以有任意数量的子节点(除了根节点和叶子节点外)。因此,一般树的节点在数组中的表示并不是那么直接,特别是当树不是完…

赵长鹏今日获释,下一步会做什么?币安透露2024年加密货币牛市的投资策略!

中国时间2024年9月28日,加密货币行业的风云人物赵长鹏(Changpeng Zhao,简称CZ)终于从监狱获释。他因在担任币安首席执行官期间未能有效执行反洗钱(AML)计划而被判刑四个月。赵长鹏的获释引发了广泛关注,不仅因为他是全…

一不小心,给腾讯云提了一个Bug

大家好,这里是程序员晚枫。 我使用腾讯的cos服务2年多了,一直都是在网页手动管理资源。 最近身边有高人”突发奇想“:要不自己封装一个专用的api?于是苦命打工人晚枫上线,吭哧吭哧把腾讯已经封装很好的Python SDK又包…

企业微信(企微)审批与影刀RPA结合

企业微信审批与影刀RPA结合 效果先看视频: 影刀与企业微信审批结合 具体步骤: 1、登录企微管理后台,新建一个审批流。 添加模板→自定义模板,根据需求添加审批节点。 添加完之后,回到审批界面,可以看…

Java新手指南:从菜鸟到编程大师的趣味之路-多态

这里是Themberfue 本章讲的是Java三大特性之一的多态,也是最后一个特性 多态概念 既然我们要学习多态,首先得知道这玩意儿到底是个什么东西? 通俗地说,多态其实就是多种形态。具体来说就是去完成某个行为,当不同的对象…

win11电脑长时间锁屏会变得非常卡(rundll.32过多)——解决方法

一、问题 当你长时间锁屏后,电脑会变得十分的卡,有些甚至会死机崩溃,这个时候你可能并不需要修改电源的计划设置,也可能并不需要修改电脑注册表之类的东西。 赶紧打开你的任务管理器,winx,选择任务管理器…

利士策分享,攀登职场高峰:成功者的十大特质

利士策分享,攀登职场高峰:成功者的十大特质 在职场这个竞争激烈的舞台上,那些能够迅速崛起、实现职业辉煌的佼佼者,往往凭借一系列独特且鲜明的特质脱颖而出。以下是对这些特质的深入探讨: 第一章:高情商的…

Elasticsearch学习笔记(1)

初识 Elasticsearch 认识和安装 Elasticsearch 是由 Elastic 公司开发的一套强大的搜索引擎技术,属于 Elastic 技术栈的一部分。完整的技术栈包括: Elasticsearch:用于数据存储、计算和搜索。Logstash/Beats:用于数据收集。Kib…

代码为笔,合作作墨,共绘共赢画卷———未来之窗行业应用跨平台架构

合作共赢,代码同创,成就非凡 一、资源整合方面 1.1. 技术资源共享 - 不同的合作伙伴可能在技术领域各有所长。例如,一方可能擅长前端用户界面设计,具有丰富的交互设计经验,能够打造出美观、易用的预订界面&#xff…

云舟观测:集成开源Grafana Faro构建前端页面性能监控平台

在当今互联网时代,面对纷乱繁杂的网上资源,用户的耐心和注意力是极为宝贵的资源,当用户访问一个网站或应用时,他们期望的是快速且无缝的体验,任何加载延迟或功能故障都可能导致用户流失,影响品牌体验。因此…

MySQL 中的 FOREIGN KEY 约束:确保数据完整性的关键

在 MySQL 数据库中,FOREIGN KEY(外键)约束是一种非常重要的机制,它可以帮助我们确保数据的完整性和一致性。那么,FOREIGN KEY 约束究竟是什么呢?让我们一起来深入了解一下。 一、什么是 FOREIGN KEY 约束&…

计算机毕业设计 招生宣传管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

支付宝远程收款api之小荷包跳转码

想要生成小荷包跳转码的二维码,需要进行以下步骤: 1、开通支付宝小荷包的收款功能权限 2、获取支付宝的小荷包收款码和支付宝账户的UID已经手机号等相应信息(可能会有变动) 3、可能需要一定的代码基础,讲所需信息填…

基于python+控制台+txt文档实现学生成绩管理系统(含课程实训报告)

目录 第一章 需求分析 第二章 系统设计 2.1 系统功能结构 2.1.1 学生信息管理系统的七大模块 2.1.2 系统业务流程 2.2 系统开发必备环境 第三章 主函数设计 3.1 主函数界面运行效果图 3.2 主函数的业务流程 3.3 函数设计 第四章 详细设计及实现 4.1 学生信息录入模块的设计与实…

2024.9.28 作业+思维导图

widget.cpp #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->setFixedSize(320,448);this->setWindowFlag(Qt::FramelessWindowHint);//QPushButtonQPushButton *PushButton1 new QPushButton("登录",this);PushButto…

先进封装技术 Part02---TSV科普

一、引言 随着电子设备向更小型化、更高性能的方向发展,传统的芯片互连技术已经无法满足日益增长的需求。在这样的背景下,TSV(Through-Silicon Via,硅通孔)技术应运而生,成为先进封装技术中的核心之一。 如果我们看大多数主板,可以看到两件事:第一,芯片之间的大多数连…

《深度学习》自然语言处理 统计、神经语言模型 结构、推导解析

目录 一、语言转换方法 1、如何将语言转换为模型可以直接识别的内容 1)数据预处理 2)特征提取 3)模型输入 4)模型推理 二、语言模型 1、统计语言模型 1) 案例: • 运行结果: • 稀疏…

AI Agent如何落地?来看看在教育行业大厂的落地实践

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 以正教育AI Agent 以正教育大模型AI Agen…

【4.7】图搜索算法-DFS和BFS解根到叶子节点数字之和

一、题目 给定一个二叉树,它的每个结点都存放一个 0-9 的数字, 每条从根到叶子节点的路径都代表一个数字 。 例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。 说明 : 叶子节点是指没有子节点…