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

这篇具有很好参考价值的文章主要介绍了【STM32】基础知识 第五课 C 语言基础知识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

stdint.h 简介

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

【STM32】基础知识 第五课 C 语言基础知识,stm32,单片机,嵌入式硬件,原力计划

位操作

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

按位与:

num1 运算符 num2 结果
0 & 0 0
1 & 0 0
0 & 1 0
1 & 1 1

按位或:

num1 运算符 num2 结果
0 | 0 0
1 | 0 1
0 | 1 1
1 | 1 1

按位异或:

num1 运算符 num2 结果
0 ^ 0 0
1 ^ 0 1
0 ^ 1 1
1 ^ 1 0

按位取反:

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

左移:

num 运算符 结果
10110011 <<2 11001100
11010010 <<3 10010000
10001010 <<4 10100000

右移:

num 运算符 结果
10110011 >>2 00101100
11010010 >>3 00011010
10001010 >>4 00001000

寄存器位赋值

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】基础知识 第五课 C 语言基础知识,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等语句单独占一行, 一般无论有多少执行语句, 都要用加括号{}

出处: 笔记摘自正点原子文章来源地址https://www.toymoban.com/news/detail-537388.html

到了这里,关于【STM32】基础知识 第五课 C 语言基础知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】基础知识 第二课 初识 STM32

    ARM 公司: 只做内核设计和 IP 授权, 不参与芯片设计. 对比项 Cortex-A (Application) Cortex-R (Real-time) Cortex-M (Microcontroller) 特点 高时钟频率, 长流水线, 高性能 较高时钟频率, 较长的流水线, 实时性强 时钟频率较低, 通常较短的流水线, 超低功耗 应用场景 移动计算, 智能手机, 平板电脑

    2024年02月02日
    浏览(44)
  • stm32中断的基础知识

    某些事件可能需要CPU暂停目前的程序优先处理 实现CPU暂停当前的程序并优先处理某一事件的机制称作中断 处理这一事件的程序叫做中断服务程序(Interrupt Handler) 中断的硬件实现 内部或外部信号产生中断 —程序跳转到某一特定地址(中断向量) —程序从中断向量跳转到对

    2023年04月24日
    浏览(54)
  • STM32 串口基础知识学习

    串行通信:数据逐位按顺序依次传输。 并行通信:数据各位通过多条线同时传输。 对比 传输速率:串行通信较低,并行通信较高。 抗干扰能力:串行通信较强,并行通信较弱。 通信距离:串行通信较长,并行通信较短。 IO资源占用:串行通信较少,并行通信较多。 成本:

    2024年02月15日
    浏览(49)
  • STM32-OTA升级-基于STM32CubeMX+STM32F103(一)基础知识

    0 引言 对于一个项目而言,往往将远程升级作为程序的最后一步(基本所有功能都开发完成之后再考虑)。但是在我看来,我们在写单片机的程序之前,就要规划好FLASH的使用情况,因为code、全局变量等重要信息都是放在FLASH(常说的闪存)中的,SRAM是程序运行时的存放位置

    2024年02月04日
    浏览(56)
  • STM32第五课:对射式红外线传感器计数和旋转编码器计数

    1.1 产品特性          使用ITR9606高灵敏度槽型光耦器件,它由一个红外发光二极管和一个NPN光电三极管组成,槽宽度为5mm。传感器特设M3固定安装孔,调节方向与固定方便易用,使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA。广泛用于电机转速检测,

    2024年02月20日
    浏览(37)
  • STM32 ADC基础知识讲解

    在正式的学习如何编写ADC代码时我们先来学习一下ADC的基础知识部分,只有掌握好了这些基础知识才能顺利的进行后面的代码编写。 ADC 指的是模数转换器(Analog-to-Digital Converter),它是一种用于将模拟信号转换为数字信号的电子设备或电路。 模拟信号是连续变化的信号,可

    2024年02月09日
    浏览(40)
  • 【STM32】基础知识 第十三课 中断

    今天小白我将带领大家详细介绍 STM32 单片机中的中断处理机制, 包括中断的基本概念, 配置和使用方法. 中断在嵌入式系统中扮演着重要角色, 使系统能够快速响应外部事件, 提高系统的实时性和效率. 中断 (Interrupt) 是单片机和其他嵌入式系统中的一种重要机制, 用于在发生特定

    2024年02月17日
    浏览(59)
  • 【STM32】基础知识 第六课 内核 & 架构

    4 个主动单元 + 4 个被动单元 主动单元 被动单元 Cortex M3 内核 DCode 总线 (D-Bus) 内部 FLASH Cortex M3 内核系统总线 (S-Bus) 内部 SRAM 通用 DMA1 FSMC 通用 DMA2 AHB 到 APB 的桥, 它连接的所有 APB 外设 AHB (Advance High-performance Bus): 高级高性能总线 APB (Advance Peripheral Bus): 高级外围总线 ICode 总线

    2023年04月24日
    浏览(67)
  • 【STM32】基础知识 第十课 CubeMx

    CubeMX (全称 STM32CubeMX) 是 ST 公司推出的一款用于 STM32 微控制器配置的图形化工具. 它能帮助开发者通过直观的图像界面快速完成 STM32 微控制器的硬件配置, 外设初始化以及中间件设置等工作. 通过 CubeMX, 开发者可以大幅提高开发效率, 降低开发难度, 尤其是对于刚接触 STM32 的新

    2024年02月05日
    浏览(52)
  • 【STM32标准库】【基础知识】程序烧录

    文章基于适用于STM32F4系列,作者使用STM32F401CCU6开发板。 本文章基于此系列和开发板展开讨论。 我使用的开发板是某宝购买的,型号是STM32F401CCU6 请点这里 烧录器为同家店铺制作的STLINK-V2 请点这里 开发板外观 烧录器外观 请去官网下载,传送门 全部默认安装即可,注意选择

    2024年02月09日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包