打印

NuTiny-SDK-120例程调试通过

[复制链接]
4398|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2010-10-22 18:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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个字节

使用特权

评论回复
5
zhuyjgh| | 2010-10-22 22:08 | 只看该作者
开始学习hot老大的优化方法~~

使用特权

评论回复
6
黑发尤物| | 2010-10-22 22:22 | 只看该作者
hot大叔太牛了,学习下

使用特权

评论回复
7
hotpower|  楼主 | 2010-10-22 22:36 | 只看该作者
本帖最后由 hotpower 于 2010-10-22 23:45 编辑
 
/*--------------------------------------------------------------------------
文   件   名 :  NUC1xxcfg.h
创   建   人 :  Cortex-M0菜鸟HotPower@163.com
创 建 日  期 :  2010.10.18   18:18
最近修改日期 :  2010.10.22   23:38
创 建  地 点 : 西安大雁塔村队部
版   本   号 : V1.03 (红杏版)
修 改  原 因 :
说        明 :
备        注 : 本头文件风格归属于菜农的《红杏出墙》系列,堪称“红杏级别”
                将本文件拷贝到...\NUC1xxBSP\CMSIS\CM0内。
-------------------------------------------------------------------------------*/
#ifndef __NUC1xxcfg_H__
#define __NUC1xxcfg_H__
#ifdef __cplusplus
extern "C" {
#endif
#if defined (__CC_ARM)
  #pragma anon_unions
#endif

typedef volatile unsigned int NU_REG;// Hardware register definition
#define __noinit__ __attribute__((zero_init))//变量不初始化为0
typedef enum
{
__0 = (NU_REG)0,
__1 = (NU_REG)1,
__2 = (NU_REG)2,
__3 = (NU_REG)3,
__4 = (NU_REG)4,
__5 = (NU_REG)5,
__6 = (NU_REG)6,
__7 = (NU_REG)7,
__8 = (NU_REG)8,
__9 = (NU_REG)9,
__10 = (NU_REG)10,
__11 = (NU_REG)11,
__12 = (NU_REG)12,
__13 = (NU_REG)13,
__14 = (NU_REG)14,
__15 = (NU_REG)15,
__16 = (NU_REG)16,
__17 = (NU_REG)17,
__18 = (NU_REG)18,
__19 = (NU_REG)19,
__20 = (NU_REG)20,
__21 = (NU_REG)21,
__22 = (NU_REG)22,
__23 = (NU_REG)23,
__24 = (NU_REG)24,
__25 = (NU_REG)25,
__26 = (NU_REG)26,
__27 = (NU_REG)27,
__28 = (NU_REG)28,
__29 = (NU_REG)29,
__30 = (NU_REG)30,
__31 = (NU_REG)31
}Number_enum;
typedef volatile struct
{
  NU_REG Bit0:  1;
  NU_REG Bit1:  1;
  NU_REG Bit2:  1;
  NU_REG Bit3:  1;
  NU_REG Bit4:  1;
  NU_REG Bit5:  1;
  NU_REG Bit6:  1;
  NU_REG Bit7:  1;
  NU_REG Bit8:  1;
  NU_REG Bit9:  1;
  NU_REG Bit10:  1;
  NU_REG Bit11:  1;
  NU_REG Bit12:  1;
  NU_REG Bit13:  1;
  NU_REG Bit14:  1;
  NU_REG Bit15:  1;
  NU_REG Bit16:  1;
  NU_REG Bit17:  1;
  NU_REG Bit18:  1;
  NU_REG Bit19:  1;
  NU_REG Bit20:  1;
  NU_REG Bit21:  1;
  NU_REG Bit22:  1;
  NU_REG Bit23:  1;
  NU_REG Bit24:  1;
  NU_REG Bit25:  1;
  NU_REG Bit26:  1;
  NU_REG Bit27:  1;
  NU_REG Bit28:  1;
  NU_REG Bit29:  1;
  NU_REG Bit30:  1;
  NU_REG Bit31:  1;
}NU_BITs;
//===============================================//
typedef volatile struct
{
  NU_REG Pin0:  1;
  NU_REG Pin1:  1;
  NU_REG Pin2:  1;
  NU_REG Pin3:  1;
  NU_REG Pin4:  1;
  NU_REG Pin5:  1;
  NU_REG Pin6:  1;
  NU_REG Pin7:  1;
  NU_REG Pin8:  1;
  NU_REG Pin9:  1;
  NU_REG Pin10:  1;
  NU_REG Pin11:  1;
  NU_REG Pin12:  1;
  NU_REG Pin13:  1;
  NU_REG Pin14:  1;
  NU_REG Pin15:  1;
  NU_REG Pin16:  1;
  NU_REG Pin17:  1;
  NU_REG Pin18:  1;
  NU_REG Pin19:  1;
  NU_REG Pin20:  1;
  NU_REG Pin21:  1;
  NU_REG Pin22:  1;
  NU_REG Pin23:  1;
  NU_REG Pin24:  1;
  NU_REG Pin25:  1;
  NU_REG Pin26:  1;
  NU_REG Pin27:  1;
  NU_REG Pin28:  1;
  NU_REG Pin29:  1;
  NU_REG Pin30:  1;
  NU_REG Pin31:  1;
}NU_PINs;
//============================================
typedef volatile union
{
  __IO NU_REG  Regs;
  __IO NU_BITs Bits;
}NU_REG_BITs;
typedef volatile union
{
  __IO NU_REG  Regs;
  __IO NU_PINs Bits;
}NU_REG_PINs;
typedef struct
{
__IO NU_REG RESERVED:16;
    __IO NU_REG OFFD0:1;
    __IO NU_REG OFFD1:1;
    __IO NU_REG OFFD2:1;
    __IO NU_REG OFFD3:1;
    __IO NU_REG OFFD4:1;
    __IO NU_REG OFFD5:1;
    __IO NU_REG OFFD6:1;
    __IO NU_REG OFFD7:1;
    __IO NU_REG OFFD8:1;
    __IO NU_REG OFFD9:1;
    __IO NU_REG OFFD10:1;
    __IO NU_REG OFFD11:1;
    __IO NU_REG OFFD12:1;
    __IO NU_REG OFFD13:1;
    __IO NU_REG OFFD14:1;
    __IO NU_REG OFFD15:1;
} NU_GPIO_OFFD;

typedef volatile union
{
  NU_REG     Regs;
  GPIO_PMD_T Bits;
}NU_GPIO_PMD_T;
typedef volatile union
{
  NU_REG       Regs;
  NU_GPIO_OFFD Bits;
}NU_GPIO_OFFD_T;
//----------------------------------------------------//
//改造GPIO为结构(不占用空间)
typedef struct
{
    NU_GPIO_PMD_T   PMD;//模式控制(0输入1输出2开漏3准双向)
    NU_GPIO_OFFD_T  OFFD;//数字使能(高16位)
    NU_REG_PINs     DOUT;//数据输出值(低16位)
    NU_REG_PINs     DMASK;//数据输出写屏蔽
    NU_REG_PINs     PIN;//管脚数值(低16位)
    NU_REG_PINs     DBEN;//防反弹使能
    NU_REG_PINs     IMD;//中断模式控制(0边沿触发中断1电平触发中断)
    NU_REG_BITs     IEN;//中断使能(高16位上升沿或高电平,低16位下降沿或低电平)
    NU_REG_PINs     ISRC;//中断源标志
NU_REG          RESERVED[7];//保留,为了构造GPIO结构数组
} NU_GPIO_T;
typedef struct {
  union {
    __IO NU_GPIO_T Px[5];//GPIOs.Px[0].DOUT.Regs |= 1;GPIOs.Px[0].DOUT.Bits.Pin0 = 1;
struct {
     __IO NU_GPIO_T PA;//GPIOs.PA.DOUT.Regs |=1;GPIOs.PA.DOUT.Bits.Pin0=1;
     __IO NU_GPIO_T PB;//GPIOs.PB.DOUT.Regs |=2;GPIOs.PB.DOUT.Bits.Pin1=1;
     __IO NU_GPIO_T PC;//GPIOs.PC.DOUT.Regs |=4;GPIOs.PC.DOUT.Bits.Pin2=1;
     __IO NU_GPIO_T PD;//GPIOs.PD.DOUT.Regs |=8;GPIOs.PD.DOUT.Bits.Pin3=1;
     __IO NU_GPIO_T PE;//GPIOs.PE.DOUT.Regs |=16;GPIOs.PE.DOUT.Bits.Pin4=1;
};
  };
}NUS_GPIO, *NUPS_GPIO;
#define NU_BASE_GPIO  ((NUPS_GPIO) GPIOA_BASE)//定义硬件结构指针(硬件地址)
#define GPIOs (*NU_BASE_GPIO)//定位全局结构变量GPIOs
//----------------------------------------------------//
#define GPIOAs  (*((NU_GPIO_T *) GPIOA_BASE))//定位全局结构变量GPIOAs
#define GPIOBs  (*((NU_GPIO_T *) GPIOB_BASE))//定位全局结构变量GPIOBs
#define GPIOCs  (*((NU_GPIO_T *) GPIOC_BASE))//定位全局结构变量GPIOCs
#define GPIODs  (*((NU_GPIO_T *) GPIOD_BASE))//定位全局结构变量GPIODs
#define GPIOEs  (*((NU_GPIO_T *) GPIOE_BASE))//定位全局结构变量GPIOEs
//----------------------------------------------------//
#define GPIOx(x)  ((NU_GPIO_T *) (GPIOA_BASE  + x * 0x0040))
#define Px(x)     ((NU_GPIO_T *) (GPIOA_BASE  + x * 0x0040))
#define SPIx(x)   ((SPI_T *)  (SPI0_BASE   + (x & 1) * 0x4000) + ((x >> 1) * 0x100000))
#define TIMERx(x) ((TIMER_T *)(TIMER0_BASE + (x & 1) * 0x0020) + ((x >> 1) * 0x100000))
#define I2Cx(x)   ((I2C_T *)  (I2C0_BASE   + x * 0x100000))
#define PWMx(x)   ((PWM_T *)  (PWMA_BASE   + x * 0x100000))
#define PDMAx(x)  ((PDMA_T *) (PDMA0_BASE  + x * 0x0100))
#define UARTx(x)  ((UART_T *) (UART0_BASE + (x & 1) * 0x100000) + ((x >> 1) * 0x104000))
#define Ux(x)     ((UART_T *) (UART0_BASE + (x & 1) * 0x100000) + ((x >> 1) * 0x104000))
#ifdef __cplusplus
}
#endif
#endif  /* __NUC1xxcfg_H__ */

