IAR环境下的msp430c语言编程.docx

上传人:b****2 文档编号:24187466 上传时间:2023-05-25 格式:DOCX 页数:9 大小:41.92KB
下载 相关 举报
IAR环境下的msp430c语言编程.docx_第1页
第1页 / 共9页
IAR环境下的msp430c语言编程.docx_第2页
第2页 / 共9页
IAR环境下的msp430c语言编程.docx_第3页
第3页 / 共9页
IAR环境下的msp430c语言编程.docx_第4页
第4页 / 共9页
IAR环境下的msp430c语言编程.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

IAR环境下的msp430c语言编程.docx

《IAR环境下的msp430c语言编程.docx》由会员分享,可在线阅读,更多相关《IAR环境下的msp430c语言编程.docx(9页珍藏版)》请在冰豆网上搜索。

IAR环境下的msp430c语言编程.docx

IAR环境下的msp430c语言编程

IAR环境下的msp430c语言编程

MSP430系列单片机实用C语言程序设计

扩展的关键字

1.asm

也可以写成__asm。

功能是在C程序中直接嵌入汇编语言。

语法:

asm(“string”);其中string必须是有效的汇编语句。

2.__interrupt

放在函数前面,标志中断函数。

下面这段程序是异步串行口UART0的接收中断函数。

UART0RX_VECTOR为异步串行口UART0的接收中断向量。

举例:

#pragmavector=UART0RX_VECTOR

__interruptvoidUART0_R(void)//UART0接收中断

{

TXBUF0=RXBUF0;

}

3.__monitor

放在函数前面,功能是但这一函数执行的时候自动关闭中断。

应该尽量缩短这样的函数,否则,中断事件无法得到及时的响应。

4.__no_init

放在全局变量前面,功能是使程序启动时不为变量赋初值。

5.__raw

编译中断函数时,编译器会自动生成一段代码,首先保存当时所用到CPU内寄存器的内容,退出中断程序时再进行恢复。

将__raw放在中断函数前可以禁止保存CPU内寄存器的过程,当然退出时也不会恢复。

是否为中断函数使用此关键字要根据需要而定。

6.__regvar

void__bis_SR_register(unsignedshort);

功能:

将CPU中SR寄存器中的某些位置1。

其参数为屏蔽码,需要置1的位为1。

1.__bis_SR_register_on_exit

void__bis_SR_register_on_exit(unsignedshort);

功能:

用于一个中断函数或者不可中断函数(标志为__monitor)返回时,将CPU内SR寄存器中的某些位置1。

其参数为屏蔽码,需要置1的位为1。

2.__disable_interrupt

void__disable_interrupt(void)

功能:

关闭全局中断。

先执行DINT命令,关闭全局中断,然后再执行NOP命令。

空指令是为了确保关闭了全局中断之后再执行下面的程序。

3.__enable_interrupt

void__enable_interrupt(void)

功能:

使用NINT指令打开全局中断。

4.__even_in_range

void__enable_in_range(unsignedshortvalue,unsignedshortupper_limit)

功能:

只能与switch语句结合使用,判断value是否为偶数且小于等于upper_limit。

举例:

unsignedintMoonRiver,iq0;

iq0=2;

swich(__even_in_range(iq0,4))

{

case0:

MoonRiver=0;

break;

case2:

MoonRiver=2;

}

结果:

假设iq0的值为2,执行完毕时MoonRiver=2。

否则,与普通的swich语句一样,跳过case部分,直接执行下面的程序。

使用__even_in_range的好处是可以生成效率比较高的代码,在判断多中断源的来源时可以使用此函数。

5.__get_interrupt_state

istate_t__get_interrupt_state(void)

功能:

返回当前的中断状态。

返回值istate_t为一结构,通过此函数可以获得当前的中断状态并保存,将来可以使用__set_interrupt_state恢复中断状态。

6.__get_R4_register

unsignedshort__get_R4_register(void);

功能:

返回寄存器R4的值,只在R4被锁定时有效。

7.__get_R5_register

unsignedshort__get_R5_register(void);

功能:

返回寄存器R5的值,只在R5被锁定时有效。

8.__get_SP_register

unsignedshort__get_SP_register(void);

功能:

返回堆栈指针寄存器SP的值。

9.__get_SR_register

unsignedshort__get_SR_register(void);

功能:

返回CPU中状态寄存器SR的值。

10.__get_SR_register_on_exit

unsignedshort__get_SR_register_on_exit(void);

功能:

用于一个中断函数或者不可中断函数(标志为__monitor)返回时,返回状态寄存器SR的值。

只在中断函数或者不可中断函数中有效。

11.__low_power_mode_n

void__low_power_mode_n(void);

功能:

进入低功耗模式0~4。

12.__low_power_mode_off_on_exit

void__low_power_mode_off_on_exit(void);

功能:

从一个中断函数或者不可中断函数(标志为__monitor)返回时退出低功耗模式。

只在中断函数或者不可中断函数中有效。

13.__no_operation

void__no_operation(void);

功能:

执行NOP指令。

14.__op_code

__op_code(unsignedshort);

功能:

在指令流中插入一个常数。

15.__segment_begin

void*__segment_begin(segment);

功能:

segment是段的名字,必须是字符串。

返回指向segment段的地址。

此处的段是程序中定义的数据段、代码段、堆栈段等,一般用户可以使用编译器的默认设置。

16.__segment_end

void*__segment_end(segment);

功能:

segment是段的名字,必须是字符串。

