历史上的今天
返回首页

历史上的今天

今天是:2025年01月30日(星期四)

2019年01月30日 | STM32库函数编程思路总结及其与寄存器编程的对比剖析

2019-01-30 来源:eefocus

一、STM32库函数编程思路总结


1、基于STM32库函数的开发过程


进行具体的项目开发前,做好项目创建工作,通常包括如下步骤:


(1)新建工程项目的文件夹和子文件夹(如user、output、listing等)


(2)使用MDK新建(或打开项目),选择目标CPU、添加CMSIS核心、STM32启动代码和外设驱动程序,构成运行环境。


(3)添加包含main()函数的主程序文件。


(4)配置目标选项。


这些项目创建的步骤是通用的,项目构建确认无误后,可以复制整个项目文件夹的内容并保存,再次创建项目时可以直接应用(仅需适当改变项目名称等)。


通过以下步骤对项目本身流程进行分析,以明确并掌握相关外设的STM32驱动函数(以GPIO控制LED为例):


(1)为每个目标板上的外设编写一个驱动程序源文件[ led.c ],包含外设初始化函数[ led_init() ]和简单通用的外设操控函数      [ led_on_all()](直接应用性质的控制函数)


(2)将外设驱动程序的常量定义、函数声明等写入对应的头文件[ led.h ]。源程序文件[ led.c ]要包含其头文件[ led.h ],并添加到项目的源文件组中[ user ]。


(3)单独编写一个主程序文件[ main() ],实现项目需要的主控流程。主程序应包含外设驱动头文件[ led.h ](无需包含GPIO和RCC的头文件,尽管它们是必须被调用的。如下图所示,因为在配置RTE时已经在StdPeriph Drivers中选择了GPIO和RCC等外设驱动,故已经自动添加了该部分,无需在自己编写的源程序main()、led()中添加),并调用外设操控函数[ led_on_all()]或STM32库函数[ GPIO_ResetBits() ]实现外设控制。

主函数的调用关系如下图所示:

项目构建后最好先进行软件模拟,然后将程序下载到目标板进行硬件调试和运行。除了常规的寄存器、存储器等显示窗口,还应该利用外设窗口和逻辑分析仪窗口观测外设及其引脚的工作状态,尤其是在软件模拟时。


二、使用STM32库函数的一般规则


CMSIS和STM32库本身比较复杂,但有统一的规范。熟悉这些规律有助于我们更好地使用驱动程序。


1、常量定义


各种参数有宏定义或者枚举常量。对于每个寄存器而言,各个参量的值即为填入寄存器中某位的数值,名称一致。


2、外设函数


外设函数名用一个下划线分割两部分。各种外设往往具有功能雷同的函数,STM32库采用统一的函数名称,如下表所示。


3、外设结构类型


每种外设至少有2个结构体数据类型:位于stm32f10x.h头文件中的外设寄存器结构体PPP_TypeDef,用于访问外设寄存器;另一个是位于外设头文件stm32f10x_ppp.h中的外设初始化结构体PPP_InitTypeDef,用于配置外设初始化参数。


其中,


stm32f10x.h头文件中主要包含三部分内容:


(1)所有外设的寄存器结构体


(2)所有外设的内存映射


(3)用于每个寄存器位设置的宏定义常量(名称和寄存器的位名称一致,便于移植和应用)


stm32f10x_ppp.h头文件中主要包含:


(1)库函数,用于实现外设具备的各种功能


(2)宏定义、枚举常量以及外设初始化的结构体,用于抽象化硬件。常量就是设置相应寄存器位功能的数值,以达到所需的功能。


有了这两个外设结构体,就可以使用外设驱动程序库进行编程,步骤如下:


(1)开启外设时钟:使用RCC的外设时钟命令函数。——可以工作


(2)初始化外设:定义外设初始化结构变量,为外设初始化结构变量成员赋值,调用外设初始化函数配置外设。——如何工作


(3)控制外设:使用驱动程序库函数编写应用程序。——进行工作


4、外设初始化


外设初始化和配置的一般步骤如下:


(1)定义外设初始化结构变量:PPP_InitTypeDef   PPP_initStructure;


