乡下人对华邦及其他M0头文件的看法及意见

[复制链接]
9388|48
 楼主| hotpower 发表于 2010-10-22 00:31 | 显示全部楼层 |阅读模式
本帖最后由 hotpower 于 2010-10-23 00:52 编辑

看法是有的,但意见即使接受恐怕也是来不急了~~~

接受革命教育,将2楼升级并可以复制代码。

应用见:NuTiny-SDK-120例程调试通过

几种方法全部通过测试。

  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. //Smpl_NuTiny-EVB-NUC120.c
  7. #include <stdio.h>
  8. #include "NUC1xx.h"
  9. #include "Driver\DrvGPIO.h"
  10. #include "NUC1xxcfg.h"
  11. void delay_loop(void)
  12. {
  13. uint32_t j;
  14.    for(j=0;j<60000;j++);  
  15.   for(j=0;j<60000;j++);
  16.      for(j=0;j<60000;j++);  
  17.   for(j=0;j<60000;j++);

  18. }

  19. /*---------------------------------------------------------------------------------------------------------*/
  20. /* MAIN function                                                                                          */
  21. /*---------------------------------------------------------------------------------------------------------*/   
  22. int main (void)
  23. {
  24.   // uint32_t i,k;
  25. /* SYSCLK =>12Mhz*/
  26. UNLOCKREG();
  27.     SYSCLK->WRCON.XTL12M_EN = 1;

  28. /*set GPC outpui*/

  29. // DrvGPIO_Open(E_GPB,0, E_IO_OUTPUT);
  30. // GPIOBs.PMD.Bits.PMD0 = E_IO_OUTPUT;
  31. // GPIOs.PB.PMD.Bits.PMD0 = E_IO_OUTPUT;
  32. // GPIOs.Px[1].PMD.Bits.PMD0 = E_IO_OUTPUT;
  33. GPIOx(1)->PMD.Bits.PMD0 = E_IO_OUTPUT;
  34.   
  35. while(1)
  36. {
  37.      
  38. //        DrvGPIO_ClrBit(E_GPB,0);
  39. //        GPIOBs.DOUT.Bits.Pin0 = 0;
  40. //        GPIOBs.DOUT.Bits.Pin0 ^= 1;
  41. //        GPIOs.PB.DOUT.Bits.Pin0 ^= 1;
  42. //        GPIOs.Px[1].DOUT.Bits.Pin0 ^= 1;
  43.         GPIOx(1)->DOUT.Bits.Pin0 ^= 1;
  44.   delay_loop();
  45. //  DrvGPIO_SetBit(E_GPB,0);
  46. //        GPIOBs.DOUT.Bits.Pin0 = 1;
  47. //  delay_loop();
  48. }

  49. }



 楼主| hotpower 发表于 2010-10-22 00:31 | 显示全部楼层
