单⽚机常⽤关键字1、extern
提升变量或者函数逼格
使他们可以跨⽂件被访问
2、define 宏定义
#define 标识符 字符串
#define SYSCLK_FREQ_72MHz 7200000
意思是变量SYSCLK_FREQ_72MHz替换为7200000
3、ifdef 条件编译
#ifdef 标识符
程序段1
#else
程序段2
#endif
意思是判断标识符对则是程序段1的变量,不对则是程序段2的变量
4、typedef 类型别名
可以⽤做声明指针型变量的多个对象
typedef uint32_t u32;//uint32_t改名u32
typedef 在 MDK ⽤得最多的就是定义结构体的类型别名和枚举类型了
在stm32f10X_gpio.h中
typedef struct
{
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
结构体变量定义了gpio⼝的引脚、速度、模式
parameter是什么意思啊led.c中初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB,PE端⼝时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端⼝时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端⼝配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO⼝速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_1); //PB.5 输出⾼
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端⼝配置, 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出,IO⼝速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_2); //PE.5 输出⾼
}
GPIO_InitTypeDef GPIO_InitStructure;//将GPIO_Init更改名称为GPIO_InitStructure
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//GPIO_InitStructure.GPIO_Pin中的.代表结构体中的变量有后⾯的GPIO_Pin,然后定义这个引脚是五号引脚
stm32f10X_gpio.c中初始化gpio,根据寄存器地址进⾏编译,最后通过设置结构体设置参数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
uint32_t tmpreg = 0x00, pinmask = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
/*---------------------------- GPIO Mode Configuration -----------------------*/
currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
{
/* Check the parameters */
assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
/* Output mode */
currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
}
/*---------------------------- GPIO CRL Configuration ------------------------*/
/* Configure the eight low port pins */
if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)
{
tmpreg = GPIOx->CRL;
for (pinpos = 0x00; pinpos < 0x08; pinpos++)
{
pos = ((uint32_t)0x01) << pinpos;
/* Get the port pins position */
currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
if (currentpin == pos)
{
pos = pinpos << 2;
/
* Clear the corresponding low control register bits */
pinmask = ((uint32_t)0x0F) << pos;
tmpreg &= ~pinmask;
/* Write the mode configuration in the corresponding bits */
tmpreg |= (currentmode << pos);
/* Reset the corresponding ODR bit */
/* Reset the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
{
GPIOx->BRR = (((uint32_t)0x01) << pinpos);
}
else
{
/* Set the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
{
GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
}
}
}
}
GPIOx->CRL = tmpreg;
}
/*---------------------------- GPIO CRH Configuration ------------------------*/
/* Configure the eight high port pins */
if (GPIO_InitStruct->GPIO_Pin > 0x00FF)
{
tmpreg = GPIOx->CRH;
for (pinpos = 0x00; pinpos < 0x08; pinpos++)
{
pos = (((uint32_t)0x01) << (pinpos + 0x08));
/* Get the port pins position */
currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);
if (currentpin == pos)
{
pos = pinpos << 2;
/* Clear the corresponding high control register bits */
pinmask = ((uint32_t)0x0F) << pos;
tmpreg &= ~pinmask;
/* Write the mode configuration in the corresponding bits */
tmpreg |= (currentmode << pos);
/* Reset the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
{
GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));
}
/* Set the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
{
GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));
}
}
}
GPIOx->CRH = tmpreg;
}
}
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
设置引脚为GPIOB,并将结构体GPIO_InitStructure指针变量的内容带⼊到函数中
5、static ⽂件内部使⽤,只能在本.c⽂件中使⽤,它在函数调⽤后,不会被释放,他的值会⼀直保留下来,有记忆功能
int getValue(void)
{
static int flag=0;
flag++;
return flag;
}
返回flag值为1,2,3.
6、结构体:构造类型
typedef struct 结构体名{
成员列表1;
成员列表2;
}变量名列表;
在结构体声明时可以定义变量,也可以申明之后定义:
struct 结构体名字 结构体变量列表;
①作⽤:同⼀类型可以⽤数组,不同类型可以⽤结构体组织
②结构体成员引⽤⽅法:结构体成员名字.成员名
例:struct U_TYPE{
Int BaudRate;
Int WordLength;
}usart1,usart2;
引⽤usart1成员BaudRate的⽅法:usart1.BaudRate
指针变量定义sturct U_TYRE *usart1;
访问usart1结构体指针指向变量BaudRate⽅法:usart1->BaudRate 如需添加变量,只需要在成员列表⾥更改就可以了,⽅便修改程序
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论