(2)用允许的成员值填充外设初始化结构成员变量


    方法1:逐个成员地填充整个结构体


PPP_InitStructure.number1=Val1;


...........


PPP_InitStructure.numberN=ValN;


   方法2:当成员较多,且无需全部设置为用户指定的特定值时,可以用PPP_StructInit()函数先将所有成员值设置为系统默认值后,再对其中的部分参数进行重新赋值。


PPP_StructInit(&PPP_InitStructure);


PPP_InitStructure.numberX=ValX;


PPP_InitStructure.numberY=ValY;


(3)调用PPP_Init()函数初始化外设


PPP_Init(PPP,&PPP_InitStructure)


(4)用PPP_Cmd()函数打开外设时钟,允许外设开始工作


PPP_Cmd(PPP,ENABLE);


经过以上4步对外设初始化后,可以灵活运用库函数进行应用程序的开发。


以初始化GPIO为例(库函数):


void GPIO_Init(void)


{


GPIO_InitTypeDef GPIO_InitStructure;


GPIO_InitStructure.GPIO_Pin = PIN_LED;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);


        RCC_APB2PeriphClockCmd(RCC_LED, ENABLE);  


GPIO_ResetBits(GPIOB,GPIO_Pin_All);

}


二、采用库函数和直接对外设寄存器编程的对比



以初始化GPIO为例(库函数):源代码共86行代码,在写入寄存器数值前需要大量代码去判断工作模式和配置的引脚,最后才组合出正确的数值


void GPIO_Init(void)


{


GPIO_InitTypeDef GPIO_InitStructure;


GPIO_InitStructure.GPIO_Pin = PIN_LED;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);


        RCC_APB2PeriphClockCmd(RCC_LED, ENABLE);  


GPIO_ResetBits(GPIOB,GPIO_Pin_All);

}



以初始化GPIO为例(寄存器):源代码只有1条语句,直接对端口配置寄存器CRL进行赋值,即可初始化配置端口


void GPIO_Init(void)


{


GPIOB->CRL=0X44444443;


}


由上面的例子可知,STM32库函数本质上是对外设寄存器直接编程,只是为了方便应用封装成了函数。所以用户的应用程序也可以绕过库函数,直接对寄存器编程。


直接对寄存器编程的代码效率最高。不过,需要花费较多的时间学习和查阅STM32数据手册,这个过程繁琐、易错,难以移植。


库函数就是用宏定义、枚举标识符等代表的数值写入寄存器,替用户摆脱枯燥的机械过程。在一些代码要求高效率的情况下,对寄存器编程是非常必要的。同时,对寄存器的学习与操作,将非常有助于我们在出错时进行程序调试。


推荐阅读

史海拾趣

Good Will Instrument Co., Ltd.公司的发展小趣事

对于恒温箱控制器电路,网友可能会有多种问题,以下是一些常见问题及其详细回答:

一、恒温箱控制器电路的基本原理是什么?

回答
恒温箱控制器电路的基本原理是通过温度传感器(如热敏电阻、热电偶等)实时检测恒温箱内的温度,并将检测到的温度信号转换为电信号(如电压或电流信号)。这个电信号随后被送入控制器中进行处理,与预设的温度值进行比较。如果检测到的温度高于或低于预设值,控制器会发出指令,通过调节加热元件(如电热丝、加热管等)或制冷元件(如压缩机、半导体制冷片等)的工作状态,使恒温箱内的温度回到预设值,从而实现恒温控制。

二、恒温箱控制器电路常见的故障有哪些?

回答
恒温箱控制器电路常见的故障包括但不限于以下几种:

  1. 温度显示异常
    • 可能原因:温度传感器损坏、控制器内部电路故障、显示屏故障等。
    • 解决方法:检查并更换损坏的温度传感器、修复或更换控制器内部故障电路、更换显示屏等。
  2. 温度控制不准确
    • 可能原因:控制器参数设置错误、温度传感器位置不当、加热/制冷元件故障等。
    • 解决方法:重新校准控制器参数、调整温度传感器位置、检查并修复加热/制冷元件等。
  3. 控制器无法启动
    • 可能原因:电源故障、控制器内部保险丝熔断、电路板短路等。
    • 解决方法:检查电源是否正常、更换熔断的保险丝、修复电路板短路等。

