1.函数名单词之间用_隔开,每一个字母大写
【ARM】ARM程序规范
精选 转载 Uart_Printf()
//这个由三星的TEST风格延续下来,因此没有参数时,必须加void,否则ADS会编译报警
void Test_Keyscan(void);
2.寄存器名前要带小写的r。表示寄存器,大写名称要与DataSheet标的名一致..其宽度要根据硬件有效位来定义,其中必须带volatile关键字
有效位大于16位
#define rGPMCON (*(volatile unsigned *)(0x7F008820))
有效位小于等于16位,大于8位
#define rWTCON (*(volatile unsigned short*)(0x7E004000))
有效位小于等于8位
#define rNFDATA8 (*(volatile unsigned char *)(NANDF_BASE+0x10))
3.寄存器对位赋值的写法。
格式: 寄存器名 = //寄存器名解释
(值 << 位移) //每位的解释: 对应值的解释
| (值 << 位移) //每位的解释: 对应值的解释
注意象 (0<<12)等于没写,但是这样的写法起到占位的作用,表示12位为0.
例:
rCIWDOFST = // Set window offset register
(0<<31) // window offset - 1: Enable, 0: No Offset
|(0<<16) // Window horizontal offset1
|(0<<0)); // Window Vertical offset1
4.寄存器赋连续超过两位时要考虑清零问题.
rGPKCON0 |= (10 << 30);
这里的本意是把30,31两位置成10。但是假设原来的30位为1.这个表达式的结果变成设11了。
因些标准写法是 ,先清零,再置。
rGPKCON0 = (rGPKCON0 & ~(3 <<30)) | (10 << 30);
如果需要清零位太多,不如一开始赋0值再来加比较简洁,保险。
unsigned int val = 0;
rGPKCON0 |= (10<<30) | (10 <<2) ;
5.一组相关值是定义成enum好还是宏定义好?
从硬件角度是定义成宏定义好。
一般硬件定位一组值不一定连续。如下定义。
#define CONST_VAL1 (0x00)
#define CONST_VAL2 (0x01)
#define CONST_VAL3 (0x02)
#define CONST_VAL3 (0x04)
如果用enum容易笔误成连续值,而且因为不直观,在代码检查时不太容易查出来。
当然可以手动赋值了,但就失去了enum的优点了。
原文出处
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
java同时处理多个数据
java同时处理多个数据的三种常用方法详解,并提供了详细的代码示例。
java 抛出异常 多线程 -
【ARM】ARM处理器寻址方式
00. 目录文章目录00. 目录01. 概述02. 数据处理指令寻址方式2.1 立即数寻址方式2.2 寄存器寻址方式2.3
ARM汇编 ARM ARM指令 ARM寻址方式 ARM汇编语言 -
ARM裸机开发(二)——ARM异常处理
本文讲解ARM中6种异常及异常处理方式
ARM 裸机开发 异常处理