该博文是笔者使用该mcu过程中遇到的问题汇总,仅供参考,同时欢迎看官积极分享自己遇到的问题。

2019/7/3更新:重新上传无法显示的图片。

转载请注明出处!!!

目录

目录... 3

1.N76E003使用双串口串口1无法进入接收中断... 4

2.使用双串口,波特率异常(115200 bps)... 5

3.管脚中断触发方式在中断中无法切换... 9

4.mcu软件启动方式切换后某些定时器未停止... 9

5.掉电模式N76E003功耗偏高... 10

6.掉电模式N76E003的I/O引脚驱动能力不足... 10

7.看门狗超时复位的最大超时时间过短... 10

8. ADC采集电压第一次不准... 11

9.mcu区分外部复位和上电复位... 11

10. 关于N76E003的Keil编译器优化级别... 12

1.N76E003使用双串口串口1无法进入接收中断

N76E003在使能串口中断后,发送串口数据时,必须要先读TI/TI_1寄存器,再进入发送中断,并在中断中清除TI/TI_1寄存器的值。如若不然,则在串口0发送数据后将导致串口1无法进入中断。并且,经过测试发现,在这种情况下代码执行速度慢于正常情况下的速度。可以用一个简单的delay函数测试

一个完整的串口发送流程为:TI/TI_1清零--> SBUF/SBUF_1赋值-->轮询TI/TI_1的值(在发送成功后,会先被当前程序轮询到其值为1,再进入中断程序)-->进入中断-->清楚TI/TI_1

示例代码:

以使用N76E003官方bsp库为例。

void Send_Data_To_UART0(uint8_t c)

{

TI = 0;

SBUF = c;

while(TI==0);

}

void SerialPort0_ISR(void) interrupt 4

{

if (RI==1)

{                  /* if reception occur */

clr_RI;       /* clear reception flag for next reception */

}

if(TI==1)

{

clr_TI;        /* if emission occur */

}

}

void Send_Data_To_UART1(uint8_t c)

{

TI_1 = 0;

SBUF_1 = c;

while(TI_1==0);

}

void SerialPort1_ISR(void) interrupt 15

{

if (RI_1==1)

{                          /* if reception occur */

clr_RI_1;           /* clear reception flag for next reception */

}

if(TI_1==1)

{

clr_TI_1;           /* if emission occur */

}

}

2.使用双串口,波特率异常(115200 bps)

  1. 如下图通过数据手册可以看出在16Mhz的时钟下115200会有较大误差,故须将时钟配置为16.6Mhz

  1. 使用双串口的情况下串口0使用timer1作为时钟,串口1使用timer3作为时钟,在这种情况下,实际上timer1的时钟是16.588Mhz,需要按16.588Mhz来计算波特率,否则波特率有较大误差。(即便如此,在某些芯片上,波特率仍有固定误差,应和物料有关)

系统时钟16.6Mhz设置代码如下:

void MODIFY_HIRC_16588(void)

{

unsigned char hircmap0,hircmap1;

unsigned int    trimvalue16bit;

set_IAPEN;

IAPAL = 0x30;

IAPAH = 0x00;

IAPCN = READ_UID;

set_IAPGO;

hircmap0 = IAPFD;

IAPAL = 0x31;

IAPAH = 0x00;

set_IAPGO;

hircmap1 = IAPFD;

clr_IAPEN;

//hircmap1 = hircmap1&0x01;

trimvalue16bit = ((hircmap0<<1)+(hircmap1&0x01));

trimvalue16bit = trimvalue16bit - 15;

hircmap1 = trimvalue16bit&0x01;

hircmap0 = trimvalue16bit>>1;

BIT_TMP=EA;

EA=0;

TA=0XAA;

TA=0X55;

RCTRIM0 = hircmap0;

TA=0XAA;

TA=0X55;

RCTRIM1 = hircmap1;

EA=BIT_TMP;

}

波特率设置示例代码如下:

void InitialUART0_Timer1(UINT32 u32Baudrate)    //T1M = 1, SMOD = 1

{

SCON = 0x52;     //UART0 Mode1,REN=1,TI=1

TMOD |= 0x20;    //Timer1 Mode1

set_SMOD;        //UART0 Double Rate Enable

set_T1M;

clr_BRCK;        //Serial port 0 baud rate clock source = Timer1

#ifdef FOSC_160000

//TH1 = 256 - (1000000/u32Baudrate+1);               /*16 MHz */

TH1 = 256 - (1036750/u32Baudrate+1);         /*16.588 MHz */

//TH1 = 256 - (1037500/u32Baudrate+1);         /*16.6 MHz */

#endif

#ifdef FOSC_221184

TH1 = 256 - (1382400/u32Baudrate);                /*22.1184 MHz */

#endif

set_TR1;

}

void InitialUART1_Timer3(UINT32 u32Baudrate) //use timer3 as Baudrate generator