三、如何检查恒温箱控制器电路是否正常工作?

回答
检查恒温箱控制器电路是否正常工作,可以按照以下步骤进行:

  1. 检查电源
    • 确认电源插头是否牢固插入插座,电源线是否完好无损。
    • 使用万用表测量电源电压,确保在控制器要求的范围内。
  2. 检查温度传感器
    • 使用万用表测量温度传感器的电阻值或电压值,与标准值进行比较,判断传感器是否正常。
    • 检查传感器与控制器之间的连接是否牢固可靠。
  3. 检查控制器显示
    • 观察控制器显示屏上的温度读数是否准确,有无异常显示。
  4. 检查加热/制冷元件
    • 检查加热/制冷元件是否正常工作,可以通过观察其工作状态或使用万用表测量其电流/电压值来判断。
  5. 进行功能测试
    • 设置一个预设温度值,观察恒温箱是否能准确达到并保持在预设温度。
    • 如果条件允许,可以使用更精确的温度测量设备(如高精度温度计)对恒温箱内的温度进行校验。

四、如何维护和保养恒温箱控制器电路?

回答
为了保持恒温箱控制器电路的长期稳定工作,可以进行以下维护和保养工作:

  1. 定期清洁
    • 定期清洁恒温箱内部和外部的灰尘和污垢,防止对控制器电路造成不良影响。
    • 清洁时应断开电源,并使用合适的清洁工具和清洁剂。
  2. 检查连接
    • 定期检查温度传感器、加热/制冷元件与控制器之间的连接是否牢固可靠,如有松动应及时紧固。
  3. 校准参数
    • 定期对控制器进行校准,确保温度读数准确可靠。
    • 校准时应按照控制器的使用说明书或生产厂家的建议进行操作。
  4. 更换老化部件
    • 对于已经老化或损坏的部件(如温度传感器、加热/制冷元件等),应及时进行更换。
  5. 注意使用环境
    • 恒温箱应放置在通风良好、干燥清洁的环境中,避免阳光直射和潮湿环境对控制器电路造成损害。
  6. 定期维护
    • 定期对恒温箱进行全面检查和维护,包括控制器电路、加热/制冷系统、进出料装置等部分。
    • 维护时应按照设备的操作手册和生产厂家提供的维护保养指导进行。
European Crystal Org公司的发展小趣事

随着公司的发展,ECO逐渐在晶体技术领域取得了突破。研发团队成功开发出一种新型的高精度晶体振荡器,具有更高的稳定性和更低的功耗。这一创新产品迅速在市场上获得了广泛认可,ECO的订单量激增。同时,公司还加大了对研发的投入,不断推出新产品,满足了客户日益增长的需求。

COTO TECHNOLOGY公司的发展小趣事

随着业务的不断扩展,COTO TECHNOLOGY开始寻求全球范围内的合作与发展。1998年,公司收购了位于荷兰的Philips干簧开关事业部,组建了Coto Technology B.V.,进一步增强了其在全球市场的竞争力。此后,COTO还通过与其他企业的战略合作,不断拓宽业务领域,实现了从单一产品制造商向综合性电子解决方案提供商的转变。

Clulite公司的发展小趣事
  1. 创业初期
    • 描述Clulite公司的创始人或核心团队如何识别电子行业中的某个市场机遇。
    • 讲述他们是如何筹集初始资金,设立公司,并开发出第一款产品或解决方案的。
    • 可以提及公司在初创阶段面临的挑战,如技术难题、市场竞争等。
  2. 技术创新
    • 讲述Clulite如何通过研发创新,推出了一款颠覆性的产品或技术,从而获得了市场认可。
    • 详细描述这一创新过程,包括研发团队的努力、关键技术的突破等。
    • 提及这一创新如何帮助公司在市场上取得了竞争优势。
  3. 市场拓展
    • 描述Clulite如何逐步扩大市场份额,从地区市场走向全国乃至国际市场。
    • 可以讲述公司如何建立销售网络、与合作伙伴建立合作关系,以及参与行业展会等活动来推广品牌和产品。
    • 提及公司在市场拓展过程中遇到的挑战和应对策略。
  4. 品质管理
    • 讲述Clulite如何注重产品质量和客户体验,通过严格的质量控制流程来提升产品可靠性。
    • 描述公司如何建立完善的售后服务体系,为客户提供及时、专业的支持。
    • 提及这些举措如何帮助公司赢得了客户的信任和口碑。
  5. 可持续发展
    • 讲述Clulite如何关注环境保护和社会责任,推动公司的可持续发展。
    • 描述公司如何采取环保措施,减少生产过程中的污染排放。
    • 提及公司如何参与社会公益事业,回馈社会。

