volatile 易变化的变量声明,
volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)
typedef 用于声明新的关键字(做变量声明用的)。
查找了CSDN社区的C/C++板块的内容
struct关键字
下图是将GPIO一类的结构体,用typedef新定义为关键字
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;
这是电点亮一个led灯的在主函数里面的代码
#include "stm32f10x.h"
#include "led.h"
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
int main()
{
LED_Init();
while(1)
{
GPIO_ResetBits(LED_PORT,GPIO_Pin_0);//点亮D1
}
}
LED_Init();
#include "led.h"
/*******************************************************************************
* 函 数 名 : LED_Init
* 函数功能 : LED初始化函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;//定义了一个叫GPIO_InitStructure的结构体,该结构体的数据组成可以通过go to defination功能跳转
RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE);
GPIO_InitStructure.GPIO_Pin=LED_PIN; //让GPIO_InitStructure.GPIO_Pin为 uint16_t
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
/设置推挽输出模式GPIO_InitStructure.GPIO_Mode枚举结构体*/
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(LED_PORT,&GPIO_InitStructure); /* 初始化GPIO */
GPIO_SetBits(LED_PORT,LED_PIN); //将LED端口拉高,熄灭所有LED
}
->
“->”是一个整体,它是用于指向结构体子数据的指针,用来取子数据。
换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”。
举个栗子:
问题中的p=p->a,意思是将p指向的一个结构体实例中的自数据a赋值给p.
首先定义一个结构体:
struct Fruit{
int Apple,Banana,Orange;
}
struct Fruit * p; //定义结构体指针
struct Fruit Number={1,1,2}; //声明一个变量Number,表示水果的数量
int x; //声明一个变量
p = &Number; // 让P指向Number (&为取地址符号)
x = p->Apple; //去除P所指向的结构体中包含的数据项Apple赋值给x
x = Number.Apple; //和上面表达的意思是一样的
————————————————
版权声明:本文为CSDN博主「Wildcraner」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46195203/article/details/109402076
断言函数
assert_param()
STM32 中的 assert_param 函数_chuckfql的专栏-CSDN博客_assert_param函数
STM32的函数ssert_param(IS_GPIO_ALL_PERIPH(GPIOx));_li375669512的专栏-CSDN博客
复位函数,就是操作寄存器BRR等于相应的十六进制数GPIO_Pin,
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters 断言函数检查参数合理性*/
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
//操作了寄存器BRR所以会改变输出管脚的电平
GPIOx->BRR = GPIO_Pin;
}
意思是这里的BRR要是十六进制数,让寄存器可以识别的十六进制数。
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */
下载重复
Overlapping of Algorithms at Address 08000000H
STM32下载错误:Overlapping of Algorithms at Address 08000000H错误_花茶的博客-CSDN博客
IIC
/**********************************************
// IIC Write byte****用于实现一个字节的发送
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)//
{
unsigned char i;
unsigned char m,da;
da=IIC_Byte;
OLED_SCLK_Clr();//SCLK_CLR(),作为初始的信号
for(i=0;i<8;i++)
{
m=da;
// OLED_SCLK_Clr();
m=m&0x80;
if(m==0x80)
{OLED_SDIN_Set();}
else OLED_SDIN_Clr();
da=da<<1;
OLED_SCLK_Set();
OLED_SCLK_Clr();
}
}