【STM32】基础知识 第五课 C 语言基础知识

news/2024/7/3 0:02:57

【STM32】基础知识 第五课 C 语言基础知识

  • stdint.h 简介
  • 位操作
    • 寄存器位赋值
  • 宏定义
    • 带参数的宏定义
    • 条件编译
    • 头文件编译
    • 代码条件编译
    • extern 声明
  • 类别名 (typedef)
    • 结构体
  • 指针
    • 指针使用的常见问题
    • 代码规范

stdint.h 简介

stdint.h 是从 C99 中引进的一个标准 C 库的文件. 路径: “D:\MDK5.34\ARM\ARMCC\include”

STM32 C 语言基础

位操作

运算符含义运算符含义
&按位与~按位取反
|按位或<<左移
^按位异或>>右移

按位与:

num1运算符num2结果
0&00
1&00
0&10
1&11

按位或:

num1运算符num2结果
0|00
1|01
0|11
1|11

按位异或:

num1运算符num2结果
0^00
1^01
0^11
1^10

按位取反:

num运算符结果
1001~0110
1100~0011
1010~0101
1111~0000

左移:

num运算符结果
10110011<<211001100
11010010<<310010000
10001010<<410100000

右移:

num运算符结果
10110011>>200101100
11010010>>300011010
10001010>>400001000

寄存器位赋值

uint32_t temp = 0;

给位 6 赋值为 0:

  1. temp &= 0xFFFFFFBF;
  2. temp &= ~(1<<6);

给位 6 赋值位 0:

  1. temp |= 0x00000010;
  2. temp |= 1>>6;

按位异或翻转位 6:

  1. temp ^= 0x00000010;
  2. temp ^=1<<6;

宏定义

宏定义可以: 提高效率, 可读性, 易改性, 核心是替换.

格式:

#define 标识符 字符串
  • 标识符: 宏定义的名字
  • 字符串: 常数, 表达式, 格式串等

例子:

#define PI 3.1415926
#define HSE_VALUE 8000000U

带参数的宏定义

#define LED1(x) do{ x?\
	HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET):\
	HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET);\
	}while(0)

建议大家使用 do{…}while(0) 来构造宏定义, 这样不会受到大括号, 分号, 运算符优先级等的影响, 总是会按照你期望的方式调用运行.

例子:

// 定义
#define foo(x) bar(x); baz(x)

// 调用
foo(wolf);

// 宏扩展为
bar(wolf); baz(wolf); 

条件编译

让编译器只对满足条件的代码进行编译, 不满足条件的不参与编译!

指令作用
#if编译预处理条件指令, 类似 if
#ifdef判断某个宏是否已被定义
#ifndef判断某个宏是否未被定义
#elif若前面的条件不满足, 则判定新的条件, 类似 else if
#else若前面的件不满足, 则执行后面的语句, 类似 else
#endif#if, #ifdef, #ifndef的结束标志

头文件编译

#ifndef _LED_H
#define _LED_H
#include "./SYSTEM/sys/sys.h"
code
#endif

代码条件编译

#if SYS_SUPPORT_OS
	code
#endif

extern 声明

放在函数 / 变量前, 表示此函数 / 变量在其他文件定义, 以便文件引用.

extern unit16_tg_usart_rx_sta;
extern void delay_us(unit32_t nus);

类别名 (typedef)

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

格式:

typedef 现有类型 新名字

例子:

typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;

类型别名应用:

Struct GPIO_TypeDef
{
	_IO uint32_t CRL;
	_IO uint32_t CRH;
	...
};
Struct GPIO_TypeDef gpiox
typedef struct
{
	__IO uint32_t CRL;
	__IO uint32_t CRH;
	...
}GPIO_TypeDef;
GPIO_TypeDef gpiox

结构体

由若干基本数据类型集合组成的一种自定义数据类型, 也叫聚合类型.

格式:

struct 结构体名
{
	成员列表;
}变量名列表(可选);

例子:

struct student
{
	char *name;  // 姓名
	int num;  // 学号
	int age;  // 年龄
	char group;  // 所在学习小组
	float score;  // 成绩
};

创建学生变量:

struct student student;
student.name = "我是小白呀";
student.num = 1;
student.age = 18;
student.group = "A";
student.score  = 99;

应用举例 (ST 源码, 使用类型别名)

typedef struct
{
	uint32_t Pin;  // 引脚号
	uint32_t Mode;  // 工作模式
	uint32_t Pull;  // 上下拉
	uint32_t Speed;  // IO 速度
}GPIO_InitTypeDef;

指针

指针就是内存的地址, 指针变量是保存了指针的变量.

格式:

类型名 *指针变量名

