用了一次N76E003,和STM8S003相比,说下我的感受

2020-01-12 17:23发布

本帖最后由 zqf441775525 于 2017-7-25 16:35 编辑

在一个小项目上用了一次N76E003,因为N76E003是和STM8S003同价位的,就只比较这2个片子。
跟STM8S003相比起来各有千秋,就Flash大小方面来说,18K,比STM8S003大多了,Demo程序也很全。但是和STM8S003相比有以下缺点:

1、外部时钟引脚,只有OSC_IN,没有OSC_OUT,那么如果使用外部OSC,估计只能使用有源晶振。
2、GPIO可以设置成准双向口,没有上拉输入模式,而且,如果要使用GPIO的外部中断,还必须把GPIO设置成输入模式,不能设置成“准双向口”,这样问题来了:如果要使用外部中断,那么这个中断脚必须要加外部上拉电阻。
3、使用NU-LINK在线调试,下载速度很慢,我用的keil9.1,大约7K的程序,点击完“Debug”按钮以后,程序进行“擦除”,“下载”,“校验”等操作,要差不多20S才能搞定,进入Debug界面。相同程序量的STM8,用IAR,大约2S就可以进入调试界面了。
4、虽说比STM8多一个IO口,但其实是多了半个IO口,RST引脚作用IO口使用的时候,只能作为输入口。而且,NULINK调试需要3根线(SCLK,SDA,RST),STM8调试只需要2根线(RST,SWIM),无形之中就比STM8少一个IO口了。就调试方便性来说,跟STM8还差的远。
5、SPI接口,N76E003没有“单线仅输出”模式,也就是说,只要用了硬件SPI,SCK、MOSI、MISO这3个脚就必须复用成SPI引脚,在有些场合(比如要驱动SPI显示屏,只需要SCK和MOSI,不需要MISO),那么MISO这个引脚就浪费掉了。


以上5点缺陷也许有我自身的原因,没有设置好,或者没有找到设置的地方。请用过这个片子的来说说,交流一下。

编辑原因:添加以下说明
说明:上述第2点,关于GPIO的中断,设置成准双向口后,可以进入中断,是我之前测试不全面,不是N76E003的缺陷。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
99条回答
wmm20031015
2020-01-13 10:48
zqf441775525 发表于 2017-7-24 22:17
是的,如果设置成准双向口,就进不了中断。

兄弟用过NULINK吗?确定是我的NULINK有问题?如果是的话,我 ...

手上没有N76E003的芯片,拿N76E885的DEMO板实测,设置成准双向,外部中断0、1都可以正常进入,9K的程序仿真,从点按键开始到进入仿真模式停在第一条语句,时间不超过5秒。

N76E885与N76E003有些差异,这里的INT0、INT1是在P00、P01引脚,与仿真口复用,所以烧写后要复位仿真器,释放仿真器的输出0电平,P00、P01才会是高电平。

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technoledge Corp.
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Jan/07/2015
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E885 I/O Interrupt demo code
//***********************************************************************************************************

#include <stdio.h>
#include "N76E885.h"
#include "Version.h"
#include "Typedef.h"
#include "Define.h"
#include "SFR_Macro.h"
#include "Common.h"
#include "Delay.h"
#include "font.h"
/*
//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
//
//<e0> System Clock Source Configuration
// <o1> System Clock Source Selection
//      <0=> 2~25MHz    XTAL
//      <1=> 32.768KHz  XTAL
//      <2=> 22.1184MHz Internal
//      <3=> 10KHz      Internal
//      <4=> OSC-In     External
//</e>
//
//<e2> Clock Divider Configuration
//     <o3.0..7>  System Clock Source Devider <1-255:1>
//                     <i> Fsys = (System Clock Source) / (2 * Devider)
//</e>
//
//<h> Port Interrupt Option
// <o4.0..1> Port Pin Selection <0=> Port0 <1=> Port1  <2=> Port2  <3=> Port3
//  <h> Edge/Level
//      <o4.2> Channel 0,   trigger type selection <0=> Level <1=> Edge
//      <o4.3> Channel 1,   trigger type selection <0=> Level <1=> Edge
//      <o4.4> Channel 2,   trigger type selection <0=> Level <1=> Edge
//      <o4.5> Channel 3,   trigger type selection <0=> Level <1=> Edge
//      <o4.6> Channel 5,4, trigger type selection <0=> Level <1=> Edge
//      <o4.7> Channel 7,6, trigger type selection <0=> Level <1=> Edge
//  </h>
//  <h>  Falling/Level
//      <q5.0> Channel 0, Enabled level/falling edge detect.
//      <q5.1> Channel 1, Enabled level/falling edge detect.
//      <q5.2> Channel 2, Enabled level/falling edge detect.
//      <q5.3> Channel 3, Enabled level/falling edge detect.
//      <q5.4> Channel 4, Enabled level/falling edge detect.
//      <q5.5> Channel 5, Enabled level/falling edge detect.
//      <q5.6> Channel 6, Enabled level/falling edge detect.
//      <q5.7> Channel 7, Enabled level/falling edge detect.
//  </h>
//  <h>  Rising/Level
//      <q6.0> Channel 0, Enabled level/rising edge detect.
//      <q6.1> Channel 1, Enabled level/rising edge detect.
//      <q6.2> Channel 2, Enabled level/rising edge detect.
//      <q6.3> Channel 3, Enabled level/rising edge detect.
//      <q6.4> Channel 4, Enabled level/rising edge detect.
//      <q6.5> Channel 5, Enabled level/rising edge detect.
//      <q6.6> Channel 6, Enabled level/rising edge detect.
//      <q6.7> Channel 7, Enabled level/rising edge detect.
//  </h>
//</h>
//
//-------- <<< end of configuration section >>> ------------------------------
*/

