什么是库函数、寄存器?如何新建一个库函数的工程模板?(第四天,有检讨)

        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就是固件库的意思,这就是放之前说的固件库函数的文件夹)

③将固件库包里的源码文件srcinc文件(其中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)

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值