返回指向segment段结束后的第一个字地址。

17.__set_interrupt_state

void__set_interrupt_state(istate_t);

功能:

恢复istate_t中保存的中断状态。

18.__set_R4_register

void__set_R4_register(unsignedshort);

功能:

将unsignedshort值赋给寄存器R4,只在R4被锁定时有效。

19.__set_R5_register

void__set_R5_register(unsignedshort);

功能:

将unsignedshort值赋给寄存器R5,只在R5被锁定时有效。

20.__set_SP_register

void__set_SP_register(unsignedshort);

功能:

给堆栈指针寄存器SP赋值。

21.__swap_bytes

unsignedshort__swap_bytes(unsignedshort);

功能:

一个16位的无符号整数,高8位与低8位进行交换。

如0x1234交换后为0x3412。

扩展定义

为了使用方便,EW430还作了一些定义,有些定义不属于C语言的一部分,而是一种二次包装,如对内部函数的包装。

它们的功能完全可以用其他函数或者表达式实现,用户也可以自己重新定义,但使用它们会使编写程序更加简单易懂。

下面1~4项都是在不同类型CPU的头文件中定义的,如msp14x.h,其中对CPU内的各寄存器和模块的各种工作模式都作了详尽的定义,编程时应尽可能地利用。

1.PxIN、PxOUT、PxDIR、PxSEL

x为端口号。

IN为端口输入寄存器,OUT为端口输出寄存器,DIR为端口方向控制寄存器,SEL为端口第二功能选择寄存器。

举例:

Moon=P1IN;//读端口P1的值,赋给变量Moon

P3Out=5;//P3端口输出5

P2DIR=0xF0;//P2端口的高4位为输出,第4位为输入

P6SEL=0xF;//P6端口的高4位用作I/O端口,低4位用于第二功能

2.BITx

x的取值范围为0~F。

代表寄存器的某一位。

其定义为:

#defineBIT0(0x0001)

#defineBIT1(0x0002)

#defineBITE(0x4000)

#defineBITF(0x8000)

BIT0为最低位,BITF为最高位。

MSP430是不支持位操作的,如果想对位操作,最好的方法就是通过位屏蔽来实现。

举例:

P1OUT|=BIT0;//将P1口的最低位输出置1

P1OUT&=~BIT7;//将P1口的最高位输出清0,P1口只有8位

3.LPMx

x:

0~4。

进入0~4低功耗模式。

其定义为:

#defineLPM0_BIS_SR(LPM0_bits)//进入低功耗模式0

#defineLPM4_BIS_SR(LPM4_bits)//进入低功耗模式4

从以上代码可以看出扩展定义是对内部函数的第二次包装。

举例:

LPM0;//进入低功耗模式0

LPM4;//进入低功耗模式4

4.LPMx_EXIT

x:

0~4。

退出+0~4低功耗模式。

其定义为:

#defineLPM0_EXIT_BIC_SR_IRQ(LPM0_bits)//进入低功耗模式0

#defineLPM4_EXIT_BIC_SR_IRQ(LPM4_bits)//进入低功耗模式4

举例:

LPM0_EXIT;//退出低功耗模式0

LPM4_EXIT;//退出低功耗模式4

5._EINT()

打开全局中断控制,使GIE=1。

6._DINT()

关闭全局中断控制,使GIE=0。

执行__disable_interrupt指令。

7._NOP()

空操作。

执行__no_operation指令。

8._OPC(x)

在指令中插入一个常数。

x为unsignedchar类型。

执行__op_code指令。

9._SWAP_BYTES(x)

x是一个16位的无符号整数,高8位与低8位进行交换。

执行__swap_bytes指令。

10.__no_init[数据类型]变量名@地址

在某一固定地址处定义一个不进行初始化的变量,地址可以在RAM或FLASH内。

如果使用此方式定义在RAM内的变量需要赋值,那么必须首先定义,然后才能赋值。

/*分配变量MoonRiver在RAM地址0x210*/

__no_initunsignedintMoonRiver@0x210;//没有初始化

MoonRiver=100;//初始化MoonRiver为100

/*分配变量MoonRiver在FLASH地址0xFFC0*/

__no_initfloatMoonRiver@0xFFC0;

/*分配变量MoonRiver[3]在FLASH地址0x200*/

__no_initcharMoonRiver[3]@0xFF00;

/*分配结构sMoonRiver在RAM地址0x200*/

Typedefstruct

{

unsignedcharq0;

unsignedintiq0;

}sMoonRiver;//定义一个结构型的数据类型,取名为sMoonRiver

__no_initsMoonRiverMoonRiver@0x200;//声明变量MoonRiver,其数据类型为sMoonRiver

MoonRiver.q0=100;

MoonRiver.iq0=1000;//为MoonRiver赋初值

11.const[数据类型]变量名@地址

在某一固定地址处定义一个只读变量,并且只能在定义的时候赋初值。

这种定义变量的方式在FLASH的固定地址处分配变量时非常有用。

举例:

/*分配变量MoonRiver在RAM地址0x210*/

constunsignedintMoonRiver@0x210=100;//初始化MoonRiver为100

/*分配变量MoonRiver在FLASH地址0xFFC0*/

constfloatMoonRiver@0xFFC0=32.5;//初始化MoonRiver为32.5

/*分配变量MoonRiver[3]在FLASH地址0xFF00*/

constcharMoonRiver[3]@0xFF00={0,1,2};

/*分配结构sMoonRiver在RAM地址0xFFD0*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1