先聊一聊:

之前使用32都是用的库函数,但是没有理解为什么那么操作,有很多的文件我也不知道要看哪一个,感觉云里雾里,没有学清楚一件东西的感觉不太好,于是就在前几天一直跟着比较详细的视频学习。开始老师讲的方式是使用寻址以及寄存器的方式,我觉得这种比使用库函数要好理解,但是在几个视频之后会发现,开始讲解库了?嗯哼~我是拒绝的呀,带着十分抗拒的心情继续学习,这一次又有了一些不一样的理解。

为什么使用库呢?因为很多的函数都已经被32制造者写好了,就相当于我们喝红豆薏米粉吧(最近在喝,所以举个例子哈),没有库函数就是我们拿到红豆、薏米这些原材料,自己进行打磨一系列的步骤,但是有了库,也就是将薏米粉罐装起来了,我们直接使用就可以了,怎么用呢,那就可以翻看产品说明了,也是就在32之中的查看函数的definition了。

库在哪里?怎么整合起来的呢?拿之前的LED灯来讲吧,在32f429xx.h的文件与GPIO.h文件之中,我们将寄存器与地址的映射以及引脚进行定义,然后接着我们写一个函数,函数在.c文件之中,.c文件就可以使用h文件之中声明好的一些量,后将该函数在h文件之中再声明一下,感觉.h文件像是一个播报器,将有什么内容写在里面,至于怎么操作那就是在c语言之中的事情了呢~

接下来,我们要创建一个真正的文件夹,开始展示真正的技术了

学习步骤:

  1. 创建一个文件夹,这个之中要放其他的文件夹哦(命名为ex2)
  2. 在里面创建四个文件
  3. 新建一个工程,将工程保存在ex2之中的project之中
  4. 在project之中添加group

C语言知识总结:

以下是宏的一些学习

2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。这里已经不是#define的范畴了。

typedef unsigned char boolean;   /* Boolean value type. */

typedef unsigned longintuint32; /* Unsigned 32 bit value */

typedef unsigned shortuint16;  /* Unsigned 16 bit value */
typedef unsigned charuint8;    /* Unsigned 8 bit value */
typedef signed longintint32;   /* Signed 32 bit value */
typedef signed shortint16;     /* Signed 16 bit value */
typedef signed char int8;      /* Signed 8 bit value */

3,得到指定地址上的一个字节或字

1
2
#define MEM_B( x ) ( *( (byte *) (x) ) )
#define MEM_W( x ) ( *( (word *) (x) ) )  

4,求最大值和最小值

1
2
#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )

5,得到一个field在结构体(struct)中的偏移量

1
2
#define FPOS( type, field ) \
/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */

6,得到一个结构体中field所占用的字节数

1
#define FSIZ( type, field ) sizeof( ((type *) 0)->field )

7,按照LSB格式把两个字节转化为一个Word

1
#define FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )

8,按照LSB格式把一个Word转化为两个字节

1
2
3
4
5
#define FLOPW( ray, val ) \
 
(ray)[0] = ((val) / 256); \
 
(ray)[1] = ((val) & 0xFF)

9,得到一个变量的地址(word宽度)

1
2
3
#define B_PTR( var ) ( (byte *) (void *) &(var) )
 
#define W_PTR( var ) ( (word *) (void *) &(var) )

10,得到一个字的高位和低位字节

1
2
3
#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))
 
#define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))

11,返回一个比X大的最接近的8的倍数

1
#define RND8( x ) ((((x) + 7) / 8 ) * 8 )

12,将一个字母转换为大写

1
#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )

13,判断字符是不是10进值的数字

1
#define DECCHK( c ) ((c) >= '0' && (c) <= '9')

14,判断字符是不是16进值的数字

1
2
3
4
5
#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\
 
((c) >= 'A' && (c) <= 'F') ||\
 
((c) >= 'a' && (c) <= 'f') )

15,防止溢出的一个方法

1
#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))

16,返回数组元素的个数

1
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

17,返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)

1
2
#define MOD_BY_POWER_OF_TWO( val, mod_by ) \
( (dword)(val) & (dword)((mod_by)-1) )

 

18,对于IO空间映射在存储空间的结构,输入输出处理

1
2
3
4
5
6
7
8
9
10
11
#define inp(port) (*((volatile byte *) (port)))
 
#define inpw(port) (*((volatile word *) (port)))
 
#define inpdw(port) (*((volatile dword *)(port)))
 
#define outp(port, val) (*((volatile byte *) (port)) = ((byte) (val)))
 
#define outpw(port, val) (*((volatile word *) (port)) = ((word) (val)))
 
#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))

19,使用一些宏跟踪调试 
A N S I标准说明了五个预定义的宏名。它们是:

1
2
3
4
5
_ LINE _
_ FILE _
_ DATE _
_ TIME _
_ STDC _

可以定义宏,例如:

当定义了_DEBUG,输出数据信息和所在文件所在行

1
2
3
4
5
6
7
8
9
#ifdef _DEBUG
 
#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)
 
#else
 
#define DEBUGMSG(msg,date)
 
#endif

 

20,宏定义防止使用是错误

用小括号包含。

例如:

1
#define ADD(a,b) (a+b)

用do{}while(0)语句包含多语句防止错误

例如:

1
2
3
#define DO(a,b) a+b;\
 
a++;

应用时:

1
2
3
4
5
if(….)
 
DO(a,b); //产生错误
 