本帖最后由 hotpower 于 2010-10-22 23:48 编辑

  1. /*--------------------------------------------------------------------------
  2. 文   件   名 :  NUC1xxcfg.h
  3. 创   建   人 :  Cortex-M0菜鸟HotPower@163.com
  4. 创 建 日  期 :  2010.10.18   18:18
  5. 最近修改日期 :  2010.10.22   23:38
  6. 创 建  地 点 : 西安大雁塔村队部
  7. 版   本   号 : V1.03 (红杏版)
  8. 修 改  原 因 :
  9. 说        明 :
  10. 备        注 : 本头文件风格归属于菜农的《红杏出墙》系列,堪称“红杏级别”
  11.                 将本文件拷贝到...\NUC1xxBSP\CMSIS\CM0内。
  12. -------------------------------------------------------------------------------*/
  13. #ifndef __NUC1xxcfg_H__
  14. #define __NUC1xxcfg_H__
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18. #if defined (__CC_ARM)
  19.   #pragma anon_unions
  20. #endif

  21. typedef volatile unsigned int NU_REG;// Hardware register definition
  22. #define __noinit__ __attribute__((zero_init))//变量不初始化为0
  23. typedef enum
  24. {
  25. __0 = (NU_REG)0,
  26. __1 = (NU_REG)1,
  27. __2 = (NU_REG)2,
  28. __3 = (NU_REG)3,
  29. __4 = (NU_REG)4,
  30. __5 = (NU_REG)5,
  31. __6 = (NU_REG)6,
  32. __7 = (NU_REG)7,
  33. __8 = (NU_REG)8,
  34. __9 = (NU_REG)9,
  35. __10 = (NU_REG)10,
  36. __11 = (NU_REG)11,
  37. __12 = (NU_REG)12,
  38. __13 = (NU_REG)13,
  39. __14 = (NU_REG)14,
  40. __15 = (NU_REG)15,
  41. __16 = (NU_REG)16,
  42. __17 = (NU_REG)17,
  43. __18 = (NU_REG)18,
  44. __19 = (NU_REG)19,
  45. __20 = (NU_REG)20,
  46. __21 = (NU_REG)21,
  47. __22 = (NU_REG)22,
  48. __23 = (NU_REG)23,
  49. __24 = (NU_REG)24,
  50. __25 = (NU_REG)25,
  51. __26 = (NU_REG)26,
  52. __27 = (NU_REG)27,
  53. __28 = (NU_REG)28,
  54. __29 = (NU_REG)29,
  55. __30 = (NU_REG)30,
  56. __31 = (NU_REG)31
  57. }Number_enum;
  58. typedef volatile struct
  59. {
  60.   NU_REG Bit0:  1;
  61.   NU_REG Bit1:  1;
  62.   NU_REG Bit2:  1;
  63.   NU_REG Bit3:  1;
  64.   NU_REG Bit4:  1;
  65.   NU_REG Bit5:  1;
  66.   NU_REG Bit6:  1;
  67.   NU_REG Bit7:  1;
  68.   NU_REG Bit8:  1;
  69.   NU_REG Bit9:  1;
  70.   NU_REG Bit10:  1;
  71.   NU_REG Bit11:  1;
  72.   NU_REG Bit12:  1;
  73.   NU_REG Bit13:  1;
  74.   NU_REG Bit14:  1;
  75.   NU_REG Bit15:  1;
  76.   NU_REG Bit16:  1;
  77.   NU_REG Bit17:  1;
  78.   NU_REG Bit18:  1;
  79.   NU_REG Bit19:  1;
  80.   NU_REG Bit20:  1;
  81.   NU_REG Bit21:  1;
  82.   NU_REG Bit22:  1;
  83.   NU_REG Bit23:  1;
  84.   NU_REG Bit24:  1;
  85.   NU_REG Bit25:  1;
  86.   NU_REG Bit26:  1;
  87.   NU_REG Bit27:  1;
  88.   NU_REG Bit28:  1;
  89.   NU_REG Bit29:  1;
  90.   NU_REG Bit30:  1;
  91.   NU_REG Bit31:  1;
  92. }NU_BITs;
  93. //===============================================//
  94. typedef volatile struct
  95. {
  96.   NU_REG Pin0:  1;
  97.   NU_REG Pin1:  1;
  98.   NU_REG Pin2:  1;
  99.   NU_REG Pin3:  1;
  100.   NU_REG Pin4:  1;
  101.   NU_REG Pin5:  1;
  102.   NU_REG Pin6:  1;
  103.   NU_REG Pin7:  1;
  104.   NU_REG Pin8:  1;
  105.   NU_REG Pin9:  1;
  106.   NU_REG Pin10:  1;
  107.   NU_REG Pin11:  1;
  108.   NU_REG Pin12:  1;
  109.   NU_REG Pin13:  1;
  110.   NU_REG Pin14:  1;
  111.   NU_REG Pin15:  1;
  112.   NU_REG Pin16:  1;
  113.   NU_REG Pin17:  1;
  114.   NU_REG Pin18:  1;
  115.   NU_REG Pin19:  1;
  116.   NU_REG Pin20:  1;
  117.   NU_REG Pin21:  1;
  118.   NU_REG Pin22:  1;
  119.   NU_REG Pin23:  1;
  120.   NU_REG Pin24:  1;
  121.   NU_REG Pin25:  1;
  122.   NU_REG Pin26:  1;
  123.   NU_REG Pin27:  1;
  124.   NU_REG Pin28:  1;
  125.   NU_REG Pin29:  1;
  126.   NU_REG Pin30:  1;
  127.   NU_REG Pin31:  1;
  128. }NU_PINs;
  129. //============================================
  130. typedef volatile union
  131. {
  132.   __IO NU_REG  Regs;
  133.   __IO NU_BITs Bits;
  134. }NU_REG_BITs;
  135. typedef volatile union
  136. {
  137.   __IO NU_REG  Regs;
  138.   __IO NU_PINs Bits;
  139. }NU_REG_PINs;
  140. typedef struct
  141. {
  142. __IO NU_REG RESERVED:16;
  143.     __IO NU_REG OFFD0:1;
  144.     __IO NU_REG OFFD1:1;
  145.     __IO NU_REG OFFD2:1;
  146.     __IO NU_REG OFFD3:1;
  147.     __IO NU_REG OFFD4:1;
  148.     __IO NU_REG OFFD5:1;
  149.     __IO NU_REG OFFD6:1;
  150.     __IO NU_REG OFFD7:1;
  151.     __IO NU_REG OFFD8:1;
  152.     __IO NU_REG OFFD9:1;
  153.     __IO NU_REG OFFD10:1;
  154.     __IO NU_REG OFFD11:1;
  155.     __IO NU_REG OFFD12:1;
  156.     __IO NU_REG OFFD13:1;
  157.     __IO NU_REG OFFD14:1;
  158.     __IO NU_REG OFFD15:1;
  159. } NU_GPIO_OFFD;

  160. typedef volatile union
  161. {
  162.   NU_REG     Regs;
  163.   GPIO_PMD_T Bits;
  164. }NU_GPIO_PMD_T;
  165. typedef volatile union
  166. {
  167.   NU_REG       Regs;
  168.   NU_GPIO_OFFD Bits;
  169. }NU_GPIO_OFFD_T;
  170. //----------------------------------------------------//
  171. //改造GPIO为结构(不占用空间)
  172. typedef struct
  173. {
  174.     NU_GPIO_PMD_T   PMD;//模式控制(0输入1输出2开漏3准双向)
  175.     NU_GPIO_OFFD_T  OFFD;//数字使能(高16位)
  176.     NU_REG_PINs     DOUT;//数据输出值(低16位)
  177.     NU_REG_PINs     DMASK;//数据输出写屏蔽
  178.     NU_REG_PINs     PIN;//管脚数值(低16位)
  179.     NU_REG_PINs     DBEN;//防反弹使能
  180.     NU_REG_PINs     IMD;//中断模式控制(0边沿触发中断1电平触发中断)
  181.     NU_REG_BITs     IEN;//中断使能(高16位上升沿或高电平,低16位下降沿或低电平)
  182.     NU_REG_PINs     ISRC;//中断源标志
  183. NU_REG          RESERVED[7];//保留,为了构造GPIO结构数组
  184. } NU_GPIO_T;
  185. typedef struct {
  186.   union {
  187.     __IO NU_GPIO_T Px[5];//GPIOs.Px[0].DOUT.Regs |= 1;GPIOs.Px[0].DOUT.Bits.Pin0 = 1;
  188. struct {
  189.      __IO NU_GPIO_T PA;//GPIOs.PA.DOUT.Regs |=1;GPIOs.PA.DOUT.Bits.Pin0=1;
  190.      __IO NU_GPIO_T PB;//GPIOs.PB.DOUT.Regs |=2;GPIOs.PB.DOUT.Bits.Pin1=1;
  191.      __IO NU_GPIO_T PC;//GPIOs.PC.DOUT.Regs |=4;GPIOs.PC.DOUT.Bits.Pin2=1;
  192.      __IO NU_GPIO_T PD;//GPIOs.PD.DOUT.Regs |=8;GPIOs.PD.DOUT.Bits.Pin3=1;
  193.      __IO NU_GPIO_T PE;//GPIOs.PE.DOUT.Regs |=16;GPIOs.PE.DOUT.Bits.Pin4=1;
  194. };
  195.   };
  196. }NUS_GPIO, *NUPS_GPIO;
  197. #define NU_BASE_GPIO  ((NUPS_GPIO) GPIOA_BASE)//定义硬件结构指针(硬件地址)
  198. #define GPIOs (*NU_BASE_GPIO)//定位全局结构变量GPIOs
  199. //----------------------------------------------------//
  200. #define GPIOAs  (*((NU_GPIO_T *) GPIOA_BASE))//定位全局结构变量GPIOAs
  201. #define GPIOBs  (*((NU_GPIO_T *) GPIOB_BASE))//定位全局结构变量GPIOBs
  202. #define GPIOCs  (*((NU_GPIO_T *) GPIOC_BASE))//定位全局结构变量GPIOCs
  203. #define GPIODs  (*((NU_GPIO_T *) GPIOD_BASE))//定位全局结构变量GPIODs
  204. #define GPIOEs  (*((NU_GPIO_T *) GPIOE_BASE))//定位全局结构变量GPIOEs
  205. //----------------------------------------------------//
  206. #define GPIOx(x)  ((NU_GPIO_T *) (GPIOA_BASE  + x * 0x0040))
  207. #define Px(x)     ((NU_GPIO_T *) (GPIOA_BASE  + x * 0x0040))
  208. #define SPIx(x)   ((SPI_T *)  (SPI0_BASE   + (x & 1) * 0x4000) + ((x >> 1) * 0x100000))
  209. #define TIMERx(x) ((TIMER_T *)(TIMER0_BASE + (x & 1) * 0x0020) + ((x >> 1) * 0x100000))
  210. #define I2Cx(x)   ((I2C_T *)  (I2C0_BASE   + x * 0x100000))
  211. #define PWMx(x)   ((PWM_T *)  (PWMA_BASE   + x * 0x100000))
  212. #define PDMAx(x)  ((PDMA_T *) (PDMA0_BASE  + x * 0x0100))
  213. #define UARTx(x)  ((UART_T *) (UART0_BASE + (x & 1) * 0x100000) + ((x >> 1) * 0x104000))
  214. #define Ux(x)     ((UART_T *) (UART0_BASE + (x & 1) * 0x100000) + ((x >> 1) * 0x104000))
  215. #ifdef __cplusplus
  216. }
  217. #endif
  218. #endif  /* __NUC1xxcfg_H__ */

 楼主| hotpower 发表于 2010-10-22 00:40 | 显示全部楼层
