目录

位操作

​define宏定义关键词

ifdef条件编译

extern变量声明

typedef类型

结构体

结构体的优势:

static关键字


位操作

6种位操作运算符

  • 位操作
  • 数值操作

位操作即按位进行运算操作

GPIO->CRL &= 0xFFFFFF0F

上面这句代码的意思是将GPIO的CRL寄存器的对应位清0

看到&=操作,就要马上想到这是一个清0操作,那么具体是将哪些位清0呢?再去看后面的十六进制数中的那些位是为0的


GPIOA->CRL |= 0x00000040

上面这句话的意思是将GPIO的CRL寄存器的对应位置1

看到|=操作,就要马上想到这是一个置1操作,那么具体是将哪些位置1呢?再去看看后面的十六进制数中那些位是为1的

这些位操作运算符在固件库里面用得特别多,就是那些stm32f10x_xx.c文件

包括取反运算符,在定时器固件库里用得特别多

define宏定义关键词

define是C语言的预处理命令,用于宏定义,可以提高代码可读性

#define 标识符 字符串

例如

#define SYSCLK_FREQ_72MHz 72000000

凡是程序中出现了SYSCLK_FREQ_72MHz的地方,都会被替换为72000000

ifdef条件编译

当满足条件时对一组语句进行编译,而当条件不满足时对另一组语句进行编译

#ifdef 标识符
程序段1
#else
程序段2
#endif

ifndef也是同样的道理

打开Keil,魔术棒,C/C++选项,里面的Preprocessor Symbols就是预处理符号,里面的Define的内容可以被整个工程识别

extern变量声明

extern修饰变量或函数,表示变量或函数的定义是在别的文件中,提示编译器遇到此变量或函数时在别的文件中寻找其定义

注意:extern的变量声明可以有很多次,但是定义只能出现一次

首先是定义,我们定义一个名为id的变量:

在main.c文件中

u8 id; // 此处为定义,有且只有一次
main{id = 1;printf("%d",id); // id = 1test();printf("%d",id); // id = 2
}

在test.c文件中

extern u8 id; // 注意,这里是使用extern关键字在声明
void test(void){id = 2;
}

注意,这里是使用extern关键字在声明

这样就可以在test.c文件中操作这个变量

typedef类型

结构体

使用结构体的本质是利用面向对象的思想对描述事物

Struct 结构体名{成员列表1;成员变量2;
...}变量名列表;

在结构体声明的时候可以定义变量,也可以在声明之后定义,定义的方法为:

Struct 结构体名字  结构体变量列表;

结构体的优势:

1. 将无序的不同类型的变量放在一起,让程序更加有序可读

2. 提高程序的扩展性

例如,对于结构体的定义如下所示

GPIO_TypeDef结构体

/** * @brief General Purpose I/O*/typedef struct
{__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR;
} GPIO_TypeDef;

GPIO_InitTypeDef结构体