使用特权

评论回复
8
hotpower|  楼主 | 2010-10-22 22:38 | 只看该作者
本帖最后由 hotpower 于 2010-10-23 00:53 编辑

5种方法都测试通过,下面是改造的Smpl_NuTiny-EVB-NUC120.c:
 
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
//Smpl_NuTiny-EVB-NUC120.c
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
#include "NUC1xxcfg.h"
void delay_loop(void)
{
uint32_t j;
   for(j=0;j<60000;j++);  
  for(j=0;j<60000;j++);
     for(j=0;j<60000;j++);  
  for(j=0;j<60000;j++);

}

/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/   
int main (void)
{
  // uint32_t i,k;
/* SYSCLK =>12Mhz*/
UNLOCKREG();
    SYSCLK->WRCON.XTL12M_EN = 1;

/*set GPC outpui*/

// DrvGPIO_Open(E_GPB,0, E_IO_OUTPUT);
// GPIOBs.PMD.Bits.PMD0 = E_IO_OUTPUT;
// GPIOs.PB.PMD.Bits.PMD0 = E_IO_OUTPUT;
// GPIOs.Px[1].PMD.Bits.PMD0 = E_IO_OUTPUT;
GPIOx(1)->PMD.Bits.PMD0 = E_IO_OUTPUT;
  
while(1)
{
     
//        DrvGPIO_ClrBit(E_GPB,0);
//        GPIOBs.DOUT.Bits.Pin0 = 0;
//        GPIOBs.DOUT.Bits.Pin0 ^= 1;
//        GPIOs.PB.DOUT.Bits.Pin0 ^= 1;
//        GPIOs.Px[1].DOUT.Bits.Pin0 ^= 1;
        GPIOx(1)->DOUT.Bits.Pin0 ^= 1;
  delay_loop();
//  DrvGPIO_SetBit(E_GPB,0);
//        GPIOBs.DOUT.Bits.Pin0 = 1;
//  delay_loop();
}

}



