stm32f10x_conf.h是个什么东东?

2024-03-14 14:18
文章标签 conf 东东 stm32f10x

本文主要是介绍stm32f10x_conf.h是个什么东东?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       先问个问题:如果某个C文件中要用到I2C外设库、GPIO外设库,那该怎么办?相信大家都会异口同声的说把这两个外设的头文件包含进来不就可以了吗,确实是这样的。但是当多个文件需要包含各种外设头文件的时候,是不是得为每个文件逐个的添加这些头文件呢?如果是这样的话,还真有点繁琐,这时有人说,干脆把头文件全部通过include组织在一个文件中,并且先全部注释掉,工程中需要哪些头文件就把这些头文件进行去注释,形式如下:

比如工程中需要用到GPIO外设、RCC和MISC,那么就把这3个头文件去注释,其他的保持注释。然后把这个文件直接通过include包含到所有需要用到这些头文件的文件中,岂不是更快?

没错,这个文件其实已经被ST公司设计好了,它就是stm32f10x_conf.h。只不过这个文件除了将stm32f10x系列芯片涉及到的外设头文件全部组织在一起之外,还有另外一部分内容,那就是断言语句。

上面的意思就是,如果定义了USE_FULL_ASSERT宏,那么就定义

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))

这个宏定义大概就是说如果expr为真,那么assert_param(expr)等效于(void)0,即什么也不做,如果expr为假,那么assert_param(expr)等效于assert_failed((uint8_t *)__FILE__, __LINE__)),而assert_failed((uint8_t *)__FILE__, __LINE__))这个函数其实是一种错误提示,就是说如果expr为假,那么系统就发出错误提示,在软件编码调试测试阶段可以利用这一点来对函数的入口参数进行检查,如果入口参数非法,则发出这个提示。为了更加直观的认识这个函数,不妨做个实验:

#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)

#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)

#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)

#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)

#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)

#define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)

#define GPIOG_BASE            (APB2PERIPH_BASE + 0x2000)

 

#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)

#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)

#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)

#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)

#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)

#define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)

#define GPIOG               ((GPIO_TypeDef *) GPIOG_BASE)

 

#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \

                                    ((PERIPH) == GPIOB) || \

                                    ((PERIPH) == GPIOC) || \

                                    ((PERIPH) == GPIOD) || \

                                    ((PERIPH) == GPIOE) || \

                                    ((PERIPH) == GPIOF) || \

                                    ((PERIPH) == GPIOG))

 

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)

{

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  GPIOx->ODR = PortVal;

}

GPIO_Write(GPIOB,( u16)(0x20));

如果把GPIO_Write的第一个参数改为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF和GPIOG之外的其他值,比如(GPIO_TypeDef *) 0,编译会提示什么错误呢?提示结果会如下:

user\src\smg.c(14): error:  #20: identifier "GPIO" is undefined

user\src\smg.c(14): error:  #18: expected a ")"

user\src\smg.c(14): error:  #165: too few arguments in function call

user\src\smg.c(14): error:  #18: expected a ")"

也就是提示(GPIO_TypeDef *) 0这个参数并没有包含在IS_GPIO_ALL_PERIPH(PERIPH)的参数中,因此属于非法参数。

如果expr为真,则assert_param(expr)等效于((void)0),即如下代码:

#define assert_param(expr) ((void)0)

最后再做个总结:

1、stm32f10x_conf.h这个文件包含了两大部分内容:

第一部分就是通过宏定义指令include把所有的外设头文件集中在一起,免去了每个文件添加一大堆头文件的烦恼。

第二部分就是设计了断言函数,利用这个断言函数就可以设计出函数入口参数检查机制。

2、这个文件被stm32f10x.h文件通过include包含了进来,如下图所示

但是STM32F10x_StdPeriph_Lib_V3.5.0这个版本的库好像并没有把stm32f10x_conf.h放在里面,看来这个文件是独立于标准库的,得自己添加进来才行,否则会出现找不到这个文件的错误提示。

到此为止,算是把stm32f10x_conf.h这个文件该说的都说了,希望本文对大家有用!

 

这篇关于stm32f10x_conf.h是个什么东东?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/808692

相关文章