{

P02_Quasi_Mode;        //Setting UART pin as Quasi mode for transmit

P16_Quasi_Mode;        //Setting UART pin as Quasi mode for transmit

SCON_1 = 0x50;        //UART1 Mode1,REN_1=1,TI_1=1

T3CON = 0x08;          //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1

clr_BRCK;

#ifdef FOSC_160000

//RH3    = HIBYTE(65536 - (1000000/u32Baudrate)-1);            /*16 MHz */

//RL3    = LOBYTE(65536 - (1000000/u32Baudrate)-1);                     /*16 MHz */

RH3    = HIBYTE(65536 - (1037500/u32Baudrate));           /*16.6 MHz */

RL3    = LOBYTE(65536 - (1037500/u32Baudrate));                    /*16.6 MHz */

#endif

#ifdef FOSC_166000

RH3    = HIBYTE(65536 - (1037500/u32Baudrate));                  /*16.6 MHz */

RL3    = LOBYTE(65536 - (1037500/u32Baudrate));                           /*16.6 MHz */

#endif

set_TR3;         //Trigger Timer3

}

3.管脚中断触发方式在中断中无法切换

在使用过程中发现如果先使能一个管脚中断为上升沿触发,再在中断中设置为下降沿触发,将会设置失败,下降沿将无法触发。必须退出中断后设置。

4.mcu软件启动方式切换后某些定时器未停止

在使用中发现如果软件从aprom重启并跳转到ldrom,若之前使能了定时器,则在ldrom代码中必须先停止定时器再清除TH0、TL0寄存器,然后再开始定时器(如果需要使用)。否则定时将异常(由于只使用timer 0作为通用定时器,故其他定时未验证)。

初始化定时器前清空TR0,数据手册有如下说明:在模式0或模式1下时,当读/写TH0(TH1)和TL0(TL1)之前,必须清除TR0(TR1)来停止计时。否则将产生不可预料的结果。

示例代码:

void Enter_IAP(void)

{

DEBUG("enter iap\r\n");

default_config[0] &= ~0x80;

program_config(BYTE_PROGRAM_CONFIG, default_config, 4);

//    Delay10us(20);

BIT_TMP=EA;

EA=0;

TA = 0xAA;

TA = 0x55;

CHPCON |= SET_BIT1;     // set boot from LP

TA = 0xAA;

TA = 0x55;

CHPCON |= 0x80;     //  software reset enable

EA=BIT_TMP;

}

void TM0_Init(void)

{

clr_TR0;                 //stop timer0 (if want reset TH0 or TL0,must clr TR0)

TH0=TL0=0;          //interrupt timer 5.92 ms

set_TR0;                //Start timer0

IE = 0x92;             //EA=1, ES=1,ET0=1

}

5.掉电模式N76E003功耗偏高

可以有效降低掉电模式功耗的措施:

clr_BODEN; //关闭BOD欠压检测(通过代码关闭未验证,但在下载程序时取消该选项功耗降低明显)

clr_HIRCEN ;//关闭高速HIRC时钟(未使用)

clr_CLOEN; //关闭系统时钟输出(未验证)

clr_ADCEN;//关闭adc模块(已验证,有效防止漏电)

正常情况下,N76E003通过设置PCON寄存器的PD位进入待机模式时,mcu功耗只有5~6ua(只关闭欠压检测BOD,其他不动),但经过测试发现,如果进入掉电模式前使能了adc功能,则会导致该I/O管脚漏电,导致功耗达到几百ua,正确做法是在进入掉电模式前关闭adc模块。

示例代码:(以P04为例)

#define CLR_ADC     P04_Input_Mode;clr_ADCEN;clr_ADCS

6.掉电模式N76E003的I/O引脚驱动能力不足

经过测试发现,在进入掉电模式后,N76E003的I/O输出电流将大幅降低,在部分应用场景下需要先将I/O引脚设置为推完模式,在进入掉电模式才能驱动部分电路。(包括但不限于某些wifi芯片的使能脚等)。相关文档如下图:

7.看门狗超时复位的最大超时时间过短

有别于其他mcu,N76E003的看门狗最大超时时间只有1.638s。其看门狗使用方式为:看门狗中断产生-->进入中断-->中断中喂狗。只要在看门狗中断触发的512个LIRC时钟周期内喂狗即可。相关文档如下图:

8. ADC采集电压第一次不准

在使用中发现N76E003的adc引脚如果之前的模式配置为准双向模式(其他模式未测试),则若是将改引脚设置为输入模式马上读取adc电压值,则会导致adc读取电压不准的情况(此时连续读取三次均不准),必需要等待一段时间,经测试几十个指令周期后即可。(时间可根据应用场景验证)。该现象的原因可能是外部电路给adc引脚的驱动电流较小,使adc引脚状态转换较慢。

9.mcu区分外部复位和上电复位

