使用IAR的扩展语言特性编写可复用的代码

IAR语言扩展特性里有个##value##这种扩展语言特性,主要用于宏的实现。其中#号中间的value就是你传递进去的值。可以用来提高代码复用性。在编写CC2530的Timer3与Timer4时就可以使用。因为这两个8位定时器特性基本一致。下面是实现通用的Timer3与Timer4头文件实现,用一个头文件可以实现Timer3或Timer4操作。

  1. #ifndef _TIMER34_H  
  2. #define _TIMER34_H  
  3.   
  4. #define CLEAR_TIMER34_COUNTER(timer)    \  
  5.   T##timer##CTL &= ~0x04  
  6.   
  7. #define TIMER34_ENABLE_OVERFLOW_INT(timer, val)     \  
  8.   (T##timer##CTL = (val)? T##timer##CTL | 0x08 : T##timer##CTL & ~0x08)  
  9.   
  10. #define TIMER34_START(timer, val)   \  
  11.   (T##timer##CTL = (val) ? T##timer##CTL | 0x10 : T##timer##CTL & ~0x10)  
  12.   
  13. #define TIMER34_SET_CLOCK_DIVIDE(timer, val)        \  
  14.   do{                                               \  
  15.         T##timer##CTL &= ~0xE0;                     \  
  16.         (val == 2) ? (T##timer##CTL |= 0x20) :      \  
  17.         (val == 4) ? (T##timer##CTL |= 0x40) :      \  
  18.         (val == 8) ? (T##timer##CTL |= 0x60) :      \  
  19.         (val == 16) ? (T##timer##CTL |= 0x80) :     \  
  20.         (val == 32) ? (T##timer##CTL |= 0xA0) :     \  
  21.         (val == 64) ? (T##timer##CTL |= 0xC0) :     \  
  22.         (val == 128) ? (T##timer##CTL |= 0xE0) :    \  
  23.         (T##timer##CTL |= 0x00);                    \  
  24.     }while(0)  
  25.   
  26. #define TIMER34_SET_MODE(timer, val)        \  
  27.   do{                                       \  
  28.      T##timer##CTL &= ~0x03;                \  
  29.      (val == 1) ? (T##timer##CTL |= 0x01):  \  
  30.      (val == 2) ? (T##timer##CTL |= 0x02):  \  
  31.      (val == 3) ? (T##timer##CTL |= 0x03):  \  
  32.      (T##timer##CTL |= 0x00);               \  
  33.     }while(0)  
  34.         
  35. void Timer34_Init(void);  
  36.   
  37. #endif  

需要注意的是,要使用此特性的话,需要在工程设置里面做如下设置,勾选其中的复选框。 

永不止步步 发表于03-07 09:30 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:363741个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号