例子:

char *p_str = "This is a test";
  • *p_str: 取 p_str 变量的值
  • &p_str: 取 p_str 变量的地址

STM32 指针

指针使用的常见问题

  1. 未分配内存就使用 (野指针)
  2. 越界使用

错误用法1 (未分配内存):

char *p_buf;
p_buf[0] = 100;
p_buf[1] = 200;
p_buf[2] = 300;

错误用法2 (越界使用):

uint9_t buf[5] = {1, 2, 3, 4, 5};
uint8_t *p_buf = buf;
p_buf[5] = 200;
p_buf[6] = 250;

代码规范

  1. 所有函数/变量名字非特殊情况, 一般使用小写字母
  2. 注释风格使用 doxgen 风格, 除屏蔽外, 一律使用/* */方式进行注释
  3. TAP 键同意使用 4 个空格对其, 不使用默认的方式进行对齐
  4. 每两个函数之间, 一般有且只有一个空行
  5. 相对独立的程序块之间, 使用一个空行隔开
  6. 全局变量命一般用g_开头, 全局指针命名一般用p_开头
  7. if, for, while, do, case, switch, default等语句单独占一行, 一般无论有多少执行语句, 都要用加括号{}

出处: 笔记摘自正点原子


http://lihuaxi.xjx100.cn/news/1052855.html

相关文章

前向传播的简单介绍,并给出代码实例

文章目录 前向传播的介绍前向传播的基本概念前向传播的步骤实例代码示例一代码示例二定义模型定义损失函数定义优化器执行前向传播 总结 前向传播的介绍 前向传播是神经网络中的一种基本操作&#xff0c;其作用是将输入数据通过网络中的权重和偏置计算&#xff0c;最终得到输出…

编程能力提升:15个步骤助你成为顶尖程序员

目录 1. 学习新的编程语言2. 熟悉代码规范和最佳实践3. 参加开源项目4. 阅读高质量的代码5. 掌握设计模式6. 使用工具和框架7. 学习软件工程知识8. 不断实践和练习9. 参加技术交流和分享10. 注重自我反思和改进11. 熟悉数据结构和算法12. 学习代码调试和优化13. 关注安全和性能…

从广交会,看懂海尔智家逆势增长的秘密

中国企业的全球化战略应从何处、以何种方式推进&#xff1f;作为行业全球化最彻底的企业&#xff0c;海尔智家是个很好的参考。 4月15日&#xff0c;在第133届中国进出口贸易交易会&#xff08;以下简称“广交会”&#xff09;上&#xff0c;海尔智家展示了其扎根本土&#xf…

unity,物理材质2d

介绍 2D物理材质(Physics Material 2D)是Unity中用于设置2D游戏对象的物理特性的一种方式。2D物理材质可以控制2D游戏对象的摩擦力、弹性系数等物理属性&#xff0c;从而影响其在物理引擎中的运动行为。以下是2D物理材质的详细介绍&#xff1a; 方法 摩擦力 2D物理材质的主要…

1.龙芯ls2k pmon调试

文章目录 前言1. 准备材料2. pmon源码下载3. 交叉编译工具链配置4. 配置交叉编译环境结尾 前言 本文为龙芯2k1000芯片(MIPS架构)pmon的调试记录&#xff0c;通过本博文将顺利编译出可以烧录到主板的pmon文件&#xff0c;烧录后主板将运行pmon&#xff0c;并从调试串口打印日志…

理解websocket连接的原理

背景 Websocket是一个持久化的协议&#xff0c;相对于HTTP这种非持久的无状态协议来说 一、问题 http long poll&#xff0c;或者ajax轮询都可以实现实时信息传递&#xff0c;为什么还需要websocket&#xff1f; 二、理解 ajax轮询&#xff1a;浏览器隔个几秒就发送一次请求&am…

Android studio Activity启动模式

1.四种启动模式&#xff1a; 1&#xff09;.standard&#xff08;标准模式&#xff09; 特点&#xff1a;1.Activity的默认启动模式 2.每启动一个Activity就会在栈顶创建一个新的实例。例如&#xff1a;闹钟程序 缺点&#xff1a;当Activity已经位于栈顶时…

ASEMI代理ADCMP600BKSZ-REEL7原装ADI车规级ADCMP600BKSZ-REEL7

编辑&#xff1a;ll ASEMI代理ADCMP600BKSZ-REEL7原装ADI车规级ADCMP600BKSZ-REEL7 型号&#xff1a;ADCMP600BKSZ-REEL7 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;SC-70-5 批号&#xff1a;2023 引脚数量&#xff1a;5 工作温度&#xff1a;-40C~125C 安装类型&am…