工程浩大,俺就先做到这里~~~觉得这次真用上华邦的M0了,就像做NXP的LPC11xxcfg.h一样全部做完。

寄存器写法:
GPIOA->DOUT |= 1 << 5;
GPIOx(0)->DOUT.Regs |= 1 << 5;
GPIOs.PA.DOUT.Regs |= 1 << 5;
GPIOs.Px[0].DOUT.Regs |= 1 << 5;
位域写法:
//GPIOA->DOUT |= 1 << 5;
GPIOx(0)->DOUT.Bits,Pin5 = 1;
GPIOs.PA.DOUT.Bits,Pin5 = 1;
GPIOs.Px[0].DOUT.Bits,Pin5 = 1;
寄存器写法:
GPIOs.PA.DOUT.Regs &= ~(1 << 5);
位域写法:
GPIOs.PA.DOUT.Bits.Pin5 = 0;
原野之狼 发表于 2010-10-22 00:40 | 显示全部楼层
BS菜农不留沙发的行为:lol
 楼主| hotpower 发表于 2010-10-22 00:43 | 显示全部楼层
用.Regs和.Bits显式地告诉右值应该是值还是位。
写法长了但累的是编译器,结果是一样的。
X-Hawk 发表于 2010-10-22 00:46 | 显示全部楼层
菜农大侠讲讲,这个风格的特点和优势。
虚心学习,搬凳子听教诲。
 楼主| hotpower 发表于 2010-10-22 00:47 | 显示全部楼层
