STM32常用C语言基础 您所在的位置:网站首页 c语言的常用关键字 STM32常用C语言基础

STM32常用C语言基础

2024-06-28 18:15| 来源: 网络整理| 查看: 265

STM32中一些常用的c语言知识(视频+资料等的总结) 1.位操作

位操作与位带操作并不相同,位操作就是对一个变量的每一位做运算,而逻辑位操作是对这个变量整体进行运算。 下面是六种常用的操作运算符:

运算符含义运算符含义&按位与~取反竖线按位或右移

表格中的按位或符号是" | "

#include //1、按位取反 ~ void test01() { int num = 7; printf("~num = %d\n", ~num);//-8 // 0111 按位取反 1000 机器中存放的都是补码 补码转换原码需要分有符号数和无符号数两种 } //2、按位与 void test02() { int num = 128; if ( (num & 1) == 0) //换算为八位,1换算就是00000001, 这样只要所给数字的二进制最后一位是1.那么就是奇数,否则就是偶数 { printf("num为偶数\n"); } else { printf("num为奇数\n"); } } //3、按位或 | void test03() { //按位异或的意思是,两个数字相同为0,不同为1。我们可以利用按位异或实现两个数的交换 num01 = 1; // 0001 num02 = 4; // 0100 printf("num01 ^ num02 = %d", num01 ^ num02); // 5 两个二进制按位异或之后是: 0101 printf("交换前\n"); printf("num01 = %d\n", num1); printf("num02 = %d\n", num2); num01 = num01 ^ num02; num02 = num01 ^ num02; num01 = num01 ^ num02; //不用临时数字实现两个变量交换 printf("交换后\n"); printf("num01 = %d\n", num1); printf("num02 = %d\n", num2); } //左移运算符 void test05() { int num = 6; printf("%d\n", num test01(); test02(); test03(); test05(); test06(); return 0; }

上面是用普通c代码举得栗子,下面我们看一下STM32中操作通常用的代码: (1)比如我要改变 GPIOA-> BSRRL 的状态,可以先对寄存器的值进行& 清零操作

GPIOA-> BSRRL &= 0xFF0F; //将第4位到第7位清零(注意编号是从0开始的)

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

GPIOA-> BSRRL |= 0x0040; //将第4位到第7位设置为我们需要的数字

(2)通过位移操作提高代码的可读性:

GPIOx->ODR = (((uint32_t)0x01) SR = (uint16_t)~TIM_FLAG;

而 TIM_FLAG 是通过宏定义定义的值:

#define TIM_FLAG_Update ((uint16_t)0x0001) #define TIM_FLAG_CC1 ((uint16_t)0x0002) 2.define宏定义

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

#define 标识符 字符串

标识符意思是所定义的宏名,字符串可以是常数、表达式或者格式串等,例如:

#define PLL_Q 7 //注意,这个定义语句的最后不需要加分号 3.ifdef条件编译

在程序开发的过程中,经常会用到这种条件编译:

#ifdef PLL_Q 程序段1 #else 程序段2 #endif

上面这段代码作用就是当这个标识符已经被定义过,那么就进行程序程序段1,如果没有则进行程序段2。当然,和我们设计普通的c代码是一样的,"#else"也可以没有,就是上面的代码减去"#else"和程序段2。

#ifndef PLL_Q //意思就是如果没有定义这个标识符 4. extern变量申明

C 语言中 extern 可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义(一个变量只能定义一次,而extern可以申明很多次)使用例子如下:

extern u16 USART_RX_STA;

上面例子意思就是申明 “USART_RX_STA” 这个变量在其他文件中已经定义了,"u16"的意思是16位的。

5.结构体

定义一个结构体的一般形式为:

struct 结构名 { 成员列表 };

成员列表由若干个成员组成,每个成员都是该结构体的一个组成部分。对每个成员也必须作类型说明,其形式:

类型说明符 成员名; //比如: int num;

结合上面的说明,我们可以构建一个简单的结构体例子:

struct sutdent { int num; char name[20]; //20个字节长的字符 char sex; int age; float score; char addr[30]; //30个字节长的字符 }

而如果我们想定义结构体变量,那么我们在定义这个结构体的时候直接定义,或者定义完结构体再另外定义结构体变量,比如:

struct sutdent { int num; char name[20]; //20个字节长的字符 char sex; int age; float score; char addr[30]; //30个字节长的字符 }student01,student02; //变量名表列(如果由结构体变量名,那么我们可以不写结构体名称)

有时候我们可能需要用到结构体的嵌套,比如:

struct date { int year, month,day; }; struct sutdent { int num; char name[20]; //20个字节长的字符 char sex; struct date birthday; //这里就用到了结构体的嵌套 int age; float score; char addr[30]; //30个字节长的字符 }student01,student02; //变量名表列(如果由结构体变量名,那么我们可以不写结构体名称)

如果需要引用结构体里面的成员内容,可以使用下面的方式:

student01.name = 小李; // 结构体变量名.成员名(注意这里用的是点),这里是对这个成员的赋值

结构指针变量说明的一般形式为:

struct 结构名 *结构指针变量名

假如说我们想定义一个指向结构体"student"的指针变量pstu,那么我们可以使用如下代码:

struct student *pstu;

如果我们要给一个结构体指针变量赋初值,那么我们可以使用如下的方式:

struct student { char name[66]; int num; char sex; }stu; pstu = &stu;

注意上边的赋值方式,我们如果要进行赋值,那必须使用结构体变量,而不能使用结构体名,像下边这样就是错误的

struct student { char name[66]; int num; char sex; }stu; pstu = &student;

这是因为结构名和结构体变量是两个不同的概念,结构名只能表示一个结构形式,编译系统并不会给它分配内存空间(就是说不会给它分配地址),而结构体变量作为一个变量,编译系统会给它分配一个内存空间来存储。 访问结构体成员的一般形式:

(*pstu).name; //(1)(*结构指针变量).成员名; pstu->name; //(2)结构指针变量->成员名

结构体的知识就简单说上边这些。

6.typedef类型别名

typedef用来为现有类型创建一个新的名字,或者称为类型别名,用来简化变量的定义(上边extern变量申明的例子中,"u16"就是对"uint16_t"类型名称的简化)。typedef在MDK中用得最多的就是定义结构体的类型别名和枚举类型。 我们定义一个结构体GPIO:

struct _GPIO { _IO uint32_t MODER; _IO uint32_tOTYPER; ... };

定义这样一个结构体以后,如果我们想定义一个结构体变量比如"GPIOA",那么我们需要使用这样的代码:

struct _GPIO GPIOA;

虽然也可以达到我们的目的,但是这样会比较麻烦,而且在MDK中会有很多地方用到,所以,我们可以使用"typedef"为其定义一个别名,这样直接通过这个别名就可以定义结构体变量,来达到我们的目的:

typedef struct { _IO uint32_t MODER; _IO uint32_t OTYPER; }GPIO_typedef;

这样定义完成之后,如果我们需要定义结构体变量,那么我们只需要这样:

GPIO_typedef_GPIOA,_GPIOB;

上边这些是stm32里面"typedef"常用的一些功能。因为这里要介绍的c语言中的一个关键字"static"的功能等稍微少了点,我就将它放在了这里: static申明的是局部变量,存放在静态存储区。在函数调用这个变量并执行结束的时候,它并不会被释放,而是会停留在函数执行完的状态(在按键输入实验中有用到)。 侵删。。。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有