使用特权

评论回复
9
hotpower|  楼主 | 2010-10-23 01:09 | 只看该作者
跪求斑竹NuTiny-SDK-120板的ISP固件下载地址

该主题被21ic网管封杀!!!

使用特权

评论回复
10
zhuyjgh| | 2010-10-23 08:30 | 只看该作者
hot老大是真有精神~~佩服~~

使用特权

评论回复
11
hotpower|  楼主 | 2010-10-23 09:32 | 只看该作者
晕,俺经常迷糊

使用特权

评论回复
12
zhuyjgh| | 2010-10-23 11:44 | 只看该作者
初尝红杏系列味道,,不设变量,,不调函数,,底层操作,,一步到位,,够劲!!
操作模式多,,还不容易错,,总结这种方式可真要相当的火候啊~~
佩服hot老大的硬软件功底,,

使用特权

评论回复
13
hotpower|  楼主 | 2010-10-23 12:12 | 只看该作者
这个红杏系列和其他(51,dsp,arm7,m0)最大的区别在于兼容而非全部抛弃。.Regs和.Bits虽然繁琐,但暗示明显,像GPIOA->PMD后应该写值还是位?这样非常容易出错。俺写的LPC11XXcfg.h非常完美,还未发布。nuc最大的难点是uart结构数组的构建。它的地址分配太倒塌,设计者应该拉出去枪毙了…

