存档

文章标签 ‘Programming’

Luminary的Cortex-M3核心ARM处理器基于IAR的中断注册方法

2008年8月22日

建议采用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 技术 ,

IAR中MSP430中断服务函数的定义

2008年7月17日

//为了保证代码可以在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 技术 ,

关于IAR for MSP430破解问题

2008年7月15日

IAR for MSP430注册机注册后可以安装但是编译时提示未授权,这个情况有一点值得注意,就是IAR的破解机些本机ID的时候,0x的x一定要小写。后面的16进制码要大写。

另外安装完IAR以后无法使用并口的JTAG调试器,提示两个错误。这时候重启一下计算机就好,而使用usb口的调试器则不用重启就可以用了。

Jacob 技术

E2PROM操作,解决重启问题

2007年7月29日

#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 技术 , ,

今天研究TCP/IP的一些精华部分

2007年3月11日

我搞电子,不搞网络,但是这玩意也得懂,郁闷~

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 技术

液晶屏显示数字的算法。。。

2007年2月14日

折腾了这么多天的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 技术

C语言里的INT to CHAR*

2007年2月11日

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 = ‘’;
reverse(s);
return s;
}

Jacob 技术

Insert ARM asm Code into C Code

2006年12月20日

_asm
{
LDR R5,[R6] ;
ORR r0, r0, #0xC0 ;
}

Jacob 技术