迷糊了,明天要有精力抢板子~~~

俺只改造了GPIO_T为GPIO_Tx,其他没改造,试试俺的“红杏系列”威力如何~~~
 楼主| hotpower 发表于 2010-10-22 00:52 | 显示全部楼层
菜农大侠讲讲,这个风格的特点和优势。
虚心学习,搬凳子听教诲。
X-Hawk 发表于 2010-10-22 00:46


这种风格是控制到位,想错都难~~~

例如NXP的LPC11xx

//KEY1宏定义三板斧
#define PioKey1   PIO2_6 //P2.6
#define PortKey1  P2     //P2
#define PinKey1   Pin6   //Px.6
//KEY2宏定义三板斧
#define PioKey2   PIO2_0 //P2.0
#define PortKey2  P2     //P2
#define PinKey2   Pin0   //Px.0
//LED1宏定义三板斧
#define PioLed1   PIO1_8 //P1.8
#define PortLed1  P1     //P1
#define PinLed1   Pin8   //Px.8
//LED2宏定义三板斧
#define PioLed2   PIO0_2 //P0.2
#define PortLed2  P0     //P0
#define PinLed2   Pin2   //Px.2
//LED3宏定义三板斧
#define PioLed3   PIO2_7 //P2.7
#define PortLed3  P2     //P2
#define PinLed3   Pin7   //Px.7
//LED4宏定义三板斧
#define PioLed4   PIO2_8 //P2.8
#define PortLed4  P2     //P2
#define PinLed4   Pin8   //Px.8
//LED5宏定义三板斧
#define PioLed5   PIO2_1 //P2.1
#define PortLed5  P2     //P2
#define PinLed5   Pin1   //Px.1
//LED6宏定义三板斧
#define PioLed6   PIO1_9 //P1.9
#define PortLed6  P1     //P1
#define PinLed6   Pin9   //Px.9
//LED7宏定义三板斧
#define PioLed7   PIO3_4 //P3.4
#define PortLed7  P3     //P3
#define PinLed7   Pin4   //Px.4
//LED8宏定义三板斧
#define PioLed8   PIO3_5 //P3.5
#define PortLed8  P3     //P3
#define PinLed8   Pin5   //Px.5
//BEEP宏定义三板斧
#define PioBeep   PIO0_8 //P0.8
#define PortBeep  P0     //P0
#define PinBeep   Pin8   //Px.8

