This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
我 有一个问题:
我已经使用了您的示例 msp430fr69xx_framwrite.c 和 msp430fr69xx_LCDC_03.c、如果我关闭电源、则表 FRAM_WRITE 为空。
当然、我在"Program"设置中使用了"Debug Configuration"、我设置了"Load symbols Only"。
我做了哪些不正确的事情?
计划:
#include "msp430.h"
#define pos1 9 /*数字 A1从 S18 I S19开始*/
#define pos2 5 /*数字 A2从 S10 I S11开始*/
#define pos3 /* 数字 A3从 S6 I S7开始 */
#define pos4 18 /*数字 A4从 S36 I S37开始*/
#define pos5 14 /*数字 A5从 S28 I S29开始*/
#define pos6 7 /*数字 A6从 S14 I S15开始*/
#define pos1e 10 /*数字 A1从 S20 I S21开始 */
#define pos2e 6 /*数字 A2从 S12 I S13开始 */
#define pos3e 4 /*数字 A3从 S8 I S9开始 */
#define pos4e 19 /*数字 A4从 S38 I S39开始 */
#define pos5e 15 /*数字 A5从 S30 I S31开始 */
#define pos6e 8 /*数字 A6从 S16 I S17开始*/
const unsigned char LCD_num[10]={
0xFC、 // 0
0x60、 // 1.
0xDB、 // 2.
0xF3、 // 3.
0x67、 // 4.
0xB7、 // 5
0xBF、 // 6.
0xE4、 // 7.
0xFF、 // 8.
0xF7、 // 9.
};
//左侧是第一个位置,右侧是7
// LCD 段定义。
静态常量 unsigned char char_gen_asci[92][2]=
{
{ 0x00、0x00 }、 // sp 0
{0x00、0x00}、 //! 1 (nieda sie)
{ 0x00、0x00 }、 //" 2.
{0x00、0x00}、 //# 3 (nie da sie)
{0x00、0x00}、 //$ 4
{0x00、0x00}、 //% 5 (nie da sie)
{0x00、0x00}、 //& 6 (nie da sie)
{0x00、0x00}、 //' 7
{0x00、0x00}、 //( 8 (nie da sie)
{ 0x00、0x00 }、 //) 9 (nie da sie)
{0x00、0x00}、 //* 10 (nie da sie)
{0x03、0x50}、 //+ 11
{ 0x00、0x00 }、 //、 12.
{0x03、0x00}、 //- 13
{ 0x00,0x00 }, //。 14.
{0x00、0x28}、 /// 15 /* dziesietni*/
{ 0xFC、0x28 }、 // 0 16
{0x60、0x00}、 // 1 17
{ 0xDB、0x00 }、 // 2 18
{0xF3、0x00}、 // 3 19
{0x67、0x00}、 // 4 20
{ 0xB7、0x00 }、 // 5 21
{ 0xBF、0x00 }、 // 6 22
{0xE4、0x00}、 // 7 23
{ 0xFF、0x00 }、 // 8 24
{0xF7、0x00}、 // 9 25
{ 0x00,0x00 }, //: 26
{0x00、0x00}、 //; 27 (nie da sie)
{0x00、0x22}、 //< 28
{0x00、0x00}、 //= 29 (nie da sie)
{0x00、0x88}、 //> 30
{ 0x00、0x00 }、 //? 31.
{0x00、0x00}、 //@ 32 (nie da sie)
{ 0xEF、0x00 }、 // A 33
małe 0xF1、0x50}、// B 34 μ F
{0x9C、0x00}、 // C 35
{0xF0、0x50}、 // D 36
{ 0x9E、0x00 }、 // E 37
{0x8E、0x00}、 // F 38
{ 0xBD、0x00 }、 // G 39
{0x6f、0x00}、 // H 40
{0x90、0x50}、 // I 41
{0x78、0x00}、 // J 42
{0x0E、0x22}、 // K 43
{0x1C、0x00}、 // L 44
{0x6C、0xA0}、 // M 45
{0x6C、0x82}、 // N 46
{ 0xFC、0x00 }、 // O 47
{ 0xCF、0x00 }、 // P 48
{0xFC、0x02}、 // Q 49 hm……
{ 0xCF、0x02 }、 // R 50
{ 0xB7、0x00 }、 // S 51
{0x80、0x50}、 // T 52
{0x7C、0x00}、 // U 53
{0x0C、0x28}、 // V 54
{0x6C、0x0A}、 // W 55
{0x00、0xAA}、 // X 56
{0x47、0x10}、 // Y 57
{0x90、0x28}、 // Z 58
{0x00、0x00}、 //[ 59
{0x00、0x00}、 // 55 60 (nie da sie)
{ 0x00、0x00 }、 //] 61.
{0x00、0x00}、 // // 62
{0x10、0x00}、 //_ 63
{0x00、0x00}、 //' 64
{0x1A、0x10}、 // a 65 (nie da sie)
{0x3F、0x00}、 // b 66
{0x1B、0x00}、 // c 67
{0x7B、0x00}、 // d 68
{0x9F、0x00}、 // e 69 hm..
{0x8E、0x00}、 // f 70
{0xF7、0x00}、 // g 71
{0x2F、0x00}、 // h 72
{ 0x00、0x10 }、 // I 73
{0x30、0x00}、 // j 74
{0x01、0x52}、 // k 75
{0x00、0x50}、 // l 76
{0x2B、0x10}、 // m 77
{0x0A、0x10}、 // n 78
{0x3B、0x00}、 // o 79
{ 0xCF、0x00 }、 // p 80
{0xE7、0x00}、 // q 81
{ 0x0A、0x00 }、 // r 82
{0xB7、0x00}、 // s 83
{0x03、0x50}、 // t 84
{0x38、0x00}、 // u 85
{0x08、0x08}、 // v 86
{0x28、0x0A}、 // w 87
{0x00、0xAA}、 // x 88
{0x00、0xB0}、 // y 89
{0x90、0x28}、 // z 90
{0xC2、0x44} // st 91
};
unsigned int numb=0;
void updateLcd (void);
void FRAMWrite (void);
#define WRITE_SIZE 100
unsigned char count = 0;
unsigned int 数据;
pragma NOINIT (FRAM_WRITE)
unsigned int FRAM_WRITE[WRITE_SIZE];
int main (空)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT
PJSEL0 = BIT4 | BIT5; //对于 LFXT
//初始化 LCD 段0 - 21;26 - 43
LCDCPCTL0 = 0xFFFF;
LCDCPCTL1 = 0xFC3F;
LCDCPCTL2 = 0x0FFF;
//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
//配置 LFXT 32kHz 晶振
CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
CSCTL4 &=~LFXTOFF; //启用 LFXT
操作
{
CSCTL5 &=~LFXTOFFG; //清除 LFXT 故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1 & OFIFG); //测试振荡器故障标志
CSCTL0_H = 0; //锁定 CS 寄存器
//配置 RTC_C
RTCCTL0_H = RTCKEY _H; //解锁 RTC
RTCCTL0_L = RTCTEVIE | RTCRDYIE; //启用 RTC 读取就绪中断
//启用 RTC 时间事件中断
RTCCTL1 = RTCBCD | RTCHOLD | RTCMODE; // RTC 使能、BCD 模式、RTC 保持
RTCYEAR = 0x2010; //年= 0x2010
RTCMON = 0x4; //月= 0x04 =四月
RTCDAY = 0x05; //天= 0x05 =第5个
RTCDOW = 0x01; //周中某天= 0x01 =星期一
RTCHOUR = 0x04; //小时= 0x04
RTCMIN = 0x30; //分钟= 0x30
RTCSEC = 0x45; //秒= 0x45
//初始化 LCD_C
// ACLK、分频器= 1、预分频器= 16;4引脚 MUX
LCDCCTL0 = LCDDIV_1 | LCDPRE__16 | LCD4MUX | LCDLP;
// VLCD 在内部生成,
// V2-V4在内部生成,v5接地
//将 VLCD 电压设置为2.60v
//启用电荷泵并为其选择内部基准
LCDCVCTL = VLCD_1 | VLCDREF_0 | LCDCPEN;
LCDCCPCTL = LCDCPCLKSYNC; //时钟同步被启用
LCDCMEMCTL = LCDCLRM; //清除 LCD 存储器
//显示时间
updateLcd();
//显示2个冒号
// LCDMEM[6]= 0x04;
LCDMEM[19]= 0x04;
//打开 LCD
LCDCCTL0 |= LCDON;
RTCCTL1 &=~(RTCHOLD); //启动 RTC
DATA=FRAM_WRITE[1];
_bis_SR_register (LPM3_bits | GIE);
__no_operation();
返回0;
}
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=RTC_vector
_interrupt void RTC_ISR (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (RTC_vector))) RTC_ISR (void)
其他
错误编译器不受支持!
#endif
{
switch (__evo_in_range (RTCIV、RTCIV_RT1PSIFG))
{
案例 RTCIV_NONE: 中断; //无中断
案例 RTCIV_RTCOFIFG: 中断; // RTCOFIFG
案例 RTCIV_RTCRDYIFG: // RTCRDYIFG
P1OUT ^= 0x01; //每秒切换 P1.0
updateLCD(); //更新分段的 LCD
中断;
案例 RTCIV_RTCTEVIFG: // RTCEVIFG
__no_operation(); //每分钟中断一次
中断;
案例 RTCIV_RTCAIFG: 中断; // RTCAIFG
案例 RTCIV_RT0PSIFG: 中断; // RT0PSIFG
案例 RTCIV_RT1PSIFG: 中断; // RT1PSIFG
默认值:break;
}
}
void updateLcd (void)
{ LCDMEM[pos6]= LCD_num[(data%10)];
LCDMEM[pos5]= LCD_num[(data/10)];
LCDMEM[pos1]= char_gen_asci['U'-32][0];
LCDMEM[pos1e]= char_gen_asci['U'-32][1];
LCDMEM[pos2]= char_gen_asci['Z'-32][0];
LCDMEM[pos2e]= char_gen_asci['Z'-32][1];
LCDMEM[pos3]= char_gen_asci['W'-32][0];
LCDMEM[pos3E]= char_gen_asci['W'-32][1];
LCDMEM[pos4]= char_gen_asci['O'-32][0];
LCDMEM[pos4e]= char_gen_asci['O'-32][1];
LCDMEM[pos5e]= char_gen_asci[numb+4][1];
LCDMEM[pos6]= char_gen_asci[numb+5][0];
LCDMEM[pos6e]= char_gen_asci[numb+5][1];*/
//显示2个冒号
LCDMEM[19]= 0x04;
Data++;
如果(data>=65) data=1;
FRAMWrite();
}
空 FRAMWrite (空)
{
unsigned int i=0;
对于(i=0;i<100;i++)
{
FRAM_WRITE[i]=数据;
}
}
您好、recyzysztof、
我知道您将 FRAM_WRITE 定义为#pragma NOINIT、这将确保不会初始化此变量 、但这不会将 FRAM_WRITE 放入 FRAM 中。
为了将 FRAM_WRITE 放入 FRAM 中、您需要将其定义为#pragma PERSISTENT 并将其初始化为0。 这只会在首次下载时初始化它,然后在下载后不会初始化它。
如果您想使用 NOINIT 并将其放置在 FRAM 中、则需要修改 lnk_msp430fr6989.cmd 文件。 删除".TI.noinit :{}>RAM"并将 .TI.noinit 添加 到与 .TI.persistent 相同的组中。 如下图所示。
要检查变量是否放置在 FRAM 中、您可以检查该变量的地址。 FRAM 原点= 0x4400、长度= 0xBB80。
如果您有任何疑问、请告诉我。
谢谢、
是的
不幸的是。
如果我在 所有情况下都设置 PERSISTENT 或 NOINIT =、则 FRAM 中的值会被复位。 当然、地址是0x004400。
但我看到了有趣的想法-如果我在表中只使用一个位置-例如读取这些 FRAM_WRITE[127]、我看到值为0、但表中的另一条记录具有最后的值。 我不理解这一点。
我使用 CCS 6.1和 Launchpad FR6989。