让我先谈谈:
我使用了以前使用过32的库函数,但是我不明白为什么操作那么多。 有很多文件,不知道看哪个,在云里,感觉有一件事没有学清楚,前几天一直跟着详细的视频学习。 老师开始讲的是寻址和使用寄存器的方式,我觉得这比使用库函数更容易理解,在几个视频之后发现了,开始说明数据库了吗? 土豪溪流~我虽然拒绝了,但是抱着非常抗拒的心情继续学习,这次又有了一点不同的理解。
为什么要使用库? 很多函数已经由32个制造者写了,喝红豆薏米吧。 (我最近在喝酒,举个例子吧) ),没有库函数就是得到红豆、薏米这种原材料,自己打磨的一系列步骤,但是有库存就是把薏米放进了罐子里。 我们就那样使用就可以了。 怎么使用呢,可以看到产品的说明。 另外,看32中的函数的DD
库在哪里? 它们是怎么合并的呢? 就前面的LED灯而言,在32f429xx.h和GPIO.h文件中定义寄存器和地址的映射和管脚,然后编写函数。 函数可以使用在. c文件中、 c文件可以使用在h文件中声明的一些量。 然后在h文件中重新声明此函数。 h文件感觉像播音员。
接下来,制作真正的文件夹,开始展示真正的技术
学习步骤:
创建文件夹。 这里面可以放其他的文件夹哦。 (命名为ex2 ) ) )。
心跳加速创建四个文件
创建新项目并将该项目保存到ex2中的project
将组添加到项目
C语言知识总结:
介绍几个宏观的学习
2 )重新定义一些类型,防止各种平台和编译器不同导致的类型字节数差异,便于移植。 这里已经不是#define的范畴了。
typedef unsignedcharboolean;/*布林值类型. * /
typedef unsignedlongintuint32; /* Unsigned 32 bit value */
typedef unsignedshortuint16;/* unsigned 16位value * /
typedef unsignedcharuint8; /* Unsigned 8 bit value */
typedef signedlongintint32;/* signed 32位value * /
typedef signedshortint16;/* signed 16位value * /
typedef signedcharint8; /* Signed 8 bit value */
3、获取指定地址的一个字节或字
1
2
#definemem_b(x ) ) ) ) ) x ) )
#definemem_w(x ) ) ) ) (word* ) ) x ) )
4 )求出最大值和最小值
1
2
#definemax(x,y ) ) ) (x ) ) y )? (x ) 3360 ) )
#definemin(x,y ) ) ) (x ) ) y )? (x ) 3360 ) )
5 )得到结构体(struct )中field的偏移量
1
2
#definefpos(type,field ) () ) )。
/*lint-e545*//(dword ) )0)- field )/*lint e545 */
6 )得到一个结构体中字段占用的字节数
1
#definefsiz(type,field ) sizeof ) ) (type* )0)-field ) ) ) ) ) ) ) ) ) 65
7 .以LSB格式将两个字节转换为一个Word
1
#defineflipw(jjdlb ) ) ) ) ) ) (word ) (jjdlb ) )1) )
8、将一个Word以LSB格式转换为2字节
1
2
3
4
5
#defineflopw(jjdlb,val ) () ) )。
(jjdlb ) [0]=(val )/256 );
(jj dlb ([1]=) (val )0xFF ) ) ) ) ) ) ) ) )。
9、得到一个变量的地址(word宽度)
1
2
3
#defineb_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/