资料
疑问
疑问一
我想实现一个管脚中断,然后在用官方给的头文件时发现一个问题:发生管脚中断的端口配置。
其datasheet相关内容如下:
我不知道是我自己考虑错了,还是官方的头文件出现了问题,暂且先在这里记录一下。我觉得这里应该修改为如下定义才更准确:
疑问二
我真的无力吐槽了,今天又TM被这个SB单片机坑了一笔!
从官网下载的例程运行结果根本就是错误的,我是真他妈不知道这种例程怎么好意思往官网上放。
吐槽完了说一下我需要实现的功能:
我想往片上Flash or E2PROM
里存储一些掉电也可以保存的数据,然后我就找到了官方的IAP_Dataflash_EEPROM
,发现例程里有如下代码:
UINT8 datatemp;
UINT16 system16highsite;
Write_DATAFLASH_BYTE (0x3802,0x34);
Write_DATAFLASH_BYTE (FLASH_H_LOW,0xaa); // FLASH_H_LOW = 0x4703
Write_DATAFLASH_BYTE (FLASH_H_HIGH,0x66); // FLASH_H_LOW = 0x4704
datatemp = Read_APROM_BYTE(0x3802);
system16highsite = ((Read_APROM_BYTE(FLASH_H_HIGH)<<8)+Read_APROM_BYTE(FLASH_H_LOW));
这个代码意图很明显:往指定地址写数据,并且读回,然而。。。读回的数据只有datatemp
是正确的,system16highsite
的值一直是零。。。
然后我将代码修改如下:
Write_DATAFLASH_BYTE (0x3800,0x34);
Write_DATAFLASH_BYTE (0x3801,0x55);
Write_DATAFLASH_BYTE (0x3802,0x56);
Write_DATAFLASH_BYTE (0x3803,0xaa);
Write_DATAFLASH_BYTE (0x3804,0x66);
datatemp = Read_APROM_BYTE(0x3800);
printf("datatemp[0x%bx]\n", datatemp);
datatemp = Read_APROM_BYTE(0x3801);
printf("datatemp[0x%bx]\n", datatemp);
datatemp = Read_APROM_BYTE(0x3802);
printf("datatemp[0x%bx]\n", datatemp);
datatemp = Read_APROM_BYTE(0x3803);
printf("datatemp[0x%bx]\n", datatemp);
datatemp = Read_APROM_BYTE(0x3804);
printf("datatemp[0x%bx]\n\n", datatemp);
通过这种方式写入后读回,结果都是正确的。。。那问题就出在地址0x4700
上了,既然这个地址不能用,为何定义这个地址?如果能用,又为何例程结果是错误的?CAO
顺便我的Flash读写测试工程上传一下。
总结
虽然很多很多年都没再接触过51单片机了,但是现在看起来感觉还是比较简单了。
既然已经研究了大半天,就记录一下吧,说不定啥时候又得用上呢。。。
N76E003的管脚中断和外部中断:
管脚中断:可以随意配置任一管脚产生(datasheet说的)中断,但是一个程序中最多配置8个中断;而且所有管脚触发的中断都是通过中断号7
处理的,也就是说这些中断源共用一个中断;
外部中断:指定的管脚才可以配置为外部中断源,从上面的管脚图可以看到,外部中断0 INT0
只能由P30
触发,而外部中断1 INT1
只能由P17
触发。
中断处理函数
// 首先就是关于中断函数,比如下面这个。其实它的函数名怎么取都没有关系,重点是 "interrupt 0",
// 这个"interrupt 0"就指定了这是0号中断触发中断服务函数。
void EXT_INT0(void) interrupt 0
{
cnt_int0++;
}
寄存器配置
// 以下定义了 P00 作为管脚中断触发源,上升沿触发
Enable_INT_Port0; // set P0 as interrupt port
Enable_BIT0_RasingEdge_Trig; // set Px0 as interrupt pin
// 那上面的功能到底是怎么实现的呢?
// 可以F12看看其定义:
#define Enable_INT_Port0 PICON &= 0xFC;
#define Enable_BIT2_RasingEdge_Trig PICON|=0x10;PINEN&=0xFB;PIPEN|=0x04
// 然后,直接在datasheet中搜索寄存器名,查看每个bit的功能