本文主要是介绍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是个什么东东?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!