STM32常用C语言知识总结

目录

一、引言

二、C 语言基础

1.数据类型

2.变量与常量

3.控制结构

4.数组与指针

 5.字符串

6. extern变量声明

7.内存管理 

三、STM32 中的 C 语言特性

1.位操作

2.寄存器操作


一、引言

STM32 作为一款广泛应用的微控制器,其开发离不开 C 语言的支持。C 语言凭借其高效、灵活和可移植性,成为了嵌入式系统开发的首选语言。本文将对 STM32 开发中涉及的 C 语言知识点进行详细总结,帮助大家更好地掌握 STM32 的开发。

二、C 语言基础

1.数据类型

基本数据类型:包括整型(intshortlong)、浮点型(floatdouble)、字符型(char)等。

stdint.h中的类型:在STM32开发中,经常使用stdint.h头文件中的类型定义,如int8_tuint16_tint32_t等,以确保数据类型的跨平台一致性。

派生数据类型:指针(*)、数组([])、结构体(struct)、共用体(union)等。

示例:

    int num = 10;float pi = 3.14;char ch = 'A';int8_t=10;struct Point {int x;int y;};union Data {int i;float f;};

 

2.变量与常量

  • 变量的定义和初始化:变量在使用前必须先定义,并可以在定义时进行初始化。
  • 常量的定义:使用#define宏定义或const关键字定义常量。

    示例:

    int a = 5;  // 定义并初始化变量#define PI 3.14  // 宏定义常量const float E = 2.718;  // 使用 const 定义常量

3.控制结构

  • 顺序结构:程序按照语句的书写顺序依次执行。
  • 选择结构:包括if-else语句和switch-case语句。
  • 循环结构:for循环、while循环和do-while循环。

  示例:

 int num = 10;if (num > 5) {printf("Num is greater than 5\n");} else {printf("Num is less than or equal to 5\n");}int choice = 2;switch (choice) {case 1:printf("Choice is 1\n");break;case 2:printf("Choice is 2\n");break;default:printf("Invalid choice\n");break;}for (int i = 0; i < 5; i++) {printf("%d ", i);}

4.数组与指针

  • 数组的定义、初始化和访问:数组是一组相同类型元素的集合。
  • 指针的概念和操作:指针是一个变量,其值为另一个变量的地址。

指针与数组的关系: 

数组名在很多情况下会被当作指向数组首元素的指针来使用。例如,当将数组名传递给函数时,实际上传递的是一个指向数组首元素的指针。

通过指针的算术运算,可以实现类似数组下标的操作来访问数组元素。例如,如果有一个指针 p 指向一个数组的首元素,那么 p + i 就指向了数组的第 i 个元素。

  示例:

#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int *ptr = arr;  // 此时数组名相当于指向首元素的指针printf("%d\n", arr[0]);  // 通过数组下标访问printf("%d\n", *(ptr + 0));  // 通过指针的算术运算访问ptr = &arr[2];  // 指针可以改变指向printf("%d\n", *ptr);  // 输出 3// 不能修改数组名的指向// arr = &arr[1];  // 这是错误的return 0;
}素

 5.字符串

  • 字符串的表示:使用字符数组或字符指针。
  • 字符串操作函数:如strcpystrcatstrcmp等。

示例:

    char str1[] = "Hello";char *str2 = "World";strcpy(str1, str2);  // 复制字符串

6. extern变量声明

extern 声明只是告诉编译器该变量在其他地方已经定义,并不为变量分配内存空间,通常用于在多个源文件之间共享全局变量。

示例:

假设有两个源文件 file1.c 和 file2.c 。

在 file1.c 中定义一个全局变量:

int global_variable = 10;  // 定义并初始化全局变量

在 file2.c 中使用 extern 声明来访问这个全局变量: 

extern int global_variable;  // 声明该变量在其他文件中已定义int main() {printf("%d\n", global_variable);  // 可以使用该全局变量return 0;
}

这样,在 file2.c 中就可以通过 extern 声明来使用在 file1.c 中定义的全局变量 global_variable 。

需要注意的是,使用 extern 声明变量时,要确保在其他地方确实有该变量的定义,否则会导致链接错误。

7.内存管理 

mallocmemset 和 free 是三个常用的库函数,用于动态内存管理。

(1) malloc 函数:

malloc 函数用于在堆上动态分配内存。它的函数原型为:

void *malloc(size_t size);

size 参数指定要分配的字节数。malloc 函数返回一个指向分配的内存块的指针,如果分配失败则返回 NULL 。

   示例:

int *ptr = (int *)malloc(sizeof(int) * 10);  // 分配 10 个整数大小的内存

 

 (2)memset 函数:

memset 函数用于将一段内存空间设置为指定的值。它的函数原型为:

