本文由Ken Lee独立整理完成,首发于QQ空间,转载请注明作者与出处。作者水平有限,难免存在错误,不足之处请指正。由于个人原因,原署名斌斌-龙臻,Mr_D_prince不再使用,由Ken Lee,newofcortexm3替代。
MSP-EXP430FR5739 实验板支持新一代采用集成铁电随机存取存储器 (FRAM) 的 MSP430 微处理器设备。板上资源如图(6)所示:
图(6):MSP-EXP430FR5739 实验板
用户示例程序中附带了用Java开发的上位机程序,在四个模式中均可看到往FRAM中写数据的速度。如图(7)所示,左侧仪表盘表示了当前模式1下的,FRAM的写数据速度,右侧仪表盘显示是模式2下的模拟Flash的写入速度。
图(7):示例中的上位机
在进行调用之前必须对其初始化,这个过程在上一步中完成。中断配置如下:
P4OUT |= BIT0 +BIT1; // Configure pullup resistor
P4DIR &= ~(BIT0 + BIT1); // Direction = input
P4REN |= BIT0 + BIT1; // Enable pullup resistor
P4IES &= ~(BIT0+BIT1); // P4.0 Lo/Hi edge interrupt
P4IE = BIT0+BIT1; // P4.0 interrupt enabled
P4IFG = 0; // P4 IFG cleared
3. 程序根据按键S1的次数进入不同的模式。每个模式执行的逻辑基本类似,都要向FRAM写数据,控制LED输出,向上位机发送数据。不过模式2,模式3和模式4在写数据之前都得完成一件任务。模式2得先切换时钟,从而模拟出向Flash写数据的时钟频率。模式3和模式4则先配置加速度传感器和温度传感器的端口,然后进行AD转换。
这个过程中,向FRAM写数据由函数FRAM_Write完成,如果起始地址在可利用的范围之内,该函数向存储区写入0x12345678,共512个字节。LEDSequenceWrite函数控制LED,分别对P3、PJ口输出高/低电平。向上位机发送数据的任务则交给了函数TXData。该函数发送的数据包以0xFA开始,以0xFE结束。第二位数据和第三位数据分别告诉上位机当前处于什么模式,有多少个LED灯点亮。利用串口调试工具监视串口,模式1下,下位机发送的数据首个数据为0xFA 0x01 0x00 0x00 0x00 0x00 0xFE,第三位数据位发生变化,从0x00递升至0x07,然后再次从0x00递升,表示了8个LED的周期性循环。模式2接收到的数据除了第二位是0x02外,变化基本一致,不过变化的速率明显下降了许多。以此对比突出FRAM的写入速度。模式3和模式4的第二位数据分别是0x03,0x04,第三位数据相同,是0x34。当程序从当前模式推出时,上位机收到的数据为0xFA 0x55 0x55 0x55 0x55 0x04 0xFE。
其他程序的细节就不再累述了。上文中的LED和按键S1、S2的电路见图(8),或者参考TI提供的原理图。
图(8):实验板核心部分原理图
对于Lab2,原先的工程在主程序部分是需要我们自己添加的。当然TI FAE也提供了解决方法,如下文的代码中加粗斜体所示,详请可参考Lab2_solution.c。
MPUCTL0 = MPUPW; // Write PWD to access MPU registers
MPUSEG = 0x0804; // B1 = 0xC800; B2 = 0xD000
// Borders are assigned to segments
MPUSAM &= ~MPUSEG2WE; // Segment 2 is protected from write
MPUSAM |= MPUSEG2VS; // Violation select on write access
MPUCTL0 = MPUPW+MPUENA+MPUSEGIE+MPULOCK; // Enable NMI & MPU protection
.
.
.
ptr = (unsigned int *)0xC802;
但是将Lab2.c中需补充的部分按如上所述修改,或者将Lab2.c Exclude from build,将Lab2_solution.c Include Build之后依然存在编译没法通过的问题,如图(9)所示。
图(9):Lab2编译问题
通过查手册slau272(MSP430FR57xx Family Users Guide),了解到MPULOCK在寄存器Memory Protection Unit Control 0 (MPUCTL0)中,具体位置见图(10)。因此只要在头文件msp430fr5739.h中添加 #define MPULOCK (0x0002) 即可解决编译问题。当然为什么TI FAE没添加这句话,是否有其他的考虑,我还在思索中。
图(10):MPUCTL0寄存器描述
用户539445 2015-5-21 19:32
用户596096 2013-4-15 08:27
chen_zs2012_704941858 2013-4-15 07:38