else

解决方法: 代码就只会执行一次。和直接加花括号有什么区别呢。哦对,不能随便在程序中,任意加{},组成代码块的。

1
2
3
#define DO(a,b) do{a+b;\
 
a++;}while(0)
 
 
 
部分摘自:
http://haore147.cnblogs.com/

STM32F4 阿波罗 库函数与C语言知识的更多相关文章

  1. C语言知识汇总,史上最全面总结,没有之一

    C语言基础 C语言学习路线 C语言入门笔记 初识C语言 简单的C程序示例 我们编写的C代码是怎样跑起来的? 简单示例,VS2019调试C语言程序 C语言基础-数据类型 深入理解变量,变量的声明,定义, ...

  2. 老师不讲的C语言知识

    老师不讲的C语言知识 导语: 对于工科生,C语言是一门必修课.标准C(ANSI C)这个看似简单的语言在硬件底层编程.嵌入式开发领域还是稳坐头把交椅.在20年5月份,C语言就凭借其在医疗设备上的广泛应 ...

  3. 【转】R语言知识体系概览

    摘要:R语言的知识体系并非语法这么简单,如果都不了R的全貌,何谈学好R语言呢.本文将展示介绍R语言的知识体系结构,并告诉读者如何才能高效地学习R语言. 最近遇到很多的程序员都想转行到数据分析,于是就开 ...

  4. Go语言知识查漏补缺|基本数据类型

    前言 学习Go半年之后,我决定重新开始阅读<The Go Programing Language>,对书中涉及重点进行全面讲解,这是Go语言知识查漏补缺系列的文章第二篇,前一篇文章则对应书 ...

  5. C语言知识整理(1):简介

    由于项目要求,需要学习iOS移动端开发.iOS开发的核心语言是Objective-C,Objective-C是在C语言的基础加了一层面向对象的语法.为了能够更好地掌握Objective-C,故先学习C ...

  6. C语言知识总结(5)

    预处理指令 C语言提供的预处理指令主要有:宏定义.文件包含.条件编译 宏定义 不带参数的宏定义 1>一般形式 #define 宏名 字符串 比如#define A 10 2>作用 它的作用 ...

  7. C语言知识总结

    明白一些变量 熟悉一些语句 组合一些函数 C语言——>库  帮你写好放在库中 魔数 凭空变出来的数字,不知道 数字表示的含义,影响代码的可读性. C语音的参数传递 非常特殊,传递的是一个替身. ...

  8. 关于C语言知识调查

    因为上一篇随笔对这一部分写得不够清楚,因此在这篇做一些补充. 你是怎么学习C语言的? 起初,对于C语言的学习主要是通过老师课堂的教学,完成相关的课后作业.与我的技能相比的话,他们都有一个共同点需要去实 ...

  9. 基础语言知识JAVA

    1. 总结: JAVA比较重要的博客: http://www.runoob.com/java/java-tutorial.html     (JAVA教程) http://blog.csdn.net/ ...

随机推荐

  1. Birt报表

    研究了两天终于发现开始学会了BIRT报表的开发流程. 第一步:到http://www.eclipse.org/downloads/下载  Eclipse IDE for Java and Report ...

  2. Scrapy爬取豆瓣图书数据并写入MySQL

    项目地址 BookSpider 介绍 本篇涉及的内容主要是获取分类下的所有图书数据,并写入MySQL 准备 Python3.6.Scrapy.Twisted.MySQLdb等 演示 代码 一.创建项目 ...

  3. PHP实现开发者模式出现该公众号提供的服务出现故障 请稍后再试解决方法

    PHP实现开发者模式出现该公众号提供的服务出现故障 请稍后再试解决方法 仔细检查下有没有echo等输出的代码  echo没有输出东西 就是报这个信息  所以调试信息都必须写入日记

  4. node.js 需要注意知识点

    复习node.js 需要注意知识点--(重点) 2.1:参数传递获取造型 客户端脚手架(发)    (参数传递)    node.js(收) -发ajax  this.axios.get(" ...

  5. W与V模型的联系与区别

      很多小白一定要注意:        看准那个是开发的工作哪个是测试的工作,不要弄混了!!!   软件测试的V模型 以“编码”为黄金分割线,将整个过程分为开发和测试,并且开发和测试之间是串行的关系 ...

  6. 一、netcore跨平台之 Linux上部署netcore和webapi

    这几天闲着的时候在linux上部署了一下netcore webapi,下面就纪要一下这个过程. 中间遇到不少的坑,心里都是泪啊. 话不多说,开始干活. ------------------------ ...

  7. poj 3281 Dining (Dinic)

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22572   Accepted: 10015 Descript ...

  8. static declaration follows non-static declaration

    前段时间工作中要为android编译跨平台的第三方库,遇到了arc4random有关函数的“static declaration follows non-static declaration”问题,那 ...

  9. 分析facebook的AsyncDisplayKit框架中的Transaction的工作原理

    在AsyncDisplayKit框架中有一个_ASAsyncTransaction模块,用于AsyncDiplayNode的异步事务,使用了dispatch_group实现. 主要目的是将operat ...

  10. C# Json之序列化与反序列化

    前言:在实际开发过程中经常都要和Json打交道,序列化与反序列化就成了开发中必不可缺的技能.本篇博客就教大家如何进行Json序列化与反序列化. 首先要添加引用NuGet包,Newtonsoft.Jso ...