打印

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

[复制链接]
7023|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2010-10-22 00:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hotpower 于 2010-10-23 00:52 编辑

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

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

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

几种方法全部通过测试。
 
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* 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();
}

}



相关帖子

沙发
hotpower|  楼主 | 2010-10-22 00:31 | 只看该作者
本帖最后由 hotpower 于 2010-10-22 23:48 编辑
 
/*--------------------------------------------------------------------------
文   件   名 :  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__ */

使用特权

评论回复
板凳
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

使用特权

评论回复
5
hotpower|  楼主 | 2010-10-22 00:43 | 只看该作者
用.Regs和.Bits显式地告诉右值应该是值还是位。
写法长了但累的是编译器,结果是一样的。

使用特权

评论回复
6
X-Hawk| | 2010-10-22 00:46 | 只看该作者
菜农大侠讲讲,这个风格的特点和优势。
虚心学习,搬凳子听教诲。

使用特权

评论回复
7
hotpower|  楼主 | 2010-10-22 00:47 | 只看该作者
迷糊了,明天要有精力抢板子~~~

俺只改造了GPIO_T为GPIO_Tx,其他没改造,试试俺的“红杏系列”威力如何~~~

使用特权

评论回复
8
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

使用特权

评论回复
9
hotpower|  楼主 | 2010-10-22 01:00 | 只看该作者
说实话,华邦的outpw()和inpw()最倒塌~~~

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

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

实在晕呀~~~加上又不影响C语言的编程。

使用特权

评论回复
10
X-Hawk| | 2010-10-22 01:14 | 只看该作者
9楼说的极是!这个的确最好加入。

对用.Regs和.Bits的办法有点感冒,仿佛有匈牙利表示法的味道。

使用特权

评论回复
11
123jj| | 2010-10-22 04:31 | 只看该作者
支持HOT大叔,光大红杏风格

使用特权

评论回复
12
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, 不知道咋搞...

使用特权

评论回复
13
hotpower|  楼主 | 2010-10-22 07:34 | 只看该作者
本帖最后由 hotpower 于 2010-10-22 08:23 编辑

俺看了几天华邦的uart,i2c,spi的编程,实在是晕!在这点上,nxp的很规范,编程特简单。可能是华邦的这些模块的功能很强大,导致了编程难度的增大。华邦的库函数应用中断回调函数,这无可非议,它有点delphi编程添加事件处理函数据的影子。但这是否必要?究竟m0不是pc机。

使用特权

评论回复
14
walnutcy| | 2010-10-22 08:30 | 只看该作者
老HOT不睡觉啊,牛牛

使用特权

评论回复
15
hotpower|  楼主 | 2010-10-22 09:08 | 只看该作者
晕,俺迷糊了。
如果大家觉得这种风格好用,俺就继续扩展到所有的寄存器并控制到位。
若觉得没什么用,俺就自己用到那里就扩展到那里。

使用特权

评论回复
16
jack_shine| | 2010-10-22 09:27 | 只看该作者
:)

使用特权

评论回复
17
jack_shine| | 2010-10-22 09:27 | 只看该作者
标记下~~~

使用特权

评论回复
18
hotpower|  楼主 | 2010-10-22 10:51 | 只看该作者
DrvGPIO_Open()中的IO_INPUT和IO_OUTPUT在DevGPIO.h中的顺序搞反了。
晕!虽然不影响库函数的调用。
还有的就是uart0,1,2地址分配
总之有很多不合理的地方,导致了代码长度的增加。

使用特权

评论回复
19
batsong| | 2010-10-22 11:07 | 只看该作者
做个记号,等我一会去领了开发板慢慢看

使用特权

评论回复
20
hwq362202| | 2010-10-22 11:40 | 只看该作者
:)

使用特权

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

本版积分规则

1538

主题

21697

帖子

505

粉丝