使用特权

评论回复
14
zhuyjgh| | 2010-10-23 12:37 | 只看该作者
hot老大,,头文件直接替换掉不好吗??这样搞还要带着原来的头文件,,多了一个啊,,呵呵,,
我还在慢慢理解其中的奥妙~~

使用特权

评论回复
15
zhuyjgh| | 2010-10-23 17:04 | 只看该作者
本帖最后由 zhuyjgh 于 2010-10-23 17:08 编辑

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

int32_t DrvGPIO_Open(E_DRVGPIO_PORT port, int32_t i32Bit, E_DRVGPIO_IO mode)
{
    if((port>=0)&&(port<=5)&&(i32Bit>=0)&&(i32Bit<=31)&&(mode>=0)&&(mode<=3))
        {
              GPIOx(port)->PMD.Regs&=~(0x00000003<<(i32Bit<<1));
              GPIOx(port)->PMD.Regs|= mode<<(i32Bit<<1);
                return E_SUCCESS;
        }
        else return NULL;
}
code从960降到928,,呵呵,,
这种使用方法还不会用,,还望hot老大多多指点啊,,

使用特权

评论回复
16
hotpower|  楼主 | 2010-10-23 17:36 | 只看该作者
别老大的,像是黑社会!这种库的编写者应该进地狱!入口参数若是无符号会是怎样?晕死了…

使用特权

评论回复
17
dong_abc| | 2010-10-23 18:17 | 只看该作者
学习

使用特权

评论回复
18
zhuyjgh| | 2010-10-23 18:38 | 只看该作者
本帖最后由 zhuyjgh 于 2010-10-23 18:41 编辑

16# hotpower

教训的是,,希望能给个模块的完整的应用参考下,,现在我把头文件格式搞清楚了,,但是不会用,,郁闷呢~~
这样操作寄存器是很方便,,如果想把功能模块写成函数(就如同DrvGPIO_Open),,还是要像官方的驱动库那也写吗??

使用特权

评论回复
19
hotpower|  楼主 | 2010-10-23 21:01 | 只看该作者
红杏系列的目的是让操作位出错概率降到最低,与库函数无关。
库函数的多次调用也可降低代码的长度。
这是这种以速度低下换取空间的手法之一。
再者库函数没可加入错误校验以减小出错的几率。
还有库函数可以隐藏一些功能的实现过程。降低设计的门槛。
总之是不一样的。

使用特权

评论回复
20
bit6019| | 2010-10-23 21:14 | 只看该作者
恭喜啦,同时也学习下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21619

帖子

506

粉丝