本帖最后由 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的缺陷。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
手上没有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
}
}
多少得接个地吧
大神可否测试一下GPIO的中断?不是中断0和中断1。
一周热门 更多>