#define SYS_CLK_EN      0
#define SYS_SEL         2
#define SYS_DIV_EN      0                   //0: Fsys=Fosc, 1: Fsys = Fosc/(2*CKDIV)
#define SYS_DIV         1
#define PICON_VAL       0xFC|0x03           //Pin Interrupt Control
#define PINEN_VAL       0xFF                //Pin Interrupt Negative Polarity Enable.
#define PIPEN_VAL       0xFF                //Pin Interrupt Positive Polarity Enable.
bit BIT_TMP;
/*----------------------------------------------------------------------------
  Check the register settings
*----------------------------------------------------------------------------*/
#define CHECK_RANGE(val, min, max)          ((val < min) || (val > max))
#define CHECK_RSVD(val, mask)               (val & mask)
/*
#if (PICON_VAL&0x03) == 0x01  //Port1, only P1[2:0] available
    #if CHECK_RSVD(PINEN_VAL, ~0x07)
        #error "Port1[2:0] Interrup Pin Select Error"
    #elif CHECK_RSVD(PIPEN_VAL, ~0x07)
        #error "Port1[2:0] Interrup Pin Select Error"
    #endif
#endif

#if (PICON_VAL&0x03) == 0x02  //Port2, only P2[6:0] available
    #if CHECK_RSVD(PINEN_VAL, ~0x7F)
        #error "Port2[6:0] Interrup Pin Select Error"
    #elif CHECK_RSVD(PIPEN_VAL, ~0x7F)
        #error "Port2[6:0] Interrup Pin Select Error"
    #endif
#endif
*/
/******************************************************************************
* FUNCTION_PURPOSE: I/O Pin interrupt Service Routine
******************************************************************************/
void PinInterrupt_ISR (void) interrupt 7
{
    unsigned char tPIF;
        tPIF=PIF;
        printf("PIF=0x%x ",tPIF);
        PIF = 0x00;                             //clear interrupt flag
   
    #if (PICON_VAL&0x03) == 0x00            //Port0 are interrupt pin
        P30 = ~P30;
    #endif
   
    #if (PICON_VAL&0x03) == 0x01            //Port1 are interrupt pin
        P30 = ~P30;
    #endif
   
    #if (PICON_VAL&0x03) == 0x02            //Port2 are interrupt pin
        P30 = ~P30;
    #endif
   
    #if (PICON_VAL&0x03) == 0x03            //Port3 are interrupt pin
        //P00 = ~P00;
    #endif
}

void EX0_ISR (void) interrupt 0
{
        printf("EX0! ");
}

void EX1_ISR (void) interrupt 2
{
        printf("EX1! ");
}
/******************************************************************************
The main C function.  Program execution starts
here after stack initialization.
******************************************************************************/
void main (void)
{
    /* Note
       MCU power on system clock is HIRC (22.1184MHz), so Fsys = 22.1184MHz
    */
   
    Set_All_GPIO_Quasi_Mode();
    InitialUART0_Timer1_Type1(9600);             /* 9600 Baud Rate*/

    Show_FW_Version_Number_To_PC();

    printf (" *===================================================================");
    printf (" *  Name: N76E885 Pins Interrupt Demo Code.");
    printf (" *=================================================================== ");
        
    /* Change system closk source */
    #if SYS_CLK_EN == 1
        #if   SYS_SEL == 0
            System_Clock_Select(E_HXTEN);   //Fosc = 2~25MHz XTAL
        #elif SYS_SEL == 1
            System_Clock_Select(E_LXTEN);   //Fosc = 32.768KHz XTAL
        #elif SYS_SEL == 2
            System_Clock_Select(E_HIRCEN);  //Fosc = 22.1184MHz Internal RC
        #elif SYS_SEL == 3
            System_Clock_Select(E_LIRCEN);  //Fosc = 10KHz Internal RC
        #elif SYS_SEL == 4
            System_Clock_Select(E_OSCEN);   //Fosc = OSC-In External OSC
        #endif
    #endif
   
    #if SYS_DIV_EN == 1
        CKDIV = SYS_DIV;                        //Fsys = Fosc / (2* CLKDIV) = Fcpu
    #endif
   
    P0 = 0xFF;
    P1 = 0x07;
    P2 = 0x7F;
    P3 = 0xFF;
    TCON|=0x05;
    PICON = PICON_VAL;
    PINEN = PINEN_VAL;
    PIPEN = PIPEN_VAL;
   
    set_EPI;
        IE |= 0x05;
    EA = 1;
       
   
    while(1)
    {
        set_PD;                                 //Enter Power Down
    }
}


一周热门 更多>