在《最新版LOOK程序包及例程包汇编(2011.7.24)》中,用LOOK_H来区分
两种头文件。
#if LOOK_H == 0
#include "NUC1xx.h"
#include "NUC1xxM051Seriescfg.h"
#else
#include <nuc120re3an.h>
using namespace nuvoton;
#endif
LOOK_H=0时,采用的是新唐官方的NUC1xx.h和菜农的NUC1xxM051Seriescfg.h组合。
LOOK_H=1或2时,采用的是Lee老师的nuc120re3an.h。
在最新版LOOK程序包及例程包汇编(2011.7.24)内的Cortex.rar文件内有源码。
举例:
#if LOOK_H == 0
RTCs.RIER.Bits.TIER = 1;
#else
RTC.RIER().TIER = 1;
#endif
可以看出他们之间的转换关系:
1.将"RTCs."改为"RTC.",即去掉"s"
2.将".Bits"改为“()”
在例如:
#if LOOK_H == 0
SYSs.IPRSTC2.Bits.UART0_RST = 1;
SYSs.IPRSTC2.Bits.UART0_RST = 0;
UART0s.FCR.Regs |= (1 << UART_FCR_TFR) | (1 << UART_FCR_RFR);
UART0s.LCR.Regs = 3 << UART_LCR_WLS; // 8bits
UART0s.BAUD.Regs = (0x66 << UART_BAUD_BRD)
| (1 << UART_BAUD_DIV_X_ONE)
| (1 << UART_BAUD_DIV_X_EN); // 115200
#else
SYS.IPRSTC2()
.UART0_RST(1);
SYS.IPRSTC2()
.UART0_RST(0);
UART0.FCR()
.TFR(1)
.RFR(1);
UART0.LCR(0)
.WLS(3); // 8bits
UART0.BAUD(0)
.BRD(0x66)
.DIV_X_ONE(1)
.DIV_X_EN(1); // 115200
#endif
可以看出老师的写法非常好,简洁。
其中:
UART0s.FCR.Regs |= (1 << UART_FCR_TFR) | (1 << UART_FCR_RFR);
的"|="就是置位,只设置FCR寄存器中的两位,其他位不改的。
此时,老师的头文件就显示出了优势:
UART0.FCR()
.TFR(1)
.RFR(1);
再例如:
UART0s.LCR.Regs = 3 << UART_LCR_WLS;
注意和上例不同,“=”,即赋值或覆盖
此时注意老师的写法!
即WLS位域为3,其他全为0.
再例如:
UART0s.BAUD.Regs = (0x66 << UART_BAUD_BRD)
| (1 << UART_BAUD_DIV_X_ONE)
| (1 << UART_BAUD_DIV_X_EN); // 115200
和上例基本一样,就是多位域操作。
老师的写法为:
UART0.BAUD(0)
.BRD(0x66)
.DIV_X_ONE(1)
.DIV_X_EN(1);
最后大家看看老师的头文件之精妙在何处:
位域表达:
RTCs.TLR.Bits.HR10 = Hour / 10;
RTCs.TLR.Bits.HR1 = Hour % 10;
RTCs.TLR.Bits.MIN10 = Minute / 10;
RTCs.TLR.Bits.MIN1 = Minute % 10;
RTCs.TLR.Bits.SEC10 = Second / 10;
RTCs.TLR.Bits.SEC1 = Second % 10;
老师用一句的表达方法:
RTC.TLR(0)
.HR10(Hour / 10, false)
.HR1(Hour % 10, false)
.MIN10(Minute / 10, false)
.MIN1(Minute % 10, false)
.SEC10(Second / 10, false)
.SEC1(Second % 10, false);
|