STM32常用C语言知识总结

news2024/11/17 0:02:38

目录

一、引言

二、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.coloradmin.cn/o/2052918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编写日志文件

精灵程序 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <sys/stat.h> #include…

vue3 响应式 API:ref() 和 reactive()

在 Vue 3 中&#xff0c;响应式系统是其核心特性之一&#xff0c;它使得数据的变化能够自动触发视图的更新。 官方文档&#xff1a; 响应式 API&#xff1a;核心 要更好地了解响应式 API&#xff0c;推荐阅读官方指南中的章节&#xff1a; 响应式基础 (with the API preference…

【STM32单片机_(HAL库)】3-2-1【中断EXTI】【电动车报警器项目】震动点灯

1.硬件 STM32单片机最小系统LED灯模块震动传感器模块 2.软件 exti驱动文件添加GPIO常用函数中断配置流程main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "exti.h"int main(void) {HAL_Init(); …

Linux常用命令 ---- rmdir 命令[删除一个空目录]

rmdir 命令 功能&#xff1a;删除一个空目录 我们使用 mkdir 命令创建一个名为 test 空文件夹&#xff0c;如下图所示。 现在使用 rmdir 命令将 test 文件夹进行删除&#xff0c;如下图所示。 注意&#xff1a;rmdir 命令只能删除一个空目录&#xff0c;如果这个目录中有其他文…

【云原生】Kubernetes中的名称空间和资源配额详细用法与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

医疗器械维修其实没有想的那么难

在很多人的印象中&#xff0c;医疗器械维修是一项极其复杂且神秘的工作&#xff0c;似乎只有专业的技术精英才能胜任。然而&#xff0c;事实并非如此&#xff0c;医疗器械维修其实并没有想象中那么难。 首先&#xff0c;现代医疗器械的设计越来越注重人性化和可维护性。制造商…

迎接开学新生活!高三开学必备物品推荐~

步入高三&#xff0c;意味着每一位学子都将面临人生中重要的转折点——高考。为了帮助高三学生们准备充分&#xff0c;让学习生活之路更加顺畅。今天小编综合了实用性、性价比以及学生需求的考量&#xff0c;精选了一系列必备物品&#xff0c;旨在为高三学生创造一个更为舒适、…

ICMP互联网控制报文协议

ICMP 互联网控制报文协议 ICMP &#xff08; Internet Control Message Protocol &#xff0c;也就是互联⽹控制报⽂协议&#xff09;。 ⽹络包在复杂的⽹络传输环境⾥&#xff0c;常常会遇到各种问题。 当遇到问题的时候&#xff0c;总不能死个不明不⽩&#xff0c;没头没脑…

4. kafka消息监控客户端工具

KafkaKing官网地址 : https://github.com/Bronya0/Kafka-King github下载地址 : Releases Bronya0/Kafka-King (github.com) (windows、macos、linux版本) 云盘下载地址 : https://pan.baidu.com/s/1dzxTPYBcNjCTSsLuHc1TZw?pwd276i (仅windows版本) 连接kafka 输入本地地址…

基于Java语言的私家车充电桩系统+私家车充电平台+充电桩系统项目

介绍 SpringBoot 框架&#xff0c;私家车充电桩平台充电桩系统充电平台充电桩云快充协议1.5-1.6协议新能源汽车二充电平台源码Java源码私家车充电系统 源码合作 提供无加密源代码和数据库&#xff0c;支持二次开发 SpringMVC架构完整充电桩系统源代码-充电桩系统-家充公充-新…

大数据报表如何免费设计?本攻略附赠强大报表工具!

在当今信息爆炸的时代&#xff0c;大数据跃升为企业战略决策的核心支撑点。如何有效地从浩瀚的数据海洋中精炼出富含洞察力的信息&#xff0c;并将其转化为直观易懂的报表&#xff0c;是每个数据分析师和决策者都需要面对的挑战。这需要掌握一定的技巧和经验&#xff0c;本文将…

C语言03--控制流

1.二路分支 逻辑&#xff1a;程序中某段代码需要在满足某个条件时才能运行形式&#xff1a; if 语句&#xff1a;表达一种 如果-则 的条件执行关系if-else 语句&#xff1a;表达一种 如果-否则 的互斥分支关系 语法&#xff1a; if ( 判断表达式 ) { // 代码块 } 解…

大学生最佳就业城市排行榜出炉!

最佳就业城市 随着秋招陆续开始&#xff0c;不少高校毕业生迎来了人生转折点。 其中一个需要重点考虑的点&#xff0c;是要前往哪座城市作为就业第一站。 不妨参考一下就业蓝皮书的统计数据&#xff1a; 可以发现&#xff0c;一线城市的就业人数正逐步减少&#xff0c;"新…

grid-template-columns: 1.833333rem 1fr;

问: grid-template-columns: 1.833333rem 1fr;这是什么属性? 回答: grid-template-columns: 1.833333rem 1fr; 定义了一个网格布局的列宽&#xff1a; 1.833333rem 表示第一列的宽度是相对于根元素字体大小的固定宽度, 1fr 是一个灵活单位&#xff0c;表示第二列会占据网…

【吊打面试官系列-Memcached面试题】memcached 最大的优势是什么?

大家好&#xff0c;我是锋哥。今天分享关于 【memcached 最大的优势是什么&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; memcached 最大的优势是什么&#xff1f; Memcached 最大的好处就是它带来了极佳的水平可扩展性&#xff0c;特别是在一个巨大的系统中。…

[Python办公]Pandas创建透视表入门2

pivot_table 透视表在 Pandas 中是一个非常强大和灵活的工具&#xff0c;它支持许多高级功能&#xff0c;可以用于复杂的数据分析和报告生成。以下是一些更高级的用法和详细说明 1. 多级索引&#xff08;MultiIndex&#xff09; pivot_table 支持多级索引&#xff0c;这意味着…

iPhone16操作按钮大变样?引入快门拍摄按钮,提前告诉你它要干啥

随着智能手机摄影功能的不断升级&#xff0c;用户对于高质量照片和视频的需求也日益增长。苹果公司一直以来都在引领移动摄影技术的发展方向&#xff0c;而即将到来的iPhone 16系列更是备受瞩目。据多个消息来源透露&#xff0c;iPhone 16将引入一项创新功能——一个专门设计用…

【python实现修改所有可执行程序的图标】

实现效果&#xff1a; 图标在此 替换前&#xff1a; 吐槽&#xff1a;这原版看着也不像原版&#x1f603; 替换后&#xff1a; 代码&#xff1a; 注&#xff1a;必须要.ico图标文件 import winreg import ctypes import sys import os# 使用管理员身份打开程序 ctypes.windll…

3万多育儿宝典育儿网站ACCESS\EXCEL数据库

找了下以前弄到的一些育儿数据&#xff0c;发现小数据的《育儿宝典育儿知识大全ACCESS数据库》《结构漂亮的怀孕手册ACCESS数据库》、《结构漂亮的亲子宝典ACCESS数据库》&#xff0c;大的数据有《3万妈妈说育儿百科知识ACCESS数据库》而今天又弄到了一个3万多的育儿宝典网站&a…

ArcGIS Pro基础:状态栏显示栏的比例尺设置和经纬度位置

上图所示&#xff0c;界面下方最左侧是显示的比例尺&#xff0c;可以进行选择设置&#xff0c;也可以进行自定义设置 上图所示&#xff0c;可以手动录入比例尺&#xff0c;同时也可以对比例尺设置别名&#xff0c;比如【实验1】作为特定比例尺的标记 如上图所示&#xff0c;可以…