热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

STM32之stm32f4xx_conf.h讲解

stm32f4xx_conf.h文件的讲解在我的上一篇博客中又讲解到stm32f4xx.h文件的讲解,在那个头文件中包含了4个头文件。这四个头文件中第一个是非常难的

stm32f4xx_conf.h文件的讲解

在我的上一篇博客中又讲解到stm32f4xx.h文件的讲解,在那个头文件中包含了4个头文件。
在这里插入图片描述
在这里插入图片描述
这四个头文件中第一个是非常难的,如果你32学的不是很扎实的话劝你们最好别去碰,涉及很多汇编和底层知识你只需要知道每次你新建一个项目的时候你把以下四个头文件加到你的项目文件夹下即可。
其他的你也就别管了。
在这里插入图片描述
第二个头文件这个在我之前写过的博客中已经提到,并且也很简单,第三个头文件功能就是为关键字创立一个新的名字,还有其他的一些参数,不是很难。我们今天主要讲解一下stm32f4xx_conf.h这个头文件,思维导图就没了,因为主要就两大块。

1.固件库的头文件集

在这里插入图片描述
这些就是固件库的头文件集,如果你声明了固件库的那个宏,那么你只要包含了系统头文件,这个头文件也就被包含了。

检查参数的宏定义

这个模块可真的把我给整死了,这个模块的主要作用为固件库中的每一个库函数检查传进来的参数是不是正确的,这个模块非常让人觉得比较好的地方是用宏定义的,那也就是在cpu运行期间不会占用内存,因为固件库里的函数量太大了,如果用函数去检查参数的正确性的话,那会让应用的程序效率变低,而且会占用堆栈里面大量的内存(函数嵌套)。
这里稍微注意一下,带参数的宏定义在引用的时候和函数引用的时候是相似的,性质却有很大的不同。
在这里插入图片描述
在这里插入图片描述

这里关于宏定义的知识如果还不是很了解的话你们可以先去查一查,
带有参数的宏定义是形参替实参,宏体替宏名。如果你想开启库函数参数检查机制的话,那你就擦掉注释。

宏定义中的expr这个标识符要么是1要么是0
expr这个标识符就是很多个判断语句的或运算,如果传进来的参数属于预先所设定好的范围内,那么这个值就为1,否则,则为0.如果expr为1,就指行((void)0);这个语句相当于没有执行一样,但如果为0,就会执行维护失败函数。
在这里插入图片描述
而这个函数的实参file就是出错地方所在的文件路径,line就是出错的地方所在行。这个函数的目的就是告诉你在什么地方传参失败。而我们发现我们在开发的过程中并没有擦除注释,是因为一般情况下不会出现这种错误,因为要传的实参都是已经事先宏定义好的(实参几乎都是字母),放在该库函数所对应的头文件里以及系统头文件里,而且KEIL5有自动检查和提示机制,如果你打错字母了它会提示出错,甚至你打前3个字母就会有提示出现,所以一般就不会出现问题,那有的人就说,那我就一定要打开参数检查机制呢,可以,那我们试一试。
因为函数已经帮你声明好了,你只需要定义函数实体就可以了。
但是接下来,你将会发现bug
你定义的函数实体必须要放在misc.c文件中,因为你定义的函数如果不放在这个文件中,它就会提示以下信息,
在这里插入图片描述
那有人说,那我定义两个函数不行吗,如果你定义两个的话,就会重名了,也会报错,那有人说我定义static函数不就可以了吗,但你有没有发现该函数的声明没有static。所以,你不要再挣扎了,就把函数放在misc.c文件下。
至于你想在这个函数里面实现什么功能,那你可以执行处理。
我呢就想在编译的时候,如果参数传递错误,那么就会报错,但是做了一上午还有半个下午,还是没做出来,如果有哪位小伙伴有想法的私信我,或者在评论区里留言。

总的来说
我想对大家说的是

