NuTiny-SDK-120例程调试通过

[复制链接]
 楼主| hotpower 发表于 2010-10-22 18:37 | 显示全部楼层 |阅读模式
源文件用库编译代码长度为1076,“红杏”出手只需884个字节。
tg.liu 发表于 2010-10-22 18:40 | 显示全部楼层
呵呵, 不愧是"红杏"牌
 楼主| hotpower 发表于 2010-10-22 18:49 | 显示全部楼层
本帖最后由 hotpower 于 2010-10-22 18:59 编辑

把无关的DrvGPIO.C和DrvUART.C移出工程后只有604个字节。
 楼主| hotpower 发表于 2010-10-22 18:56 | 显示全部楼层
三级优化再把闪烁改成异或,只有548个字节
zhuyjgh 发表于 2010-10-22 22:08 | 显示全部楼层
开始学习hot老大的优化方法~~
黑发尤物 发表于 2010-10-22 22:22 | 显示全部楼层
hot大叔太牛了,学习下
 楼主| hotpower 发表于 2010-10-22 22:36 | 显示全部楼层
本帖最后由 hotpower 于 2010-10-22 23:45 编辑

  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 22:38 | 显示全部楼层
本帖最后由 hotpower 于 2010-10-23 00:53 编辑

5种方法都测试通过,下面是改造的Smpl_NuTiny-EVB-NUC120.c:

  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-23 01:09 | 显示全部楼层
跪求斑竹NuTiny-SDK-120板的ISP固件下载地址

该主题被21ic网管封杀!!!
zhuyjgh 发表于 2010-10-23 08:30 | 显示全部楼层
hot老大是真有精神~~佩服~~
 楼主| hotpower 发表于 2010-10-23 09:32 | 显示全部楼层
晕,俺经常迷糊
zhuyjgh 发表于 2010-10-23 11:44 | 显示全部楼层
初尝红杏系列味道,,不设变量,,不调函数,,底层操作,,一步到位,,够劲!!
操作模式多,,还不容易错,,总结这种方式可真要相当的火候啊~~
佩服hot老大的硬软件功底,,
 楼主| hotpower 发表于 2010-10-23 12:12 | 显示全部楼层
这个红杏系列和其他(51,dsp,arm7,m0)最大的区别在于兼容而非全部抛弃。.Regs和.Bits虽然繁琐,但暗示明显,像GPIOA->PMD后应该写值还是位?这样非常容易出错。俺写的LPC11XXcfg.h非常完美,还未发布。nuc最大的难点是uart结构数组的构建。它的地址分配太倒塌,设计者应该拉出去枪毙了…
zhuyjgh 发表于 2010-10-23 12:37 | 显示全部楼层
hot老大,,头文件直接替换掉不好吗??这样搞还要带着原来的头文件,,多了一个啊,,呵呵,,
我还在慢慢理解其中的奥妙~~
zhuyjgh 发表于 2010-10-23 17:04 | 显示全部楼层
本帖最后由 zhuyjgh 于 2010-10-23 17:08 编辑

把DrvGPIO_Open改成了hot老大的模式试了下,,

  1. int32_t DrvGPIO_Open(E_DRVGPIO_PORT port, int32_t i32Bit, E_DRVGPIO_IO mode)
  2. {
  3.     if((port>=0)&&(port<=5)&&(i32Bit>=0)&&(i32Bit<=31)&&(mode>=0)&&(mode<=3))
  4.         {
  5.               GPIOx(port)->PMD.Regs&=~(0x00000003<<(i32Bit<<1));
  6.               GPIOx(port)->PMD.Regs|= mode<<(i32Bit<<1);
  7.                 return E_SUCCESS;
  8.         }
  9.         else return NULL;
  10. }
code从960降到928,,呵呵,,
这种使用方法还不会用,,还望hot老大多多指点啊,,
 楼主| hotpower 发表于 2010-10-23 17:36 | 显示全部楼层
别老大的,像是黑社会!这种库的编写者应该进地狱!入口参数若是无符号会是怎样?晕死了…
dong_abc 发表于 2010-10-23 18:17 | 显示全部楼层
zhuyjgh 发表于 2010-10-23 18:38 | 显示全部楼层
本帖最后由 zhuyjgh 于 2010-10-23 18:41 编辑

16# hotpower

教训的是,,希望能给个模块的完整的应用参考下,,现在我把头文件格式搞清楚了,,但是不会用,,郁闷呢~~
这样操作寄存器是很方便,,如果想把功能模块写成函数(就如同DrvGPIO_Open),,还是要像官方的驱动库那也写吗??
 楼主| hotpower 发表于 2010-10-23 21:01 | 显示全部楼层
红杏系列的目的是让操作位出错概率降到最低,与库函数无关。
库函数的多次调用也可降低代码的长度。
这是这种以速度低下换取空间的手法之一。
再者库函数没可加入错误校验以减小出错的几率。
还有库函数可以隐藏一些功能的实现过程。降低设计的门槛。
总之是不一样的。
bit6019 发表于 2010-10-23 21:14 | 显示全部楼层
恭喜啦,同时也学习下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21619

帖子

508

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