




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 基于固件库的stm32f107的程序设计方法探讨 张明华摘要:随着半导体技术的快速发展,一代又一代的微控制器芯片应运而生。与传统的8位或者16位单片机相比,32位的arm芯片的内核和外设功能更加强大,结构更加复杂,带来的后果就是寄存器数量和配置难度增加。文章以意法半导体公司生产的stm32f107为例,对此类微控制器芯片的编程方法做了详细的探讨,并给初学者提出了相应的建议。关键词:mcu 程序设计 固件库:tp311.1 :a :1007-9416(2014)12-0171-01目前,stm32f107的程序设计有两种方法:一种是直接操作寄
2、存器;另外一种是调用固件库。究竟哪一种才是最适合的编程方法,传统的单片机开发者和初学者的观点分歧很大。本文对这两类编程方法做了详细的探讨。1 固件库介绍固件库,就是stm32f10x standard peripherals firmware library的意思,简称stm32固件库。它是意法半导体公司针对stm32系列mcu发布的一组函数库,并且符合cmsis标准1。stm32固件库是一个函数包,由程序、数据结构和宏组成,包括了stm32系列mcu标准外设的性能特征。每个外设驱动都由一组函数组成,而这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用api驱动,api对该驱动程序的结构
3、,函数和参数名称都进行了标准化。所有的驱动源代码都符合“strict ansi-c”标准,因此它不受不同开发环境的影响有较好的移植性。2 直接操作寄存器简单来讲,直接操作寄存器就是在寄存器的配置时,计算配置字的二进制数值,直接写入寄存器。为了实现pd2管脚不断地输出高低电平,编程步骤如下。(1)将rcc_apb2enr寄存器的第5位即gpiod口时钟位置1,开启gpiod时钟。(2)计算pd2管脚设置为推挽输出时的配置字为0x00000300,并写入gpiod_crl寄存器中。(3)通过向gpiod_bsrr寄存器写入0x00000004来实现pd2管脚输出高电平。(4)通过向gpiod_br
4、r寄存器写入0x00000004来实现pd2管脚输出低电平。部分代码如下:int main(void)rcc->apb2enr|=1<<5;gpiod->crl&=0xfffff0ff;gpiod->crl|=0x00000300;while(1) gpiod->bsrr=0x00000004;gpiod->brr=0x00000004;这种方法与传统51等单片机的编程方法类似,效率也比较高,应用程序代码少,执行速度快。但是在编程以前,我们必须要做好功课,因为每个外设的寄存器都不是一样的。另外,对于32位寄存器来讲,想要记住每一位所代表的功能几
5、乎是不可能的。3 调用固件库对于stm32f10x系列mcu来讲,固件库都是通用的,并且包括了所有标准外设的基本功能函数。所以,编程者可以直接调用固件库函数来进行外设的配置和使用。另外,意法半导体公司在stm32固件库使用手册中也给出了标准外设的配置步骤2。(1)在main.c中,声明一个结构体ppp_inittypedef。例如: ppp_inittypedef ppp_initstructure; 这里ppp_initstructure是一个位于内存中的工作变量,用来初始化一个或者多个外设ppp。(2)为变量ppp_initstructure的各个结构成员填入允许的值。可以采用以下2种方式
6、:1)按照如下程序设置整个结构体ppp_initstructure.member1 = val1; ppp_initstructure.member2 = val2; 如果有多个成员则继续赋值。2)仅设置结构体中的部分成员:这种情况下,用户应当首先调用函数ppp_sturcinit(.)来初始化变量ppp_initstructure,然后再修改其中需要修改的成员。这样可以保证其他成员的值(多为缺省值)被正确填入。(3)调用函数ppp_init(.)来初始化外设ppp。(4)在这一步,外设ppp已被初始化。可以调用函数ppp_cmd(.)来使能外设。(5)可以通过调用一系列函数来使用外设。每个外
7、设都拥有各自的功能函数。注意,在设置一个外设前,必须调用以下一个函数来使能它的时钟: rcc_ahbperiphclockcmd(rcc_ahbperiph_pppx, enable); rcc_apb2periphclockcmd(rcc_apb2periph_pppx, enable); rcc_apb1periphclockcmd(rcc_apb1periph_pppx, enable);按照上述步骤,将实现pd2管脚翻转的程序改写如下:int main(void)gpio_inittypedef gpio_initstructure;rcc_apb2periphclockcmd(rcc
8、_apb2periph_gpiod,enable);gpio_initstructure.gpio_pin=gpio_pin_2;gpio_initstructure.gpio_speed=gpio_speed_50mhz;gpio_initstructure.gpio_mode=gpio_mode_out_pp;gpio_init(gpiod,&gpio_initstructure);while(1)gpio_setbits(gpiod, gpio_pin_2);gpio_resetbits(gpiod, gpio_pin_2);如果有一定的英文和c语言编程基础,从上述程序不难看出其
9、实现功能。正是因为有固件库的存在,编程者只需要调用库函数和标准的宏定义便可实现相应的功能,并不需要了解实际寄存器的配置字。尽管在库函数中,仍然是操作寄存器的方式,但计算配置字的工作由库函数代劳,大大减轻了程序员的工作量和出错几率。4 结语直接操作寄存器效率高,代码少。调用固件库则更加简单和快速,程序易读性好。其实,这两种方法并没有明显的界限。目前大部分直接操作寄存器的代码也没有完全脱离固件库,即寄存器定义和地址等仍然调用固件库的定义,但是配置字自己写。对于那些在代码大小和执行速度方面有严格要求的应用程序,会直接操作寄存器以减少函数的嵌套等,提高效率。本文推荐初学者使用调用stm32固件库的编程方法,这样既可以较快地掌握外设的使用,又
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 混凝土现浇合同协议
- 混凝土浇捣劳务合同协议
- 第三方支付平台合同协议
- 消费者个人合同协议模板
- 涪陵区物流合同协议
- 消防电合同协议
- 立体货架租赁合同协议
- 清水房合同协议
- 空调租售维修合同协议
- 游艇代驾协议合同模板
- GB/T 12236-2008石油、化工及相关工业用的钢制旋启式止回阀
- 部编版六年级语文毕业总复习课件
- 洛可可艺术课件
- 译林英语必修3Unit3reading(共19张)课件
- 20kV及以下配网工程建设预算编制与计算规定-
- 人工肝血浆置换术知情同意书
- TRIZ试题库详细版
- Q∕GDW 12129-2021 电网大气腐蚀等级分布图绘制规范
- MTM-1基本方法
- ppt精选模板:热烈欢迎领导莅临指导工作PPT课件
- (完整版)高中化学必修2有机化合物试题.doc
评论
0/150
提交评论