//  PortLed2.DATA.Bits.PinLed2 ^= 1;
//  P0.DATA.Bits.Pin2 ^= 1;
//  Px(0).DATA.Bits.Pin2 ^= 1;
//  PIO.PORT[0].DATA.Bits.Pin2 ^= 1;//LED2
   PIO.PORT0.DATA.Bits.Pin2 ^= 1;//LED2
//  PortLed3.DATA.Bits.PinLed3 ^= 1;
//  P2.DATA.Bits.Pin7 ^= 1;
//  Px(2).DATA.Bits.Pin7 ^= 1;
//  PIO.PORT[2].DATA.Bits.Pin7 ^= 1;//LED3
   PIO.PORT2.DATA.Bits.Pin7 ^= 1;//LED3
//  PortLed4.DATA.Bits.PinLed4 ^= 1;
//  P2.DATA.Bits.Pin8 ^= 1;
//  Px(2).DATA.Bits.Pin8 ^= 1;
//  PIO.PORT2.DATA.Bits.Pin8 ^= 1;//LED4
   PIO.PORT[2].DATA.Bits.Pin8 ^= 1;//LED4
//  PortLed5.DATA.Bits.PinLed5 ^= 1;
//  P2.DATA.Bits.Pin1 ^= 1;
//  Px(2).DATA.Bits.Pin1 ^= 1;
//  PIO.PORT2.DATA.Bits.Pin1 ^= 1;//LED5
   PIO.PORT[2].DATA.Bits.Pin1 ^= 1;//LED5