linux配置DNS解析设置之配置文件“/etc/resolv.conf “

在 Linux 系统中,/etc/resolv.conf 文件用于配置系统的 DNS 解析设置。它定义了如何将主机名(例如 www.example.com)转换为 IP 地址。主要功能包括: 主要功能 DNS 服务器地址:指定系统用于查询域名的 DNS 服务器。你可以在该文件中列出一个或多个 DNS 服务器的 IP 地址。 示例内容: conf 复制代码 nameserver 8.

Redis使用——Redis的redis.conf配置注释详解(三)

Redis使用——Redis的redis.conf配置注释详解(三) 背景 日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列,这里整理汇总后分享给大家,让其还在深坑中的小伙伴有绳索能爬出来。 同时在这里也欢迎大家把自己遇到的问题留言或私信给我,我看看其能否给大家解决。 开发环境 系统:Ubuntu工具:Docker

某东东的jdgs算法分析--适合进阶学习

某东东的jdgs算法分析   这个贴主要还是对算法本身结构部分描述会多点,憋问,问就是过去太久了,很多逆向过程不一定能还原(主要是懒,不想原路再走一遍),所以可能有部分跳跃的内容,会给具体代码,但对应的偏移地址和具体信息没有,给大家一个锻炼自己的机会 ( •_•)   继续观看前申明:本文涉及的内容是为给大家提供适合大家巩固基础及进阶更高的技术,别做不好的事情哦。 算法分析结构划分

nginx 反向代理支持websocket 加大小设置 conf文件配置说明

worker_processes 1;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;#限制请求体的大小-附件大小也会受此限制client_max_body_size 500m;log_format main '$remote_ad

Rust China Conf 2024 震撼来袭,INFINI Pizza 搜索引擎重磅亮相!

随着 Rust 语言以其在性能、安全性和并发性方面的卓越表现,赢得了全球开发者的青睐,Rust 社区正迎来前所未有的发展机遇。在这个充满活力与潜力的背景下,Rust China Conf 2024 震撼来袭! Rust 大会介绍 Rust 大会即将于 9 月 7 日 - 8 日在上海盛大举办。作为年度国内规模最大并唯一的 Rust 线下大型会议,它由 Rust 中文社区发起主办、知名企业和开源

问题解决:java运行HiveQL,报错:java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration

文章目录 问题场景问题环境问题原因解决方案结果总结随缘求赞 问题场景 使用Java编写HiveQL语句,然后通过jdbc的方式远程连接hive集群,并执行。在执行过程中,报错,错误信息如下: java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configurationat org.apache.hive.jdbc.Hi

vue3的nginx配置文件配置(nginx只配置前端vue3的nginx.conf文件)

1、本地的访问网址的链接 http://localhost:5173/official-website/ 2、程序的配置 3、nginx.conf配置 #user nobody;worker_processes 1;events {worker_connections 1024;}http {include mime.types;default_type appli

启动zabbix_agentd报cannot create IPC key for path '/usr/local/zabbix/etc/zabbix_agentd.conf', try to cr

启动service zabbix_agentd start或者/usr/local/sbin/zabbix_agentd -c /usr/local/zabbix/etc/zabbix_agentd.conf (其中-c表示后者是前面的绝对路径),查看日志报错如下: [root@host-192-168-*-*~]# tail -f /tmp/zabbix_agentd.logzabbix_ag

postgresql.conf配置详解

postgresql.conf配置详解 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! postgresql.conf是PostgreSQL数据库的主要配置文件之一,它包含了各种配置选项,可以用来控制数据库服务器的行为。通过修改postgresql.conf文件中的参数,可以对数据库的性能、安全性和行为进行调优和定制。 常见的

STM32F10x系列标准库移植到STM32CubeIDE

STM32F10x系列标准库移植到STM32CubeIDE 翻了大量博客和论坛终于成功移植了F1的标准库到stm32cubeide,终于可以离开keil mdk了,gcc的编译速度飞一般的快,爽。 链接:https://pan.baidu.com/s/1xtqep5iSvo0f57gpxYB2XQ 提取码:czqq 2020/11/3修改 (主要是修改了一个汇编函数(sys.h的第33-37