N76E003的AUXR1.6寄存器RSTPINF为复位标志位,但是上电复位和外部复位都将使该标志位置位,若只使用这个复位引脚将无法区分这两种复位状态。但可通过PCON的POF(上电复位标志位)标志位来加以判断。该位只在上电复位时置位。即引脚复位的情况为:POF为0,RSTPINF为1.

10. 关于N76E003Keil编译器优化级别

经过测试发现如下问题:

  1. 串口代码,如果优化级别不是8,则存在串口无法正常使用的情况,即使变量定义为volatile类型亦然,且其官方bsp示例代码的工程配置优化级别均为8,若修改其优化级别,同样存在这个问题。
  2. 存在函数只声明但不定义但能编译通过的情况。
  3. 存在头文件缺少#endif但能编译通过的情况
  4. 存在变量只extern声明未定义但能编译通过的情况

综上,编译器的警告信息一定要去关注!!!

N76E003开发笔记(关于使用N76E003过程遇到的问题)相关推荐

  1. 硬件开发笔记(一):高速电路设计Cadence Aleegro软件介绍和安装过程

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/124356904 红胖子(红模仿)的博文大全:开发技术集 ...

  2. ATECC508A芯片开发笔记(八):ECDH算法配置方法、执行过程及实现原理

    目录 AATECC508A芯片开发笔记(八):ECDH算法配置方法.过程原理及示例代码 1.ECDH介绍及原理 2.ECDH执行过程 3.508A某一slot执行Ecdh需要配置的参数 4.示例代码 ...

  3. 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理

    本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7405479 作者:毛星云    邮箱: happyl ...

  4. HBase眼高手低从Shell到IDEA编程、心路笔记、踩坑过程

    HBase眼高手低从Shell到IDEA编程.心路笔记.踩坑过程 HBase眼高手低 通过shell操作Hbase Foundation 在terminal中输入hbase,就可以查看hbase命令的 ...

  5. 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩:纹理映射技术(一)...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8523341 作者:毛星云(浅墨 ...

  6. [置顶]       【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7318264 作者:毛星云    邮箱: h ...

  7. Android通用开发笔记和高性能安卓开发框架源码

    笔记列表 云炬Android开发笔记(准备篇) Android studio及AVD模拟器的安装调试教程 云炬Android开发笔记 2项目初始化 云炬Android开发笔记 3框架主配置的入口的设计 ...

  8. 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨)    邮箱: happylifemxy@163.com 本篇文章里,我们对Direct3D之中固定功能流水线中的3D ...

  9. Java开发笔记(一百零三)线程间的通信方式

    前面介绍了多线程并发之时的资源抢占情况,以及利用同步.加锁.信号量等机制解决资源冲突问题,不过这些机制只适合同一资源的共享分配,并未涉及到某件事由的前因后果.日常生活中,经常存在两个前后关联的事务,像 ...

最新文章

  1. 洛谷P1541 乌龟棋
  2. 程序员辞职卖卷饼:4天挣1个月工资!摆摊真那么赚钱?
  3. matlab中的:的优先级_内容早期设计:内容优先
  4. LeetCode 1464. 数组中两元素的最大乘积
  5. react 遍历对象_React 源码系列 | React Children 详解
  6. cesium加载百度地图_Cesium专栏-百度地图加载(附源码下载)
  7. php java转换为字符串格式_php array 转json及java 转换 json数据格式操作示例
  8. 计算机网络课程设计报告
  9. 初学者用什么数位板好,手绘板选择注意什么?
  10. EEGLAB工具箱的下载与安装
  11. golang正则匹配中文字符,查询中文字符会panic退出的问题
  12. 【第一课】UAV倾斜摄影测量技术
  13. 矢量图和位图都是计算机记录_ _的方式,在计算机上如何区别矢量图和位图?
  14. 不同标准下的ESD HBM模型 2021-05-29
  15. objectArx ---基础操作
  16. C++ qsort的理解
  17. 怀旧服湖畔镇服务器位置,蓝贴:怀旧服合服的服务器!!!
  18. ThingsBoard调试部署和性能分析
  19. go tool 的基本应用
  20. 短信验证码登录的实现流程

热门文章

  1. 醉翁之意不在酒,网易“星球”意在用户数据
  2. 自媒体达人早已月入过万,为何同是自媒体人却依旧没收益
  3. 伪类选择器和伪元素选择器
  4. 服务器型号E52680,八核心Intel Xeon E5-2680性能大爆光
  5. 数据库之十二星座 --- 双鱼座的复杂关系
  6. 软考中级网络工程师必背考试知识点集锦(三)
  7. SpringCloud Gateway 通过redis实现限流
  8. python 正弦曲线_使用python生成正弦波数据
  9. 2021年度训练联盟热身训练赛第五场
  10. 苹果iOS 10的备份加密减弱:破解速度提升2500倍