void *memset(void *str, int c, size_t n);

 str 是要设置的内存块的指针,c 是要设置的值(以 int 形式传递,实际设置时会转换为 unsigned char 类型),n 是要设置的字节数。

   示例:

memset(ptr, 0, sizeof(int) * 10);  // 将之前分配的内存初始化为 0

 

(3)free 函数:

free 函数用于释放之前由 malloc 等函数分配的内存。它的函数原型为:

void free(void *ptr);

ptr 是要释放的内存块的指针。

   示例:

free(ptr);  // 释放之前分配的内存

 

 

三、STM32 中的 C 语言特性

1.位操作

  • 位域:用于定义结构体中的位变量。
  • 位运算:与(&)、或(|)、异或(^)、取反(~)、左移(<<)、右移(>>)。

 示例:

    struct Flags {unsigned int flag1 : 1;unsigned int flag2 : 1;};unsigned int num = 5;num = num << 2;  // 左移操作

2.寄存器操作

  • 直接访问寄存器:通过指针或宏定义来访问寄存器地址。
  • 寄存器位操作:使用位掩码和位运算进行寄存器位的设置和清除。

 volatile 关键字用于修饰可能被意外修改的变量,数据每次从内存中直接读取,不会被编译器优化导致数据不同步的问题。

  示例:

 #define GPIOA_BASE  (0x40020000UL)#define GPIOA_MODER  (*((volatile unsigned int *)(GPIOA_BASE + 0x00)))GPIOA_MODER |= (1 << 10);  // 设置 GPIOA 引脚 5 的模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/416448.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若依系统的学习

若依环境 介绍 ‌若依是一款快速开发平台(低代码)&#xff0c;用于快速构建企业级后台管理系统&#xff0c;它提供了许多常用的功能模块和组件&#xff0c;包括权限管理、代码生成、工作流、消息中心等 官方地址: https://www.ruoyi.vip/ ‌基于Spring Boot和Spring Cloud‌…

vue axios发送post请求跨域解决

跨越解决有两种方案&#xff0c;后端解决&#xff0c;前端解决。后端解决参考Django跨域解决-CSDN博客 该方法之前试着可以的&#xff0c;但是复制到其他电脑上报错&#xff0c;所以改用前端解决 1、main.js做增加如下配置 import axios from axios Vue.prototype.$axios a…

入门数据结构JAVA DS——如何实现简易的单链表(用JAVA实现)

前言 链表&#xff08;Linked List&#xff09;是一种线性数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含两个部分&#xff1a;存储数据的部分和指向下一个节点的指针&#xff08;或引用&#xff09;。链表的结构使得它能够动态地增长和收缩&#xff0c;适合…

【c++】常量周边之const应用:常变量

【c】常量周边&#xff1a;常量概念及定义 承接上文&#xff0c;我们学习了常量的基础知识&#xff0c;在此基础上&#xff0c;本篇文章对于宏定义 #define 和常量 const进行深入学习。 目录 #define 预处理器 const:在常量方面应用 使用技巧 const与指针的结合 const 与 …

我的电脑/资源管理器里无法显示新硬盘?

前情提要 我新&#xff01;买了一个京东京造的SATA3硬盘&#xff0c;一个绿联的SATA3转USB读取 现在我的电脑里只能显示我本地的C盘和D盘&#xff0c;不能显示这个接入的SATA盘。 系统环境&#xff1a;windows11 问题描述 在我的电脑里&#xff0c;只能看到我原本的C和D&…

民宿酒店预订系统V1.0.8

多门店民宿酒店预订管理系统&#xff0c;快速部署属于自己民宿酒店的预订小程序&#xff0c;包含预订、退房、WIFI连接、吐槽、周边信息等功能。提供全部无加密源代码&#xff0c;支持私有化部署。 V1.0.8修复房间预订状态无法筛选的问题 修复房间预订状态无法筛选的问题 修复…

QtAV在windows下编译

官方编译参考 一、源代码下载 git执行操作&#xff1a; git clone https://github.com/wang-bin/QtAV.git cd QtAV && git submodule update --init二、依赖文件下载(ffmpeg) ffmpeg下载 下载完成后&#xff0c;拷贝到QtAV源代码目录&#xff0c;修改根目录名为ff…

MATLAB 计算凹凸多边形的面积(85)

