STM32学习笔记0.0 STM32的C语言基础

初学者学习总结,如有错误,请大神指正


一、位操作

运算符含义作用例示

~

按位取反1变0、0变1

~(0001 1100)

结果为

(1110 0011)

&按位与相应位都为1,结果为1,否则结果为0(1001 1001) & 
(0011 1100)
结果为
(0001 1000)
|按位或相应位有1,结果为1,否则结果为0(1001 1001) | 
(0111 0010)
结果为
(1111 1011)
^按位异或相应位相同,结果为1,否则结果为0

(1100 0001) ^

(0101 1011)
结果为
(1001 1010)

<<左移向左移动n位,右边空出位补0

(1000 0110)<<2

结果为

(0001 1000)

>>右移向右移动n位,左边空出位补0

(00010000) >>3

结果为

(0000 0010)

在单片机开发中的技巧

(1)不改变其他位的值的状况下,对某几个位进行设值。

是先对需要设置的位用&操作符进行清零操作, 然后用|操作符设值。

比如改变 GPIOA 的状态,可以先对寄存器的值进行&清零操作

GPIOA->CRL&=0XFFFFFF0F; //将第 4-7 位清 0

然后再与需要设置的值进行|或运算

GPIOA->CRL|=0X00000040; //设置相应位的值,不改变其他位的值

二、宏定义

define 是 C 语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供 方便。常见的格式: #define 标识符 字符串 “标识符”为所定义的宏名。

“字符串”可以是常数、表达式、格式串等。

例如:

#define SYSCLK_FREQ_72MHz 72000000

定义标识符 SYSCLK_FREQ_72MHz 的值为 72000000。

三、条件编译

例如

文件为   led.h

#ifndef __LED_H     //如果没编译过这个文件 
#define __LED_H     //编译这个文件 

void LED_Init (void);

#endif

//保证在多个.c文件同时引用时不重复,默认所有头文件都添加,保证在多个.C文件同时引用时不重复,默认所有头文件都添加

四、extern 变量申明

C 语言中 extern 可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编 译器遇到此变量和函数时在其他模块中寻找其定义。

这里面要注意,对于 extern 申明变量可以多 次,但定义只有一次。

例如

在 main.c 定义的全局变量 id,id 的初始化都是在 main.c 里面进行的。

main.c 文件中

u8 id;//定义只允许一次
main()
{
id=1;
printf("d%",id);//id=1
test();
printf("d%",id);//id=2
}

若要在text.c中使用变量id 就需要在test.c 里面去申明变量 id 是外部定义,否则变量 id 的作用域到不了 test.c 文件中。

text.c文件中

extern u8 id;//申明变量 id 是在外部定义的,申明可以在很多个文件中进行
void test(void)
{
id=2;
}

五、typedef 类型别名

typedef 用于为现有类型创建一个新的名字,或称为类型别名,用来简化变量的定义。

例如

typedef unsigned char u8  //把unsigned char 类型取别名为u8

在 MDK 中常用于定义结构体的类型别名。

例如

通常我们这样定义结构体,MDK 中有很多这样的结构体变量需要定义就显得很繁琐

struct _GPIO
{
 __IO uint32_t CRL;
 __IO uint32_t CRH;
 …
}GPIOA;

struct _GPIO
{
 __IO uint32_t CRL;
 __IO uint32_t CRH;
 …
}GPIOB;

…

在利用typedef 类型别名后,我们可以化简

typedef struct
{
 __IO uint32_t CRL;
 __IO uint32_t CRH;
…
} GPIO_TypeDef;


GPIO_TypeDef GPIOA,GPIOB;

六、结构体

声明结构体类型:

Struct 结构体名
{
成员列表;
}变量名列表;

例如

Struct U_TYPE 
{
Int BaudRate
Int WordLength; 
}usart1,usart2;   //申明之后定义变量




Struct U_TYPE usart1,usart2
{
Int BaudRate
Int WordLength; 
};                //申明时定义变量

结构体成员变量的引用方法:

结构体变量名字.成员名

例如

usart1.BaudRate;  //引用 usart1 的成员 BaudRate

结构体指针变量定义

struct U_TYPE *usart3;//定义结构体指针变量 usart1;



Usart3->BaudRate;      //访问 usart3 结构体指针指向的结构体的成员变量 BaudRate

七、static关键字

例如

int a
{
    static int =0;//在函数调用完成后,记住变量调用后的函数值
    
    n++;
    return n;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值