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.

[参考译文] MSP430F6775A:MSP430F6775A

Guru**** 2442090 points
Other Parts Discussed in Thread: MSP430F6775A

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1514202/msp430f6775a-msp430f6775a

器件型号:MSP430F6775A

工具/软件:

大家好:

我们正在为开发自定义引导加载程序 MSP430F6775A 微控制器、在该微控制器中、我们需要通过 USART2接收数据(以十六进制格式)(使用 RX 和 TX 引脚)、然后将该数据存储在中 闪存 起始价格 地址0x1000 。 我还使用 TTL 到 RS485转换器 外设。

以下是我尝试执行的一般流程:

  1. 数据接收:

    • 引导加载程序应通过在串行接口上接收一个十六进制文件 USART2

    • 接收到的数据存储在缓冲区中。

  2. 写入闪存:

    • 收到数据后、我尝试将其写入 闪存 起始价格 地址0x1000

  3. 问题:

    • 代码编译和上载成功、但数据未正确写入闪存或接收不正确。

    • 我们无法看到闪存内容有任何变化、或者数据可能无法正确写入。

到目前为止、我已经尝试过:

  • 我们提到了 MSP430闪存 BSL 用户指南 并搜索中的示例 MSP430F6xxx 系列 引导加载程序参考代码。

  • 我们将代码编写到:

    • 通过 USART2接收数据并将其存储在缓冲区中。

    • 应用 FCTL1FCTL3用于解锁和写入闪存的寄存器。

  • 引导加载程序逻辑似乎可以解决问题、但我不确定是否满足以下条件:

    • 闪存已正确解锁 如果是 写入程序正确

    • 使用时有任何问题 USART2配置 TTL 到 RS485转换器 消息。

我使用的代码片段:

void jump_to_application (void){
void (* app_reset_vector)(void);//定义一个指向应用程序复位向量的函数指针
APP_RESET_VECTOR =(void (*)(void)) 0x2000;//将函数指针设置为应用程序的开始
app_reset_vector();//跳转到应用程序(调用复位矢量)
}

//用于初始化 USART0的函数
void init_usart0 (void){
P3SEL |= BIT0+ BIT1;//将 P3.0设置为 TX、将 P3.1设置为 RX
UCA0CTL1 |=UCSWRST;
UCA0CTL1 |=UART_CLK_SRC;  
uint16_t n = SMCLK_FREQ/baudrate;//SMCLK_FREQ=32768 、 baudrate=9600
UCA0BR0 = 104;//低位字节
UCA0BR1 = 0;//高位字节
UCA1MCTL = UCBRS_1 + UCBRF_0;////调制设置
UCA0CTL1且=~Ω(UCSWRST);//从复位中释放 eUSCI
}


void write_flash (uint32_t addr、uint8_t *data、uint16_t length){  //函数将数据写入闪存
uint16_t *flash_ptr =(uint16_t *) addr;
uint16_t i;

//解锁闪存
FCTL3 = FWKEY;
FCTL1 = FWKEY + ERASE;
* flash_ptr = 0;//虚拟写入以擦除

//启用闪存写入
FCTL1 = FWKEY + WRT;

//将数据写入闪存
对于(i = 0;i < length;i += 2){
uint16_t word = data[i];
如果(i + 1 < length){
字|=((uint16_t) data[i + 1])<< 8;
}
*flash_ptr++= word;
}

//禁用闪存写入
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
}

void Tx_Byte_(字符数据){

while (!(UCA0IFG & UCTXIFG));

UCA0TXBUF =(数据);
}

int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

//初始化 USART2以进行通信
init_usart0()

//等待传入数据并将其存储在缓冲区中
while (1){
uint8_t received_byte = Rx_Byte_();//接收一个字节
  if (buffer_index < sizeof (buffer)){
   Buffer[BUFFER_INDEX++]= RECEIVED_BYTE;//将接收到的字节存储在缓冲区中
}

//如果缓冲区已满、则将数据写入闪存
if (buffer_index >= sizeof (buffer)){
  write_flash (0x1000、buffer、buffer_index);//将数据写入从0x1000开始的闪存
   Buffer_index = 0;//复位下一个数据块的缓冲区索引
}


if (received_byte == 0xFF){//示例:数据字节结束(可以自定义)
   jump_to_application();//跳转到应用程序代码
 }
}

  返回0;//主循环永远不应到达此处
}

问题/顾虑:

  • 是否有问题 USART2配置 缓冲区处理

  • 我是否遗漏了的任何重要步骤 擦除 写入闪存

  • 如何确保闪存正确启动 0x1000 并且不干扰其他部分?

  • 是否存在与相关的任何问题 TTL 到 RS485转换器

我需要哪些帮助:

如果有人能做到以下几点、我将不胜感激:

  • 提供一个示例 自定义引导加载程序 指定 MSP430F6775A 消息流 USART2 外设。

  • 提供有关的建议 调试闪存写入操作

  • 与澄清任何潜在的陷阱 USART2配置 闪存写入 MSP430F6775A。

  • c 中适用于定制引导加载程序的任何示例。

提前感谢!