stm32学习的一点笔记很乱不具有参考价值,仅作为知识点

volatile 易变化的变量声明,

volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)

typedef 用于声明新的关键字(做变量声明用的)。

 查找了CSDN社区的C/C++板块的内容

typedef介绍_liitdar的博客-CSDN博客_typedef本文介绍typedef的用法。1. 概述typedef为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。typedef本身是一种存储类的关键字,与auto、extern、static、register等关键字不能出现在同一个表达式中。2. 作用及用法2.1 typedef的用法使用...https://blog.csdn.net/liitdar/article/details/80069638?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164177607816780366537637%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164177607816780366537637&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-80069638.first_rank_v2_pc_rank_v29&utm_term=typedef+&spm=1018.2226.3001.4187

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();
        
        }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值