主题中讨论的其他器件: MSP430WARE
当系统时钟被设定为24 MHz 时、我在写入位于1800的信息 RAM 内存地址时遇到困难。 但是、当我将系统时钟减少到16 MHz 时、可以对信息 RAM 进行读取和写入、而不会出现任何问题。
我的问题是、这是否是 MSP430FR2355的一个已知问题、即信息 RAM 无法在24 MHz 中可靠写入、但在16 MHz 及以下版本中可以正常运行?
为了重现此问题、我使用了 TI 网站提供的示例代码: https://dev.ti.com/tirex/explore/node?node=A__AH2qBo.OVRaJLHNDd38Y4g__msp430ware__IOGqZri__LATEST
(如果链接不起作用、您可以像这样导航此示例代码:MSP430微控制器/嵌入式软件/ MSP430Ware (3.80.14.01)/Devices/MSP430FR2XX_4XX/MSP430FR2355/Peripheral 示例/寄存器级别/ msp430fr235x_framwrite)
上述示例代码成功写入并将值保留在信息 RAM 中。 但是、当我用以下内容修改上述示例代码时:
#ifdef SYSTEM_CLOCK_IS_24MHZ
CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_7; // DCOFTRIM=7, DCO Range = 24MHz
CSCTL2 = FLLD_0 + 731; // DCODIV = 24MHz
#endif
#ifdef SYSTEM_CLOCK_IS_16MHZ
CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_5;// DCOFTRIM=5, DCO Range = 16MHz
CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz
#endif定义 SYSTEM_CLOCK_IS_24MHZ 失败
to save to INFO RAM, while the define SYSTEM_CLOCK_IS_16MHZ, saves correctly to INFO RAM.
下面是突出显示此问题的完整代码。 希望这是足够的信息来了解它的底部。
#include <msp430.h>
void FRAMWrite(void);
unsigned char count = 0;
unsigned long *FRAM_write_ptr;
unsigned long data;
#define FRAM_TEST_START 0x1800
//#define SYSTEM_CLOCK_IS_16MHZ
#define SYSTEM_CLOCK_IS_24MHZ
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
P1OUT &= ~BIT0; // Clear P1.0 output latch for a defined power-on state
P1DIR |= BIT0; // Set P1.0 to output directionOUT
PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode
// to activate previously configured port settings
__bis_SR_register(SCG0); // disable FLL
CSCTL3 |= SELREF__REFOCLK; // Set REFO as FLL reference source
#ifdef SYSTEM_CLOCK_IS_24MHZ
CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_7; // DCOFTRIM=7, DCO Range = 24MHz
CSCTL2 = FLLD_0 + 731; // DCODIV = 24MHz
#endif
#ifdef SYSTEM_CLOCK_IS_16MHZ
CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_5;// DCOFTRIM=5, DCO Range = 16MHz
CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz
#endif
__delay_cycles(3);
__bic_SR_register(SCG0);
CSCTL4 = SELMS__DCOCLKDIV;
data = 0x11111111; // Initialize dummy data
while(1)
{
data += 0x00010001;
FRAM_write_ptr = (unsigned long *)FRAM_TEST_START;
FRAMWrite();
count++;
if (count > 100)
{
P1OUT ^= 0x01; // Toggle LED to show 512 bytes
count = 0; // have been written
data = 0x11111111;
}
}
}
void FRAMWrite (void)
{
unsigned int i=0;
SYSCFG0 = FRWPPW | PFWP;
for (i = 0; i < 128; i++)
{
*FRAM_write_ptr++ = data;
}
SYSCFG0 = FRWPPW | DFWP | PFWP;
}