别对这里动什么手脚了,我他妈的都要疯了,参数一般是不会出错的,它有提示和检查机制。妈的,我他妈花了将近半天的时间去实现如何在编译的时候提示你传参错误。操你🐎的,算了,不说了,难受。

在之后的博客中将会讲解固件库函数了,有27个外设呢。


推荐阅读
  • 本文探讨了如何解决在Eclipse IDE外部通过命令行编译包含自定义包的Java项目时遇到的问题,并提供了详细的解决方案。 ... [详细]
  • 随着EOS主网的成功启动,众多开发者和投资者对其给予了高度关注。本文旨在介绍如何构建EOS开发环境,包括所需的基本硬件配置、软件安装步骤以及常见问题的解决方案。 ... [详细]
  • 当使用Visual Studio 2005重新编译原本基于Visual C++ 6.0的工程项目时,可能会遇到链接器错误LNK1104,提示无法打开文件“LIBC.lib”。本文将介绍几种有效的解决方案。 ... [详细]
  • 在研究Linux内核代码时,经常会遇到与‘队列’相关的术语。本文旨在全面介绍Linux系统中几种常见的队列类型及其应用,帮助读者更好地理解和使用这些机制。 ... [详细]
  • 深入理解BIO与NIO的区别及其应用
    本文详细探讨了BIO(阻塞I/O)和NIO(非阻塞I/O)之间的主要差异,包括它们的工作原理、性能特点以及应用场景,旨在帮助开发者更好地理解和选择适合的I/O模型。 ... [详细]
  • 本文将详细介绍NSRunLoop的工作原理,包括其基本概念、消息类型(事件源)、运行模式、生命周期管理以及嵌套运行等关键知识点,帮助开发者更好地理解和应用这一重要技术。 ... [详细]
  • 本文介绍如何在Ubuntu环境下为OpenWrt系统构建并安装首个'Hello World'应用程序的IPK包。文章不仅涵盖了基本的环境搭建,还详细说明了代码编写、Makefile配置及最终的IPK包生成与安装过程。 ... [详细]
  • 解决VSCode中文乱码问题的综合方案
    在使用VSCode进行开发时,尤其是涉及Python编程,可能会遇到中文乱码的问题。本文总结了多种有效的解决方案,帮助开发者快速解决这一常见问题。 ... [详细]
  • 日志记录对于软件开发至关重要,特别是在调试和维护阶段。通过日志,开发者能够追踪错误源头并了解系统的运行状态。本文将探讨如何在Django框架中有效配置和使用日志记录功能。 ... [详细]
  • 在Postman中使用@RequestParam接收数组的方法详解
    本文详细探讨了在Postman中如何正确使用@RequestParam注解来传递和接收数组数据,以及在实际应用中可能遇到的问题及解决方案。 ... [详细]
  • Gradle复合构建详解
    自Gradle 3.3起,复合构建功能得以实现,这是一种能够整合其他独立构建的高级构建模式。本文将详细介绍复合构建与多项目构建的区别,以及如何在实际项目中应用复合构建。 ... [详细]
  • Python并行处理:提升数据处理速度的方法与实践
    本文探讨了如何利用Python进行数据处理的并行化,通过介绍Numba、多进程处理以及Pandas DataFrame上的并行操作等技术,旨在帮助开发者有效提高数据处理效率。 ... [详细]
  • 深入理解Java内存模型的核心原则
    本文详细解析了Java内存模型(JMM)的核心原则,包括原子性、可见性和有序性,并探讨了JMM如何通过特定机制保证这些特性,为开发者提供多线程编程的指导。 ... [详细]
  • 微型计算机主机的关键组件解析
    本文详细探讨了微型计算机主机的核心组成部分,包括微处理器、内存储器、输入输出接口等,并解释了这些部件如何协同工作以构建一个完整的微型计算机系统。 ... [详细]
  • 原作者:小甲鱼(注:最左边是文件头的偏移量。)IMAGE_DOS_HEADERSTRUCT{+0hWORDe_magicMagi ... [详细]
author-avatar
null5269
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有