[STM32]STM32F407系列教程之一,搭建简洁Template模板

文章目录

    • 一、实验环境
      • 1.编译器环境:
      • 2.硬件环境:
    • 二、文件组织方式
    • 三、STM32程序的执行过程
      • 1.程序是怎么执行的
      • 2.程序复位,或者上电后,这个PC值是多少
      • 3.那么,机器是怎么找到用户编写的函数的
    • 四、STM32程序下载
      • 1.STM32F407VE系统板把boot0引脚接3.3V,插上下载器(我使用的是CH340)
      • 2.打开烧录软件FlyMcu v0.188(注意版本号!!!)
      • 3.安装CH340驱动,在我压缩包里,和下载器在一起
      • 4.选择程序文件,并简单配置下载完成后操作
      • 5.点击”开始编程即可”
    • 五、运行结果
      • 1.配置通信参数
      • 2.打开串口
      • 3.按下STM32FVE系统板上的复位按键
      • 4.执行结束
    • 六、问题思考

一、实验环境

1.编译器环境:

集成开发环境 :Keil MDK 5.22
系统环境 :Windows 10 专业版 1706
OS内部版本 :16299.125
[STM32]STM32F407系列教程之一,搭建简洁Template模板_第1张图片
PS:不必过于纠结集成开发环境的版本问题,最开始我在学习stm32时候,使用的是Keil4(一个蓝色的图标,不知道大家见过没有),开发环境只会一定程度上减轻工作量,但决定不了程序的核心,要想写出算法严谨、结构紧凑的程序,还得靠自己不断取学习和练习。
这里列举我这里的程序运行环境的参数,目的只是想告诉大家,程序能够执行,是离不开硬件的,无论嵌入式还是纯软的程序,日后出现问题,大家在论坛或者贴吧提问题时,带上自己的硬件环境,方便大家一起来解决问题。

2.硬件环境:

使用STM32F407VE最小系统板;

PS:大家只有手中有一块STM32F4的单片机板子即可,我个人并不是很建议大家初学就去买某点某原子或者某火的开发板,我承认他们的产品算的上业界良心,但是,如果大家想真心吃透单片机的核心,建议还是离他们远一点,亲自动手才是学嵌入式的正确道路。

二、文件组织方式

如果大家有学过51单片机,毫无疑问,大家一定用过keil 4去搭建一个project,然后添加main.c函数,随着代码量的增加和结构的复杂度增加,使用模块化编程,添加.h文件,相互包含。

所有的学习路线都是正确的,因为51单片机过于简单(指的外设简单、寄存器简单),我们可以简单的去写一个启动文件,控制程序的执行过程(如从0000H处启动后,一个LJMP跳转到MAIN处执行用户程序,不好意思,这里稍微扯到了51的汇编代码,有兴趣的可以去了解一下)。

STM32则不一样,实际上包括NXP(原Freescale)的K60、XS128等等,这些单片机都是使用的ARM的内核,实际上不只单片机,ARM架构垄断了几乎真个移动端市场,大家用的手机,不管苹果三星,还是华为小米,没买一部,都有一定量的钱流入ARM公司。

PS:是不是很乱,一会一个ARM,那么ARM到底是什么?
(1).一个公司,名字是Advanced RISC Machine;
(2).ARM公司开发的处理器,分为A-高端应用方向、R-实时性方向、M-低端控制方向;
(3).ARM公司早期提出的架构,现在改为Cortex-X;

所以说,天下嵌入式是一家,皮不一样,心都是一样的。

有点扯远了,由于STM32所依托的内核过于庞大,加之不同的公司在ARM授权的内核上外扩了很多的外设(比如USART、以太网、CAN、TIM等),导致我们不可能再像学习51那样去搭建project,一个启动文件startup,或者是一个bootloader引导设置,其代码量都不是一星半点的。

好在ST公司以及ARM公司都考虑到了这一点,他们提供了我们想要的这些,作为用户,我们去裁剪、修改即可,把精力放在外设的调用以及模块组合上,不用频繁去造轮子。

好了,一系列组合图,介绍以下,STM32中文件的组合方式:
[STM32]STM32F407系列教程之一,搭建简洁Template模板_第2张图片上图是在电脑中的文件的分类存放,都放在根目录下也是可以的,那样就不好查找了不是?简单介绍一下,这些是我自己分类的,是按照我的习惯来的。

   clear.bat	:这是一个批处理,我用它来删除一些过程文件,毕竟我比较懒。
   BSP			:板级支持包,我用它来存放外设的配置,比如usart、tim的配置。
   CORE			:内核文件,ST公司提供,实际上是一些启动文件,裁剪、修改会涉及到它。
   FUNCTION		:常用函数,我自己编写的,存放一些常用的函数,比如delay、字符串处理函数等。
   HARDWARE		:硬件模块,我自己编写的,存放设备模块的驱动文件,比如蓝牙、舵机、步进电机的驱动。
   MDK			:工程,只要记住这里面存放了一个project文件即可,其他的不需要关心。
   OBJ			:存放了编译、链接过程产生的文件,常用的是.hex和.map文件,以后使用到再细说。
   OS			:存放操作系统,单片机也是可以跑操作系统的,关于操作系统,有时间我们在说。
   README		:帮助文件,我自己编写的,存放修改说明和版权、引脚说明什么的,纯文本文档。
   SYSLIB		:ST官方提供的,固件库,用户通过固件库可以间接操作寄存器。
   USER			:存放用户程序,说白了就是主函数和中断服务函数,当然了如果接触了操作系统,我将操作系统的调用文件也放在这里。