//  PortLed6.DATA.Bits.PinLed6 ^= 1;
//  P1.DATA.Bits.Pin9 ^= 1;
//  Px(1).DATA.Bits.Pin9 ^= 1;
//  PIO.PORT1.DATA.Bits.Pin9 ^= 1;//LED6
 楼主| hotpower 发表于 2010-10-22 01:00 | 显示全部楼层
说实话,华邦的outpw()和inpw()最倒塌~~~

俺也试过了,华邦的库函数是不能用于C++编程的, 而Keil和iar都是支持C++编程的。

晕,头文件难道就多这句话???
#ifdef __cplusplus
extern "C" {
#endif
//....................
#ifdef __cplusplus
}
#endif

实在晕呀~~~加上又不影响C语言的编程。
X-Hawk 发表于 2010-10-22 01:14 | 显示全部楼层
9楼说的极是!这个的确最好加入。

对用.Regs和.Bits的办法有点感冒,仿佛有匈牙利表示法的味道。
123jj 发表于 2010-10-22 04:31 | 显示全部楼层
支持HOT大叔,光大红杏风格
tg.liu 发表于 2010-10-22 07:22 | 显示全部楼层
俺比较懒, 直接拿Keil来用了

写端口 NUC_GPIOB->DOUT=0X55AA;
读端口 xxx =  NUC_GPIOB->PIN;

当然官方驱动库有些还是不错的, 例如UART, 我就比较喜欢, 至少不用自己去算波特率.

比较麻烦的就是USB,  不知道怎么用他那个库, 干脆自己整了个.

现在在搞I2C, 又有点摸不清楚了, 那个DrvI2C_Ctrl写的也...
如果能写成位或的形式那一看表达式就明白了, 如: DrvI2C_Ctrl(I2C_PORT0, STA | STO...)
现在想在从模式时对接收到的数据进行NAK, 不知道咋搞...
 楼主| hotpower 发表于 2010-10-22 07:34 | 显示全部楼层
本帖最后由 hotpower 于 2010-10-22 08:23 编辑

俺看了几天华邦的uart,i2c,spi的编程,实在是晕!在这点上,nxp的很规范,编程特简单。可能是华邦的这些模块的功能很强大,导致了编程难度的增大。华邦的库函数应用中断回调函数,这无可非议,它有点delphi编程添加事件处理函数据的影子。但这是否必要?究竟m0不是pc机。
walnutcy 发表于 2010-10-22 08:30 | 显示全部楼层
老HOT不睡觉啊,牛牛
 楼主| hotpower 发表于 2010-10-22 09:08 | 显示全部楼层
晕,俺迷糊了。
如果大家觉得这种风格好用,俺就继续扩展到所有的寄存器并控制到位。
若觉得没什么用,俺就自己用到那里就扩展到那里。
jack_shine 发表于 2010-10-22 09:27 | 显示全部楼层
jack_shine 发表于 2010-10-22 09:27 | 显示全部楼层
标记下~~~
 楼主| hotpower 发表于 2010-10-22 10:51 | 显示全部楼层
DrvGPIO_Open()中的IO_INPUT和IO_OUTPUT在DevGPIO.h中的顺序搞反了。
晕!虽然不影响库函数的调用。
还有的就是uart0,1,2地址分配
总之有很多不合理的地方,导致了代码长度的增加。
batsong 发表于 2010-10-22 11:07 | 显示全部楼层
做个记号,等我一会去领了开发板慢慢看
hwq362202 发表于 2010-10-22 11:40 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21617

帖子

508

粉丝
快速回复 在线客服 返回列表 返回顶部