首页 > 编程知识 正文

hal库函数中文手册,单片机stm32编程入门

时间:2023-05-03 06:35:05 阅读:170888 作者:4102

让我先谈谈:

我使用了以前使用过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/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。