MATLAB 计算凹凸多边形的面积(84) 一、算法介绍二、算法实现1.代码一、算法介绍 计算凹凸多边形的面积,并输出计算结果,可视化 二、算法实现 1.代码 % 设置多边形的顶点坐标 % 这里以一个五边形为例 x = [1, 3, 4

Windows 环境nginx安装使用及目录结构详解

一、 Windows 环境nginx安装及基本使用 1、下载 nginx-1.27.1 最新的主线版本 安装 nginx/Windows&#xff0c;请下载1.27.1最新的主线版本&#xff0c; nginx 的主线分支包含所有已知的修复程序。 2、 解压缩 nginx-1.27.1 版本 nginx/Windows 作为标准控制台应用程序&#x…

uniapp__微信小程序如何对比时间组件框选中框之后的时间大小

1、时间组件框选择时间 2、做判断 if (new Date(selectedDate) < new Date(this.startDate)) {uni.showToast({title: 结束时间不能早于起始时间,icon: none,duration: 2000});return;}console.log(new Date(selectedDate),new Date(this.endDate)); 3、打印出来的时间对比…

#QT 笔记一

重点&#xff1a;面试考试大概率涉及&#xff0c;需要不借助任何资料掌握。掌握&#xff1a;面试考试可能涉及&#xff0c;需要不借助任何资料掌握。熟悉&#xff1a;面试考试可能涉及&#xff0c;可以稍微参考资料掌握。了解&#xff1a;面试考试小概率涉及&#xff0c;面试拔…

【STM32+HAL库】---- 通用定时器PWM输出实现呼吸灯

硬件开发板&#xff1a;STM32G0B1RET6 软件平台&#xff1a;cubemaxkeilVScode1 新建cubemax工程 1.1 配置系统时钟RCC 1.2 配置定时器 找到LED所对应的引脚PA5&#xff0c;选择TIM2_CH1模式 在TIM2中&#xff0c;时钟源选择内部时钟Internal Clock&#xff0c;通道1选择PWM…

Docker中的容器内部无法使用vi命令怎么办?

不知道你是否遇到过,在修改容器内部的配置的时候,有时候会提示vi命令不可用。尝试去安装vi插件,好像也不是很容易,有什么办法可以帮助我们修改这个配置文件呢? 解决办法 这时候,我们就需要用到docker cp 命令了,它可以帮助我们把容器内部的文件复制到宿主机上,也可以将…

服务器文件权限限制写入

1、先查看文件需要的用户权限。 ls -l2、判断自己的账户不具备写入权限 container里面建的文件&#xff0c;需要用户身份是root&#xff0c;如果你不在rootfile里file的话&#xff0c;是无法对需要root权限的文件增删改的。 3、创建container与宿主机共享的文件夹 如果想宿…

跟李沐学AI:循环神经网络RNN

循环神经网络 循环神经网络&#xff08;recurrent neural networks&#xff0c;RNNs&#xff09; 是具有隐状态的神经网络。RNN 具有隐状态&#xff08;hidden state&#xff09;的原因在于它需要一种机制来存储之前输入的信息&#xff0c;以便于处理当前输入时能够考虑之前的…

STM32H7 串口 空闲中断 硬件FIFO 任意长接收 Hal库 IDLE

STM32H7 串口 空闲中断 硬件FIFO 任意长接收 Hal库 IDLE 由于工作原因好久不接触ST的芯片了&#xff0c;所以断更ST的东西了&#xff0c;不过偶尔玩玩也挺好的。 接着上篇继续说串口的事儿&#xff0c;这次是FIFO&#xff0c;STM32H7的串口都是带硬件FIFO&#xff0c;大小是发…

遥感技术在环境监测中的应用:揭秘地球变化的天眼

当我们仰望星空&#xff0c;探索宇宙的奥秘时&#xff0c;别忘了脚下的这片土地同样蕴藏着无数未解之谜。遥感技术&#xff0c;这个听起来似乎遥不可及的名字&#xff0c;其实正是我们透视地球环境变化的“天眼”。今天将带大家一探遥感技术如何在环境监测中大显身手&#xff0…

Unity(2022.3.41LTS) - UI详细介绍-画布

目录 零. 简介 一、画布的作用 二、画布的组件 Canvas Scaler&#xff08;画布缩放器&#xff09;&#xff1a; Constant Pixel Size模式 更改分辨率 Scale With Screen Size 模式 更改分辨率 Constant Physical Size模式 更改分辨率 Graphic Raycaster&#xff08;图形…

系统编程--信号

这里写目录标题 信号的概念特点二级目录二级目录 信号的产生二级目录二级目录二级目录 信号集操作函数二级目录二级目录二级目录 信号捕捉二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 信号的概念 特点 注意&#xff1a;所有信号的产生及其处理都是内核完成&am…

开源项目管理工具Taiga

什么是 Taiga &#xff1f; Taiga 是一个免费开源&#xff0c;而且功能非常强大的项目管理平台&#xff0c;用于初创企业和敏捷开发团队。Taiga 专注于简洁性&#xff0c;并且界面很干净简单。Taiga 也非常个性化&#xff0c;并集合了很多其它功能和外部工具&#xff0c;还有大…