好了,这就是文件夹下全部的介绍,大家可以下下来模板,仔细比对,稍微透露一下,子文件夹下的设计有特别之处,自行查找。

说完了工程在硬盘中的存放,再说一下在编辑器中的组织方式:
[STM32]STM32F407系列教程之一,搭建简洁Template模板_第3张图片
心细的同学可能已经发现了,这里的组织方式和硬盘里的存放几乎完全相同。

从上而下是一个树状管理结构,首先是一个工程组名(Template_stm32f407v),下面是工程名(Template_LJI),接下来是不同的文件夹,存放不同的文件。实际上这是跟实际相关的,要解决一个庞大的问题,需要不同工程相互协调,要实现一个工程的功能,需要不同的子设备相互协调。

但实际上,我们的工程组下往往只有一个工程就可以了,毕竟功能相对比较简单。

三、STM32程序的执行过程

我讲这个有点早了,不过实际上,我只是会简单介绍一下,说的太深我都很绕:

学过C语言的我们都知道,C语言的程序是从main函数开始执行的,但实际上,C语言用户编写的程序才是从main函数开始的,谭浩强先生编写的大学C语言教材上也明确说明了这一点,只是用着用着,把这一点忘记了。

探讨这个问题之前,我们在多聊几句:

1.程序是怎么执行的

——不管叫啥,有个类似于PC的寄存器,用来指示下一周期要执行的指令地址,机器通过这个地址取指、译指,然后执行。

2.程序复位,或者上电后,这个PC值是多少

——鬼知道,不同公司设计的不一样,反正芯片制造出来,就是固定的。

3.那么,机器是怎么找到用户编写的函数的

——这里就用到了念叨了好久的启动文件,打开startup_stm32f40_41xxx.s,第177行:

[STM32]STM32F407系列教程之一,搭建简洁Template模板_第4张图片
不管能不看懂,首先第177行有个Reset_Handler,下面下面,出现了一个”__main”,好了,就是这么找到main函数的,说白了,就是人为设定的main这么一个函数,然后用户在main函数里调用其他子函数实际上,其他的C语言也是这样的。

PS:注意我注释掉的三行,以后我会在讲到,有兴趣可以思考下它们的作用,答对了没奖的。另外有能力的,阅读一下整个startup_stm32f40_41xxx.s文件,在执行mian函数之前,机器做了一系列准备工作,网上有段代码的解释的,有兴趣的可以自行了解。

说完了启动过程,就到了main函数这里:
我画几个图来表示接下来的过程:
[STM32]STM32F407系列教程之一,搭建简洁Template模板_第5张图片
[STM32]STM32F407系列教程之一,搭建简洁Template模板_第6张图片
1.首先时System_Init()函数,用来对系统时钟进行配置,这个函数是自定义的,即用户可以规定其功能,比如这里的这个,大家可以去System_Init()的定义处,我除了配置系统时钟,还把常用的delay函数相关配置配置了一下。

PS:关于如何去. System_Init()的定义处,选中函数,双击全选,然后右键,出现一个菜单,选中”Go to the Definiton of xxxxx”,当然,也可使用快捷键(快捷键需要定义的)。

2.之后设置中断向量组,这个我会在讲中断时说明,这里不多介绍。

3.外设初始化,复位后,STM32F407VE的外设都是关闭的,如果我想使用usart进行串口打印,那么调用”BSP_USART_InitConfig(USART1, 115200, 1)”函数,用来开启usart1,开启后,就可以使用GPIOA-9和GPIOA-10来与电脑通信了。

4.最后是while(1)死循环,目的是让机器保持运行。当然也可以在while(1)中执行一些操作。

PS:如果大家用过Arduino单片机,while(1)循环好比loop,之前的所有操作就是setup。

四、STM32程序下载

关于程序烧录,或者说下载,STM32F407支持下载到不同的存储区,这里先介绍下载到flash区:

1.STM32F407VE系统板把boot0引脚接3.3V,插上下载器(我使用的是CH340)

2.打开烧录软件FlyMcu v0.188(注意版本号!!!)

[STM32]STM32F407系列教程之一,搭建简洁Template模板_第7张图片
注意:一定设置对,特别是使用一键下载的同学
图7
另外,波特率不要太高,选择76800即可!
图8

3.安装CH340驱动,在我压缩包里,和下载器在一起

4.选择程序文件,并简单配置下载完成后操作

[STM32]STM32F407系列教程之一,搭建简洁Template模板_第8张图片

5.点击”开始编程即可”

五、运行结果

打开串口监视器XCOM:

1.配置通信参数

[STM32]STM32F407系列教程之一,搭建简洁Template模板_第9张图片

2.打开串口

若无法查询到串口,重新安装CH340驱动,若仍无法解决,你的电脑串口可能坏了,插上鼠标看能否使用)

3.按下STM32FVE系统板上的复位按键

图11

4.执行结束

六、问题思考

希望大家能够仔细查找这些问题的答案,这样会对大家的学习有帮助:

1.ARM架构的发展历史;
2.RISC和CISC分别是什么?
3.bootloader是什么?
4.startup_stm32f40_41xxx.s完成的工作是什么?

你可能感兴趣的:(#,STM32)