请注意,这些故事需要根据Clulite公司的实际情况进行调整和补充。如果你需要更具体的内容,建议查阅Clulite公司的官方网站、新闻报道或行业分析报告,以获取更详细的信息和数据。

CP Technology Inc公司的发展小趣事

随着公司规模的不断扩大,CP Technology Inc开始实施全球化战略。公司在海外设立了研发中心和销售网络,以更好地服务全球客户。同时,公司还积极参与国际电子行业的交流与合作,不断提升自身的技术水平和市场竞争力。

Aeroflex Metelics / Hi-Rel Components公司的发展小趣事

随着公司规模的不断扩大,CP Technology Inc开始实施全球化战略。公司在海外设立了研发中心和销售网络,以更好地服务全球客户。同时,公司还积极参与国际电子行业的交流与合作,不断提升自身的技术水平和市场竞争力。

问答坊 | AI 解惑

智能电流变送器中HART调制解调器的实现方法

引 言 先进的智能变送器是工业过程控制技术发展的需要,也是工艺过程实现高精度控制的必需,具有很好的市场前景。现场总线是目前国际上过程控制领域的一个热点,通过现场总线,数字通信技术可以延伸到现场仪表,给控制体系带来一场革命。HART协议作 ...…

查看全部问答>

请问附件中的mic接口为什么左右两个声道可以接到一个音频线上?

如题: 还有什么时候应该把左右两个声道接一条音频信号,什么时候应该把两个声道分开接,多谢指教,不胜感激!…

查看全部问答>

这道题我看不明白,谁能帮忙解释一下,谢谢!!

一台处理机具有如下指令格式    2位  6位  3位    3位 X         OP        源寄存器        目标寄存器        地  址 & ...…

查看全部问答>

部署SqlCe

我已经懂得怎么生成.net   compact项目的安装文件了,如果pocket   pc已经存在SQLCE,那么运行没有问题。但是当pocket   pc没有SQLCE的时候,我却无能为力,请问怎么一起部署这两个东西到真正的pocketpc中呢?或者分 ...…

查看全部问答>

ADC测交流和测直流区别

编写的STM32程序,用测直流是准确的,但测交流得到的值,与用示波器测的值差得太多,明显不对..请问,测交流有什么注意事项,,与测交流有什么区别,,PS:ST给的demo全是测直流,…

查看全部问答>

关于STM8的破解

                                 想出了一种利用STM8S利用内部唯一ID进行芯片加密的方式,不过要将这96个数据放入EEPROM或者FLASH。不知道STM8S的EE ...…

查看全部问答>

求单片机高手!!!

本人有一单片机P87c58x2F的bin文件,想反成C语言加注解,,,,,.求高手帮助。能者请call:13392707625   李先生 QQ:543206022…

查看全部问答>

对MSP430FR5739开发板的一点计划

FR5739最大的亮点自然是FRAM了,对这个东西是早有耳闻但是一直没有机会接触,正好最近想对自行车和无线小车下手,这板子还带3轴加速计,正好可以检测运动情况,正是我想要的东西呐!同时也可以连接无线模块,能让我控制并同步获取小车信息我知道很多 ...…

查看全部问答>

讯号产生问题帮解

小弟目前想把ic所出来的讯号分成两个讯号要差180度那我目前做的测试过程是讯号经过37325再打入4013最后,再把原本讯号跟4013出来的两个讯号分别做And,最后的两个讯号是有相差180度,可是最后出来的讯号周期被拉长了跟我原本的讯号周期不一样了那不 ...…

查看全部问答>