-
一,乘法器
硬件乘法器是一个通过内部总线与 CPU 相连的 16 位外围模块。MSP430 单片机可以在部改变 CPU 结构和指令的情况下增加功能,这种结构特别适用于对运算速度要求很严格的情况。硬件乘法器大大提高 了 MSP430 单片机的数据处理能力,其支持的运算如下:
- 硬件乘法器是外围设备,不是MSP430 CPU的一部分。这意味着,它的活动不会干扰CPU活动。乘法器寄存器是通过CPU指令加载和读取的外围寄存器。
- 如果一个中断发生在写入OP1之后,而在写入OP2之前,使用乘法器对该中断进行服务,原有的乘法器模式选择就会丢失,结果是不可预测的。为了避免这种情况,在使用硬件乘数之前禁用中断,或者在中断服务程序中不要使用乘数。
- 无符号乘法(MPY)
- 有符号乘法(MPYS)
- 无符号乘加(MAC)
- 有符号乘加(MACS)
- 16×16 位、8×16 位、16×8 位、8×8 位
操作数寄存器:
OP1(第 1 操作数) OP2(第 2 操作数)
第一个操作数可源于 MPY、MPYS、MAC 和 MACS 四个寄存器,它们能确定乘法的类型。当第二个 操作数写入后,相应的乘法操作立即执行,一般需 4 个周期。
结果寄存器:
RESHI(结果高字节寄存器) RESLO(结果低字节寄存器) SUMEXT(结果扩展寄存器) 寄存器 RESHI 和 RESLO 的内容为两个 16 位相乘的 32 位乘积结果。而寄存器 SUMEXT 的内容由执行的乘法模式及乘积结果决定。
- MPY 操作数 1 指示操作数为无符号数相乘
- MPYS 操作数 1 指示操作数为有符号数相乘
- MAC 操作数 1 指示操作数为无符号数累加
- MACS 操作数 1 指示操作数为有符号数累加
- OP_2 操作数 2 [6] RESLO 结果低字节寄存器
- RESHI 结果高字节寄存器
- SUMEXT 结果扩展寄存器 以上寄存器均是 16 位的字寄存器,在使用时,用户可以以字节操作或字操作,这样就形成了不同位数乘 法的 4 种运算。
- 无论进行何种运算,只要操作数类型为 8×8 型,操作过程就要使用寄存器的绝对地址,而不能使用 符号形式。寄存器 MPY、MPYS、MAC、MACS 和 OP2 的地址分别为:0130h , 0132h , 0134h , 0136h , 0138h。
倍增器不能自动检测溢流或溢流mac模式。累加器的范围为正数为0到7FFF FFFFh,为负数为0FFFF FFFFh到8000 0000h。当两个负数的和产生的结果在正数范围内时,就会发生下溢。当两个正数的和产生的结果在负数的范围内时,就会发生溢出。在这两种情况下,SUMEXT寄存器都包含结果的符号,0FFFFh表示溢出,0000h表示下溢。用户软件必须检测和处理。
示例代码
/* 用硬件乘法器实现两无符号整型数组相乘,结果放在另一无符号长整型数组中。*/ #include "msp430x16x.h" unsigned long int Result[7]; unsigned int Data1[7]; unsigned int Data2[7]; unsigned char i; void main(void) { WDTCTL = WDTPW + WDTHOLD; for(i=0; i<7; i++) { Data1[i] = 250 * i; Data2[i]= 130 * i; } for(i=0; i<7; i++) { MPY = Data1[i]; OP2 = Data2[i]; _NOP(); _NOP(); _NOP(); Result[i] = RESHI; Result[i] <<=16; Result[i]