/** * @brief  GPIO Init structure definition  */typedef struct
{uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.This parameter can be any value of @ref GPIO_pins_define */GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.This parameter can be a value of @ref GPIOSpeed_TypeDef */GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;

以结构体作为入口参数传入

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

这里第二个入口参数用于描述IO口的模式特性,例如模式,速度,上下拉等

若不用结构体作为入口参数,那么此时我们就需要非常多的入口参数,例如int xx , int xx

此时若要再增加参数,则所有的函数的定义和所有的声明都要修改,无数个调用这个函数的地方都要修改,此时这个代码的扩展性就非常差

这方面就可以通过结构体来解决这个问题,我们只需要去改变结构体的成员变量即可,声明就不需要做任何修改

我们去增加结构体的成员变量,对于原程序是没有任何影响的

这也是为什么库函数都是使用结构体或结构体指针作为函数入口参数的原因

static关键字

static声明的局部变量,存储在静态存储区,在函数调用结束后,不会被释放,具有记忆功能

static修饰的函数一般在内部使用

嵌入式C语言入门操作相关推荐

  1. Mac版R语言入门(一)R语言入门操作

    文章更新于2023年1月29日: 视频教程--微信公众号:R语言数据分析与实践                      bilibili: R语言数据分析与实践 CSDN:ZhenniLi 第一集: ...

  2. 跟着老陈学嵌入式-C语言入门之类Linux编译环境搭建

    1.安装notepad(敲代码的地方) 2.安装gcc工具包mwind(代码编辑工具) 安装后解压,但是用命令提示符不能使用 解决办法:此电脑-属性-高级系统设置-环境变量-双击path-新建-注册( ...

  3. 【C/C++语言入门篇】-- 文件操作

    [C/C++语言入门篇]-- 文件操作 收藏 此文于2010-03-09被推荐到CSDN首页 如何被推荐? 最近实在是太忙了,这篇整整就推迟了1个月了,实在是对不起.之前本打算这个模块就结束了,文件操 ...

  4. 嵌入式开发板硬件操作入门学习0——电路图概念 硬件接口的四大类

    电路图概念 术语: sch:schematic,原理图 PCB:Printed Circuit Board,印刷电路板 footprint:脚印.足迹,表示元件在电路板上的外形 component:元 ...

  5. c语言圆周率计算_C语言入门这一篇就够了

    c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  6. vhdl语言入门_从当初汇编、C语言入手,到如今FPGA开发已然十年,总结出“三多”!...

    从大学时代第一次接触FPGA至今已有10多年的时间,至今记得当初第一次在EDA实验平台上完成数字秒表.抢答器.密码锁等实验时那个兴奋劲.当时由于没有接触到HDL硬件描述语言,设计都是在MAX+plus ...

  7. C语言入门(初识C语言)

    C语言入门(初识C语言) 前言 什么是C语言? 为什么选择C语言? 计算机语言的发展 高级计算机语言中的经典:C语言 初识C语言(正片开始) 一.第一个C语言程序(你好,C语言) 1.1 #inclu ...

  8. 嵌入式 C 语言中三块难啃的硬骨头

    我是小麦,一名热爱学习的嵌入式工程师 关注我,一起变得更加优秀! C语言在嵌入式学习中是必备的知识,审核大部分操作都要围绕C语言进行,而其中有三块"难啃的硬骨头"几乎是公认级别的. ...

  9. 啃下这三块最难啃的硬骨头,你将在嵌入式C语言中大放异彩

    啃下这三块最难啃的硬骨头,你将在嵌入式C语言中大放异彩 C语言在嵌入式学习中是必备的知识,审核大部分操作都要围绕C语言进行,而其中有三块"难啃的硬骨头"几乎是公认级别的. ///插 ...

  10. C语言入门教程学习 C语言学习包括哪些?

    嵌入式开发有一定了解的朋友们知道是在操作系统内部开发的,对于操作系统内部来说基本上都是用C语言来进行编译的,所以说对于C语言的学习在嵌入式开发过程中是非常重要的.下面就给大家介绍一些C语言入门教程的相 ...

最新文章

  1. Openwrt配置ssh自动登录服务器socks5转发
  2. 进销存设计之——单据的数据表结构设计
  3. 查看linux的计划任务日志,查看计划任务日志(共5篇).docx
  4. leetcode 462. Minimum Moves to Equal Array Elements II
  5. mysql binlog 多少_今天才知道,MySQL 的 binlog 编号可以这么大!
  6. 看过曹县国际车展,我闯入了魔幻的塞伯坦
  7. android.view.WindowManager$BadTokenException
  8. Perl命令行常见用法及技巧
  9. linux显示3个字符,Linux驱动学习笔记(3)字符设备驱动
  10. 梦幻群侠传5帮派修炼_梦幻群侠传5唯美版
  11. 大师林语堂的英文学习要诀
  12. 删数问题 详解(C++)
  13. hadoop 空间配置
  14. Android Gradle学习(五) Extension详解
  15. python入门——快乐的数字
  16. 估值近百亿,“创维三把手”酷开科技能否顺利赶考?
  17. vue3.2+element-plus+ts节假日管理界面
  18. Ubuntu下安装KDE
  19. C# OPC类库 升级版本 OPCAutomation.dll
  20. JavaScript面试问题

热门文章

  1. keil+proteus 制作计算器_设计费 | 工程设计费计算器使用指南
  2. mysql字符串拼接有空值_MySQL字符串拼接
  3. 海康威视网络摄像头SDK中Demo的二次开发(运行)
  4. python 定时任务 web管理_Selenium+WebDriver+Python 定时控制任务
  5. python保存文件后缀_python文件的后缀名是什么
  6. 阿里巴巴编码规范认证之步骤详解
  7. 双物块弹簧阻尼系统模型,李雅普诺夫稳定性分析,matlab仿真验证
  8. 中兴机顶盒网关服务器超时,中兴机顶盒错误1302连接EPG服务失败解决方法
  9. 在线图片编辑器/在线视频剪辑器/网站源码
  10. Mac 录屏制作gif动图