建议采用IAR工程模板来编写程序,比较快捷。
注册中断有两种方法:采用xxxRegister()函数,或者手工修改启动文件startup.c的中断向量表
例如中断函数是:
void I2C_ISR(void)
则在starup.c里要修改两个地方:
1. 找到
extern int main(void);
在后面补上中断函数的声明:
extern void I2C_ISR(void);
2. 在中断向量表的数组里,找到注释I2C的项目,将IntDefaultHandler换成I2C_ISR
完成。
Jacob 技术 Embedded System, Programming
//为了保证代码可以在IAR编译器的任何版本中都能正确得到编译,所以作以下的条件编译。
#ifdef __IAR_SYSTEMS_ICC__ //如果编译器是IAR, 那么以下将被编译。
#if __VER__ >= 200
#pragma vector=USART0RX_VECTOR //在IAR2.0以上中断函数声明。
__interrupt void SPI0_rx (void)
#else //在IAR2.0以下中断函数声明。
interrupt[USART0RX_VECTOR] void SPI0_rx (void)
#endif //IAR中断函数声明结束。
{ }
在上述中
USART0RX_VECTOR 是定义中断地址宏,其实就是一个中断矢量值,例如,地址, 0xffe0 。
这个中断矢量有芯片型号决定,一旦信号确定,那么所有的终端矢量也就确定了。
SPI0_rx 是中断函数名称,使用者可以根据自己的喜好来编写这个函数名。
点此在新窗口浏览图片 实际例程
//**************************************************************************
//例程描述:利用定时器定时功能,实现P1.0方波输出。
#include
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗WDT,不使用内部看门狗定时器。
P1DIR |= 0×01; //设置P1.0口方向为输出。
CCTL0 = CCIE; //设置捕获/比较控制寄存器中CCIE位为1,CCR0捕获/比较功能中断为允许。
CCR0 = 50000; //捕获/比较控制寄存器CCR0初值为5000。
TACTL = TASSEL_2 + MC_2; //设置定时器A控制寄存器TACTL,使时钟源选择为SMCLK辅助时钟。
_BIS_SR(LPM0_bits + GIE); //进入低功耗模式LPM0和开中断
}
//定时器A 中断服务程序区
//当IAR编译器版本大于或等于2.0以上时,则中断写法格式如下。
#pragma vector=TIMERA0_VECTOR //定时器A0中断向量
__interrupt void Timer_A (void) //中断函数
{
P1OUT ^= 0×01; //P1.0取反输出
CCR0 += 50000; //重新载入CCR0捕获/比较数据寄存器数据
}
//程序结束
//**************************************************************************
Jacob 技术 MCU, Programming
IAR for MSP430注册机注册后可以安装但是编译时提示未授权,这个情况有一点值得注意,就是IAR的破解机些本机ID的时候,0x的x一定要小写。后面的16进制码要大写。
另外安装完IAR以后无法使用并口的JTAG调试器,提示两个错误。这时候重启一下计算机就好,而使用usb口的调试器则不用重启就可以用了。
Jacob 技术 Programming
#define EERE 0
#define EEWE 1
#define EEMWE 2
void E2PROM_Write(unsigned int Addr,unsigned char Data)
{
while(EECR & (1<
EEAR=Addr;
EEDR=Data;
EECR|=(1<
EECR|=(1<
}
unsigned char E2PROM_Read(unsigned int Addr)
{
while(EECR & (1<
EEAR=Addr;
EECR|=(1<
return EEDR;
}
E2PROM读写函数,没有考虑中断的影响,毕竟这东西用的不多,本来以为这样子就可以用了,写了段记录开机次数的程序。
temp=E2PROM_Read(0×00a);
E2PROM_Write(0×00a,temp+1);
运行,结果0×00a地址的值确实在增加,只不过是不停的增加,换句话来说就是单片机不停的重启,查了写资料,发现是看门狗的缘故,在写E2PROM的时候必须喂狗,不然单片机就会复位。看门狗的操作我还不会,所以就从熔丝把看门狗关了,程序运行正常。明天有时间研究看门狗去。。。
Jacob 技术 Electrical, MCU, Programming
我搞电子,不搞网络,但是这玩意也得懂,郁闷~
OSI模型各层:
应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
TCP/IP模型各层
应用层:Telnet,FTP,SMTP,SNMP,DNS,POP3,HTTP,NNTP,UUCP
传输层:TCP,UDP,分段加传输协议报头
网际层:IP(ARP,ICMP,IGMP),加IP报头
网络接口层:定义主机如何连接网络,加物理网络报头,和校验和
目的结点受到数据包后,反向处理
===================
Internet寻址
IPv4
32位地址段
A类001.hhh.hhh.hhh–126.hhh.hhh.hhh
B类128.001.hhh.hhh–191.254.hhh.hhh
C类192.000.001.hhh–223.255.254.hhh
D类224.000.000.000–239.255.255.255
E类240.xxx.yyy.zzz–247.xxx.yyy.zzz
[color=#FF0000]注意:这种分类体系已经有历史了,现在的IP地址是没有级别的。这意味着一个组织的IP地址的确定是基于一个IP地址和一个网络掩码。网络掩码确定了地址的网络部分。[/color]
ip地址中定义的主机部分不能全1,全1代表网段内的所有主机
ip地址中定义网络部分不能全0,全0代表这个网络
127段指定用于回送测试功能。
专业或预留地址
10.0.0.0–10.255.255.255
172.16.0.0–172.31.255.255
192.168.0.0–192.168.255.255
Jacob 技术 Programming
折腾了这么多天的itoa,ftoa什么的,忽然发现了一个最简单的算法。这个算法就是。。。。全国计算机上机考试出现频率最高的那种题目,我考了4次抽了4次的题目,关于四位数运算的。其中把四位数显示在屏幕上用了这么几句:
int b=1234;
char a[4];
a[1]=b/1000;
a[2]=b/100%10;
a[3]=b/10%10;
a[4]=b%10;
道理就是这么简单。看来全国三级还是有这么一点用处的。
崩溃了,让itoa玩了整整两天。
Jacob 技术 Programming
c语言中int转成char *的函数itoa,标准c里集成,CVAVR里好像没有
void reverse(char *s)
{
char *c;
int i;
c = s + strlen(s) - 1;
while(s < c) {
i = *s;
*s++ = *c;
*c– = i;
}
}
char *itoa(int n,char *s)
{
int sign;
char *ptr;
ptr = s;
if ((sign = n) < 0) n = -n;
do {
*ptr++ = n % 10 + ‘0′;
} while ((n = n / 10) > 0);
if (sign < 0) *ptr++ = ‘-’;
*ptr = ‘