1.定义
2.命名规则
PPP 表示任一外设缩写,例如: ADC。
系统、源程序文件和头文件命名都以“stm32f10x_”作为开头,例如: stm32f10x_conf.h。
常量仅被应用于一个文件的,定义于该文件中;被应用于多个文件的,在对应头文件中定义。所有常量都由英文字母大写书写。
寄存器作为常量处理。他们的命名都由英文字母大写书写。在大多数情况下,他们采用与缩写规范与用户手册一致。
外设函数的命名以该外设的缩写加下划线为开头。每个单词的第一个字母都由英文字母大写书写,例如:SPI_SendData。 在函数名中,只允许存在一个下划线,用以分隔外设缩写和函数名的其它部分。
名为 PPP_Init 的函数,其功能是根据PPP_InitTypeDef 中指定的参数,初始化外设 PPP,例如 TIM_Init。
名为 PPP_DeInit 的函数,其功能为复位外设 PPP 的所有寄存器至缺省值,例如 TIM_DeInit。
名为 PPP_StructInit 的函数,其功能为通过设置 PPP_InitTypeDef 结构中的各种参数来定义外设的功能,例如:USART_StructInit。
名为 PPP_Cmd 的函数,其功能为使能或者失能外设 PPP,例如: SPI_Cmd。
名为 PPP_ITConfig 的函数,其功能为使能或者失能来自外设PPP 某中断源,如:RCC_ITConfig。
名为 PPP_DMAConfig 的函数,其功能为使能或者失能外设 PPP 的 DMA 接口,例如: TIM1_DMAConfig。
用以配置外设功能的函数,总是以字符串“Config”结尾,例如 GPIO_PinRemapConfig。
名为 PPP_GetFlagStatus 的函数,其功能为检查外设 PPP 某标志位被设置与否,例如: I2C_GetFlagStatus。
名为 PPP_ClearFlag 的函数,其功能为清除外设 PPP标志位,例如:I2C_ClearFlag。
名为 PPP_GetITStatus 的函数,其功能为判断来自外设 PPP 的中断发生与否,例如: I2C_GetITStatus。
名为 PPP_ClearITPendingBit 的 函 数 ,其功能为清除外设PPP中断待处理标志位 ,例如:I2C_ClearITPendingBit。
3.编码规则
3.1变量
typedef signed long s32;
typedef signed short s16;
typedef signed char s8;
typedef signed long const sc32;
typedef signed short const sc16;
typedef signed char const sc8;
typedef volatile signed long vs32;
typedef volatile signed short vs16;
typedef volatile signed char vs8;
typedef volatile signed long const vsc32;
typedef volatile signed short const vsc16;
typedef volatile signed char const vsc8;
typedef unsigned long u32;
typedef unsigned short u16;
typedef unsigned char u8;
typedef unsigned long const uc32;
typedef unsigned short const uc16;
typedef unsigned char const uc8;
typedef volatile unsigned long vu32;
typedef volatile unsigned short vu16;
typedef volatile unsigned char vu8;
typedef volatile unsigned long const vuc32;
typedef volatile unsigned short const vuc16;
typedef volatile unsigned char const vuc8;
3.2布尔型
在文件 stm32f10x_type.h 中,布尔形变量被定义如下:
typedef enum
{
FALSE = 0,
TRUE = !FALSE
} bool;
3.3标志位状态类型
在文件 stm32f10x_type.h 中,我们定义标志位类型(FlagStatus type)的 2 个可能值为“设置”与“重置”( SET or RESET)。
typedef enum
{
RESET = 0,
SET = !RESET
} FlagStatus;
3.4功能状态类型
在文件 stm32f10x_type.h 中,我们定义功能状态类型( FunctionalState type)的 2 个可能值为“使能”与“失能”( ENABLE or DISABLE)。
typedef enum
{
DISABLE = 0,
ENABLE = !DISABLE
} FunctionalState;
3.5错误状态类型
在文件 stm32f10x_type.h 中,我们错误状态类型类型( ErrorStatus type)的 2 个可能值为“成功”与“出错”(SUCCESS or ERROR)。
typedef enum
{
ERROR = 0,
SUCCESS = !ERROR
} ErrorStatus;
3.6外设
用户可以通过指向各个外设的指针访问各外设的控制寄存器。这些指针所指向的数据结构与各个外设的控制寄存器布局一一对应。
外设控制寄存器结构
文件 stm32f10x_map.h 包含了所有外设控制寄存器的结构,下例为 SPI 寄存器结构的声明:
/*------------------ Serial Peripheral Interface ----------------*/
typedef struct
{
vu16 CR1;
u16 RESERVED0;
vu16 CR2;
u16 RESERVED1;
vu16 SR;
u16 RESERVED2;
vu16 DR;
u16 RESERVED3;
vu16 CRCPR;
u16 RESERVED4;
vu16 RXCRCR;
u16 RESERVED5;
vu16 TXCRCR;
u16 RESERVED6;
} SPI_TypeDef;
寄存器命名遵循上节的寄存器缩写命名规则。RESERVEDi( i 为一个整数索引值)表示被保留区域。
外设声明
文件 stm32f10x_map.h 包含了所有外设的声明,下例为 SPI 外设的声明:
#ifndef EXT
#Define EXT extern
#endif
...
#define PERIPH_BASE ((u32)0x40000000)
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
...
/* SPI2 Base Address definition*/
#define SPI2_BASE (APB1PERIPH_BASE + 0x3800)
...
/* SPI2 peripheral declaration*/
#ifndef DEBUG
...
#ifdef _SPI2
#define SPI2 ((SPI_TypeDef *) SPI2_BASE)
#endif /*_SPI2 */
...
#else /* DEBUG */
...
#ifdef _SPI2
EXT SPI_TypeDef *SPI2;
#endif /*_SPI2 */
...
#endif /* DEBUG */
如果用户希望使用外设 SPI,那么必须在文件 stm32f10x_conf.h 中定义_SPI 标签
通过定义标签_SPIn,用户可以访问外设 SPIn 的寄存器。例如,用户必须在文件 stm32f10x_conf.h 中定义。
标签_SPI2,否则是不能访问 SPI2 的寄存器的。在文件stm32f10x_conf.h 中,用户可以按照下例定义标签_SPI 和 _SPIn。
#define _SPI
#define _SPI1
#define _SPI2
每个外设都有若干寄存器专门分配给标志位。我们按照相应的结构定义这些寄存器。标志位的命名,同样遵循上节的外设缩写规范,以 PPP_FLAG_ 开始。对于不同的外设,标志位都被定义在相应的文件stm32f10x_ppp.h 中。
用户想要进入除错( DEBUG)模式的话,必须在文件 stm32f10x_conf.h 中定义标签 DEBUG。
这样会在 SRAM 的外设结构部分创建一个指针。因此我们可以简化除错过程,并且通过转储外设获得来获得所有寄存器的状态。在所有情况下, SPI2都是一个指向外设 SPI2 首地址的指针。
变量 DEBUG 可以仿照下例定义:
#define DEBUG 1
可以初始化 DEBUG 模式与文件 stm32f10x_lib.c 中如下:
#ifdef DEBUG
void debug(void)
{
...
#ifdef _SPI2
SPI2 = (SPI_TypeDef *) SPI2_BASE;
#endif /*_SPI2 */
...
}
#endif /* DEBUG*/
1 当用户选择 DEBUG 模式,宏 assert_param 被扩展,同时运行时间检查功能也在固态函数库代码中被激活。
2 进入 DEBUG 模式会增大代码的尺寸,降低代码的运行效率。因此,我们强烈建议仅仅在除错的时候使用相应代码,在最终的应用程序中,删除它们。