先问个问题:如果某个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是个什么东东?相关推荐

  1. 网管必看的好东东(一)

    自动释放系统资源 在Windows中每运行一个程序,系统资源就会减少.有的程序会消耗大量的系统资源,即使把程序关闭,在内存中还是有一些没用的DLL文件在运行,这样就使得系统的运行速度下降.不过我们可以 ...

  2. 京东笔试——神奇数 【题目描述】东东在一本古籍上看到有一种神奇数,如果能够将一个数的数字分成两组,其中一组数字的和 等于另一组数字的和,我们就将这个数称为神奇数。例如 242 就是一个神奇数,我们能够

    2 .神奇数 [ 题目描述]东东在一本古籍上看到有一种神奇数,如果能够将一个数的数字分成两组,其中一组数字的和 等于另一组数字的和,我们就将这个数称为神奇数.例如 242 就是一个神奇数,我们能够将这 ...

  3. ci写微博php,php(CI框架)+ajax实现类似微博的东东

    写在前面:好久没有更新博客,这段时间主要在写这个东西了,其实东西也不难,两三天就写好了.也收获了一些东西,这里做一下分享和总结. 需求:是学校新闻中心组织的一个活动,感恩母亲节微言活动,将收集到的祝福 ...

  4. 【Week9 作业】A - 咕咕东的目录管理器、B - 东东学打牌、C - 签到题,独立思考哈

    A - 咕咕东的目录管理器 题意: 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响,时不时发生故障,他受不了了,想要写一个高效易用零bug的操作系统 -- 这工程量太大了,所以他定了一个小目标, ...

  5. 程序设计思维 B - 东东学打牌

    题目 最近,东东沉迷于打牌.所以他找到 HRZ.ZJM 等人和他一起打牌.由于人数众多,东东稍微修改了亿下游戏规则: 所有扑克牌只按数字来算大小,忽略花色. 每张扑克牌的大小由一个值表示.A, 2, ...

  6. Week9 作业——B - 东东学打牌

    题目 最近,东东沉迷于打牌.所以他找到 HRZ.ZJM 等人和他一起打牌.由于人数众多,东东稍微修改了亿下游戏规则: 所有扑克牌只按数字来算大小,忽略花色. 每张扑克牌的大小由一个值表示.A, 2, ...

  7. WEEK9 作业 B - 东东学打牌

    B - 东东学打牌 题目描述 最近,东东沉迷于打牌.所以他找到 HRZ.ZJM 等人和他一起打牌.由于人数众多,东东稍微修改了亿下游戏规则: 所有扑克牌只按数字来算大小,忽略花色. 每张扑克牌的大小由 ...

  8. Week10 限时大模拟 B - 东东转魔方 HDU - 5983

    题目描述 东东有一个二阶魔方,即2×2×2的一个立方体组.立方体由八个角组成. 魔方的每一块都用三维坐标(h, k, l)标记,其中h, k, l∈{0,1}.六个面的每一个都有四个小面,每个小面都有 ...

  9. 程序设计思维与实践 Week10限时模拟 东东的魔方

    问题描述 东东有一个二阶魔方,即2×2×2的一个立方体组.立方体由八个角组成. 魔方的每一块都用三维坐标(h, k, l)标记,其中h, k, l∈{0,1}.六个面的每一个都有四个小面,每个小面都有 ...

最新文章

  1. docker pull拉取镜像_docker拉取镜像失败解决
  2. 解决windows图片查看器背景色变成米黄色
  3. 通过 python-xmp-toolkit 读取图片xmlp信息
  4. 查询除了一列意外_想让你的查询语句变快吗?
  5. 这些假脸实在太逼真了!英伟达造出新一代GAN,生成壁纸级高清大图毫无破绽...
  6. Office2010安装出现“错误1907”的解决方法(未验证)
  7. visual studio 删除附加项
  8. a=a++问题引发的思考
  9. 在WPF中调用Winform控件
  10. 学生签到系统c代码_c语言学生签到
  11. 怎么下载正版java7_Java7中jdk的下载和安装
  12. 从0到1哥斯拉项目反编译初步搭建
  13. 降采样滤波器 matlab,降采样FIR滤波器的设计与硬件实现
  14. luffy-16/订单表设计,立即付款接口/前端,支付成功get回调用户展示,支付成功post回调修改订单状态
  15. [机器学习与scikit-learn-33]:算法-回归-通过PolynomialFeatures实现数据的升维
  16. Android 部分手机拍照后获取的图片被旋转
  17. ECharts之世界地图
  18. 戴尔服务器710u盘安装系统,联想G710笔记本U盘重装Win7系统教程
  19. 「滴滴-橙心优选」秋招面试复盘总结
  20. sklearn 中 pca.components_

热门文章

  1. NSIS ERROR NSIS病毒新型变种 解决办法
  2. 数据中心交钥匙项目部署仍面临挑战
  3. 多模分频器原理及simulink建模仿真
  4. php 关键词挖掘,如何挖掘长尾关键词
  5. 多功能格式转换器的使用方法
  6. python 个性化推荐系统_如何在 Python 中使用 LightFM 构建可扩展的个性化推荐系统?...
  7. 如何在Python中使用LightFM构建可扩展的电子商务推荐系统?
  8. Error while executing topic command:KeeperErrorCode=NoNode for /brokers/ids
  9. 项目章程的主要内容#软考高级信息系统项目管理师/高项读书笔记#3
  10. matlab中dare 和care,dare 的用法