一;
lpc1700系列——通用输入输出(GPIO)寄存器设置② LPC1700系列编程时文件结构基本为如下图:
其中:
main.c 文件用于放置用户所编写的代码。
LPC1700PinCfg.c 用于放置引脚配置函数,此部分只是将用户设置的引脚功能的值放入相应设置位的寄存器中。
具体功能选择可以在LPC1700PinCfg.h文件中设置。
target.c 放置 默认异常处理程序,即当程序由于一定原因跑飞时会进入此布分代码。其作用是将跑飞的程序引入 复位或其它处理程序中。
vector_table.c 异常向量表此文件中代码是用来决定那种地址的异常跳入那个异常处理程序。
zy_if.c 文件用来放置完成一定功能的系统函数如,端口初始化、系统复位等。 rt_sys_c.c 文件中定义了一些功能函数。
此例子为周立功给出的程序模板。
模板中我们使用一个GPIO时只需要修改一个寄存器的值即可如下: FIO2DIR0 |= 0X0F; //P2口的0、1、2、3位设成输出。 FIO2PIN0 |= 0X00; //设置四个管脚默认为高电平输出
二;
在别人代码的位的字节位操作时,
有时看到人用 var&1<<0 来操作,但不知道这个1<<0有啥特殊含义啊. 因为左移0字节就是本身啊,用不着多写个<<0吧.
这么写通常使用#define的宏来写的 直接写可能是为了清晰 其中 &后面的是掩码 <<后面的是偏移 先<<通常是读取时用
var & (1 << 0) 就是取出从第0bit开始的1个bit var & (0x2f << 0x5) 就是取出从第5bit开始的6个bit 先&的话通常是设置时用
(var & 1) << 0 就是限制数据为最多1个bit然后移位准备放到目标的0bit开始位置 (var & 0x2f) << 0x5 就是限制数据为最多6个bit然后移位准备放到目标的5bit开始位置
/* Legal values for sh_flags (section flags). */
#define SHF_WRITE (1 << 0) /* Writable */
#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */ #define SHF_EXECINSTR (1 << 2) /* Executable */ #define SHF_MERGE (1 << 4) /* Might be merged */
#define SHF_STRINGS (1 << 5) /* Contains nul-terminated strings */ #define SHF_INFO_LINK (1 << 6) /* `sh_info' contains SHT index */ #define SHF_LINK_ORDER (1 << 7) /* Preserve order after combining */ #define SHF_OS_NONCONFORMING (1 << 8) /* Non-standard OS specific handling required */
#define SHF_GROUP (1 << 9) /* Section is member of a group. */ #define SHF_TLS (1 << 10) /* Section hold thread-local data. */ #define SHF_MASKOS 0x0ff00000 /* OS-specific. */
#define SHF_MASKPROC 0xf0000000 /* Processor-specific */ #define SHF_ORDERED (1 << 30) /* Special ordering requirement (Solaris). */
#define SHF_EXCLUDE (1 << 31) /* Section is excluded unless referenced or allocated (Solaris).*/
/* Section group handling. */
这种东西最终的值是多少啊,为什么这么定义???????????????
仅仅代表第0位置1
诸如
.lcdcon1=(7<<8)|(0<<7)|(3<<5)|(12<<1), .lcdcon2=(14<<24)|(239<<14)|(4<<6)|4, .lcdcon3=(48<<19)|(319<<8)|19,
这样给寄存器赋值可以轻松看出设置的第几位,习惯而已
没什么特殊含义,就是为了程序更加可读。能够看出规律而已。
方便阅读
方便阅读
我怎么看着更复杂了!!!
这叫程序的规范吧。。。
嵌入式开发常常这么写,定义了一个寄存器里包含的域,以及哪些位置(bit)代表这些域
#define SHF_WRITE (1 << 0) /* Writable */
说明该寄存器的最低位是写标志位,如果你就只写个1,那么别人看不懂你是啥意思的,别人会以为你是为一个
常数定义一个宏
如果寄存器是32位的,那么或者
#define SHF_WRITE 0x00000001 /* Writable */ --> bit mask
或者
#define SHF_WRITE (1 << 0) /* Writable */ 三;