单片机编程的一些方法.doc_第1页
单片机编程的一些方法.doc_第2页
单片机编程的一些方法.doc_第3页
单片机编程的一些方法.doc_第4页
单片机编程的一些方法.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

以下内容是在网上找到的 ,觉得很好,不敢独享,在此感谢原作者的辛勤劳动和大公无私- Free_Bird整理单片机编程的几种新用法 做嵌入式开发的都用C语言写代码,我一直习惯if、switch用法,在定义数据结构的时候也只用到字符型、整型、数组,位;很少用结构体,共用体,枚举等,虽然我做编程时间不长,但是几个项目下来我也总结出自己的一套C语言学习方法,给大家分享一下呵呵。一、学习*的头文件包含巧妙用法当一个头文件被多个C文件包含,且该头文件中定义了这些C文件的公共变量,则在编译的时候会出现重复定义,导致编译通不过,通常我们会采用如下两种做法来解决上述问题。(为了让问题表述得更清楚,我们假设三个C文件C1,C2,C3,一个头文件H1,C1,C2,C3有两个公共变量V1和V2)1、在C1文件中定义变量V1和V2,在C2和C3文件中对V1,V2用extern声明;2、在C1文件中定义变量V1和V2,在H1中对V1,V2用extern声明,然后在C2和C3文件中包含H1;很显然,以上两种方法都要对V1和V2书写至少两次,一次定义,一次外部声明,且不是在同一文件下,这样不利于管理和修改,有没有一种方法可以让这些公用的变量放在一个文件里,且只要书写一次呢?首先我们将要用到的公共变量全部书写到com.h文件中,每一个变量在定义前加一个符号EXT_,当该头文件被main.c函数包含时,定义EXT_为空,表示com.h中的变量在main.c中被定义,当被其它文件包含时,定义EXT_为extern,表示外部声明,如:Com.h文件:/避免重复定义#ifdefroot#defineEXT_#else#defineEXT_extern#endif/全局变量EXT_u8variable1;/该变量在三个C文件中都要用到Main.c#defineroot/在包含com.h前定义root#includecom.h二、用结构体的方式来定义总线或外设地址当一个整体包含不同类型的多个成员时,通常用结构体来定义结构体变量,这样内存会将这些变量按照递增的方式分配到相邻的地址(不对齐的地方会有填充),按“结构体名.成员名”的方式访问结构体内的成员,这是访问结构体变量的方式;但是还有一种指向结构体变量的指针,它可以将某个地址转换成该结构体类型的指针,比如寄存器的定义:(以下是摘自STM32固件函数库,关于GPIO的定义)typedef structvu32CRL;/0vu32CRH;/偏移量4vu32IDR;/偏移量8vu32ODR;vu32BSRR;vu32BRR;vu32LCKR;GPIO_TypeDef;#defineGPIOA_BASE(u32)0x40010800) /GPIOA的基地址为0x40010800#defineGPIOA(GPIO_TypeDef*)GPIOA_BASE;/强制类型转换为GPIO_TypeDef类型的指针这样在操作GPIOA的寄存器时只要这样写就可以了读:X= GPIOA-CRL;写:GPIOA-CRL=X;或 读:X=(*GPIOA).CRL;写:(*GPIOA).CRL=X;当然,要达到上述目的也可以采用如下方式#defineGPIOA_CRL 0x40010800#defineGPIOA_CRH 0x40010804#defineGPIOA_IDR 0x40010808#defineGPIOA_ODR 0x4001080C#defineGPIOA_BSSR 0x40010810#defineGPIOA_LCKR 0x40010814很明显,第一种书写方式更加正规化,且当定义多个GPIO时,只要将其它GPIO的基地址强制转换为该结构类型的指针即可。再来看看一个定义外部总线的例子typedefstructvu8CH375_DATA;vu8CH375_CMD;/偏移量1CH375_TypeDef;#defineCH375(CH375_TypeDef*)0x6c000000)CH375-CH375_DATA=data;/往0x6c000000地址处写数据CH375-CH375_CMD=cmd;/往0x6c000001地址处写命令怎么样,是不是方便多了。重要的是代码的观赏和可读性提高了。三、用枚举数据类型来定义特定的状态在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个函数在操作过程中会返回几个特定的状态:操作成功,操作失败,忙,等等。如果我们直接在函数里用0,1和2来表示这三种状态,有时偶尔会出现数值与实际状态对不上号的情况,造成置状态和判断状态错误,那么我们可以在程序里用宏或者枚举来事先定义好这些状态。如:用宏定义:#defineSucess0#defineFailure1#defineBusy2用枚举typedefenumSucess=0,Failure,BusyFlagStatus;四、用共用体类型定义共享内存空间共用体类型定义的数据是将多个成员共享同一内存空间,该空间的大小为最大成员的大小,其用法与结构体完全相同,但值得注意的是不能同时引用多个成员,在某一时刻只能使用其中之一成员。在程序中如果全局变量比较多,包含几个结构和数组,如果这些全部定义的话势必会占大量的内存,有可能还会导致单片机内存不够,如果能让几个不同时用到的数组和结构变量共享一段内存,则能省出很多的内存空间。比如以下输入输出若不同时进行,则可以共享同一段内存空间unionstructunsignedcharFlag;unsignedcharType;unsignedcharState;unsignedlongDataLen;unsignedcharBuffer64;DataOut;structunsignedcharFlag;unsignedcharType;unsignedcharState;unsignedlongDataLen;unsignedch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论