IAR语言扩展特性里有个##value##这种扩展语言特性,主要用于宏的实现。其中#号中间的value就是你传递进去的值。可以用来提高代码复用性。在编写CC2530的Timer3与Timer4时就可以使用。因为这两个8位定时器特性基本一致。下面是实现通用的Timer3与Timer4头文件实现,用一个头文件可以实现Timer3或Timer4操作。
- #ifndef _TIMER34_H
- #define _TIMER34_H
-
- #define CLEAR_TIMER34_COUNTER(timer) \
- T##timer##CTL &= ~0x04
-
- #define TIMER34_ENABLE_OVERFLOW_INT(timer, val) \
- (T##timer##CTL = (val)? T##timer##CTL | 0x08 : T##timer##CTL & ~0x08)
-
- #define TIMER34_START(timer, val) \
- (T##timer##CTL = (val) ? T##timer##CTL | 0x10 : T##timer##CTL & ~0x10)
-
- #define TIMER34_SET_CLOCK_DIVIDE(timer, val) \
- do{ \
- T##timer##CTL &= ~0xE0; \
- (val == 2) ? (T##timer##CTL |= 0x20) : \
- (val == 4) ? (T##timer##CTL |= 0x40) : \
- (val == 8) ? (T##timer##CTL |= 0x60) : \
- (val == 16) ? (T##timer##CTL |= 0x80) : \
- (val == 32) ? (T##timer##CTL |= 0xA0) : \
- (val == 64) ? (T##timer##CTL |= 0xC0) : \
- (val == 128) ? (T##timer##CTL |= 0xE0) : \
- (T##timer##CTL |= 0x00); \
- }while(0)
-
- #define TIMER34_SET_MODE(timer, val) \
- do{ \
- T##timer##CTL &= ~0x03; \
- (val == 1) ? (T##timer##CTL |= 0x01): \
- (val == 2) ? (T##timer##CTL |= 0x02): \
- (val == 3) ? (T##timer##CTL |= 0x03): \
- (T##timer##CTL |= 0x00); \
- }while(0)
-
- void Timer34_Init(void);
-
- #endif
需要注意的是,要使用此特性的话,需要在工程设置里面做如下设置,勾选其中的复选框。