PS!!!以后相关文件从例程中直接复制就好了,以下的基本是解释每个文件的作用的,对大佬没啥用(2019.8.20)
哈!今天终于进入主题了,以后我也是会建新的工程模板的人了(再也不用当只会嘴上说心里慌慌,不会就轻蔑一笑的渣渣了。)好叭,开心不到三秒。。。我发现了一个致命的错误,没错,我的。我没有认认真真地去研读正点原子的手册,我不但错过了对MDK5简单易懂的介绍,还错过了库函数和寄存器的解释,并在这两个事上浪费了大量的时间,真是坐在金山银山上找宝贝,悔得我扇了自己两巴掌,今天我做出深刻检讨,以后要认认真真地去仔细研读正点原子的手册,还好这次发现的及时,避免了以后要走的很多弯路,以前的帖子我也会及时进行修改,以免误人误己。
首先我先说一下什么是固件库函数(也叫库函数),什么是寄存器?
我在学51的时候,经常看到是视频里讲解每个元件的原理,比如说一个数码管要亮成5,需要控制IO口的状态,寄存器版本呢就是自己去一个一个IO口进行编程,每一个IO都需要照顾到。这个写程序的方法对于51来说还算好,但是STM32有太多的元器件也都很复杂,自己去了解每个元器件原理再把它们变成自己想要的状态,太过麻烦,于是就有了库函数。所谓的库函数就是写好所有的元器件的底层操作程序,称之为固件,然后把这些程序打包在一起就成为固件库函数。这个时候你想要数码管显示5,就可以直接把早就写完的程序从这个库里面调出来就好,不用再自己一个一个代码地去编这个程序。简而言之,就是寄存器是你要一块砖一块砖去盖一个房子,而库函数是一面墙一面墙去盖,你说哪个更快呢?但是库函数也有缺点,就是对于自己的板子不一定是最好的,因为墙(库函数)是早就砌好了的,它需要适用于每一栋房子,那么对于你就不一定是最好的了;反之寄存器版本是你一个一个砖精挑细选出来的,所以就更适合你自己。
之后我再来讲讲,如何新建一个库函数的工程模板?又为什么这么去建?
①新建一个文件夹template,再建一个子文件夹USER(随便什么名字,不过一般他们好像用USER用惯了)
②在template文件夹里再建三个子文件,分别是OBJ(就是object,用来存放编译过程文件以及hex文件,烧录文件的时候就从这个文件夹里找)、CORE(英文是核心core,用来存放核心文件和启动文件)、 STM32F10x_FWLib(Firmware是固件的意思,FWLib就是固件库的意思,这就是放之前说的固件库函数的文件夹)
③将固件库包里的源码文件src、inc文件(其中src 存放的是固件库的.c 文件, inc 存放的是对应的.h 文件,每个外设对应一个.c 文件和一个.h 头文件。在文件夹STM32F10x_StdPeriph_Lib_V3.5.0\ Libraries\ STM32F10x_StdPeriph_Driver里)复制到STM32F10x_FWLib文件夹
④将固件库包里的startup_stm32f10x_hd.s 文件(是芯片的启动文件,hd适用于大容量芯片,在文件夹STM32F10x_StdPeriph_Lib_V3.5.0 \Libraries \CMSIS \CM3 \DeviceSupport \ST \STM32F10x \startup \arm里)、core_cm3.c文件和core_cm3.h文件(是核心文件,在文件夹STM32F10x_StdPeriph_Lib_V3.5.0 \Libraries \CMSIS \CM3 \CoreSupport里)复制到CORE文件夹
⑤将固件库包里的stm32f10x.h文件、system_stm32f10x.c文件、system_stm32f10x.h文件(在文件夹STM32F10x_StdPeriph_Lib_V3.5.0 \Libraries \CMSIS \CM3 \DeviceSupport \ST \STM32F10x 里)、 stm32f10x_conf.h文件、stm32f10x_it.c文件、stm32f10x_it.h文件(在文件夹STM32F10x_StdPeriph_Lib_V3.5.0 \Project \STM32F10x_StdPeriph_Template里)、main.c文件(随便找一个例程就行)复制到USER文件夹
⑥将SYSTEM 文件夹( SYSTEM 文件夹里面的代码,包含了几乎每个实验都可能用到的延时函数、位带操作、串口打印代码等,这个文件存在的目的也就是让这些常用的代码能随用随调。 里面 有 delay、 sys、usart 三个文件夹,分别包含了 delay.c、sys.c、usart.c 及其头文件 delay.h,sys.h,usart.h。delay 文件夹内包含了 delay.c 和 delay.h 两个文件,用来实现系统的延时功能;sys文件夹内包含了sys.c和sys.h两个文件,sys.h定义了STM32的 IO 口输入读取宏定义和输出宏定义、sys.c 定义了一个中断分组函数;usart 文件夹内包含了 usart.c 和 usart.h 两个文件,用于串口的初始化和中断接收。这里只是针对串口 1,你要用其他串口只要对代码稍作修改就可以了。usart.c 里面包含了void USART1_IRQHandler(void)和void uart_init(u32 bound)两个函数,里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf无法使用,虽然软件编译不会报错,但是硬件上 STM32 是无法启动的,这段代码不要去修改。引入的具体操作见库函数手册50页)复制到template文件夹。
⑦打开MDK5,从菜单找到New Uvision Project 新建一个工程(名字随你,我一般取汉语拼音“狗蛋”2333)放在USER文件里
⑧选择芯片的型号,我的是STM32F103RCT6芯片(这个最好记住自己单片机开发版芯片的名字),这个就是之前下MDK5的时候外加的F1系列的知识包的作用了
⑨取消掉MDK弹出的增加组件的界面(对咱们渣渣来说不需要),这个时候咱们的USER文件夹里就有了四个文件,其中Template.uvprojx 是工程文件,非常关键,不能轻易删除,Listings 和 Objects文件夹是 MDK自动生成的文件夹,用于存放编译过程产生的中间文件,所以可删可不删(看你心情)。
⑩将以上这些文件加入到工程中去(具体操作见库函数手册50页。。。嘿嘿太多了,就不说了)
⑾将编译生成的.hex文件设置到OBJ文件夹(具体操作见库函数手册44页)
⑿添加头文件路径到include Paths(具体操作见库函数手册45页)
⒀添加全局宏定义标识符到 Define 输入框(输入STM32F10X_HD,USE_STDPERIPH_DRIVER ,因为库函数在配置和选择外设的时候通过宏定义来选择的,具体操作见库函数手册48页)
怎么说呢,这个要远远比我想象的难很多(主要是想不通那些文件是干什么的,为什么加那些文件,而且内容繁多,进去就不容易再出来),看来还得明天好好地理解一下。
PS:我在研究完寄存器版本的新建工程之后又回来对帖子进行了修改,我发现正点原子的视频有的步骤太过繁琐,就修改了下顺序。只有两个步骤:
1.新建一个工程文件夹,把相关文件复制到里面去;
2.在MDK5中新建一个工程,将相关的文件引入工程即可。
这样看起来顺眼多了,果然寄存器版和库函数版相互对照着学能轻松好多,我真是个小机灵鬼哈哈。(2019.8.20)
什么是库函数、寄存器?如何新建一个库函数的工程模板?(第四天,有检讨)
最新推荐文章于 2022-11-15 00:56:24 发布