工具/软件:
大家好:
我们正在为开发自定义引导加载程序 MSP430F6775A 微控制器、在该微控制器中、我们需要通过 USART2接收数据(以十六进制格式)(使用 RX 和 TX 引脚)、然后将该数据存储在中 闪存 起始价格 地址0x1000 。 我还使用 TTL 到 RS485转换器 外设。
以下是我尝试执行的一般流程:
-
数据接收:
-
引导加载程序应通过在串行接口上接收一个十六进制文件 USART2 。
-
接收到的数据存储在缓冲区中。
-
-
写入闪存:
-
收到数据后、我尝试将其写入 闪存 起始价格 地址0x1000 。
-
-
问题:
-
代码编译和上载成功、但数据未正确写入闪存或接收不正确。
-
我们无法看到闪存内容有任何变化、或者数据可能无法正确写入。
-
到目前为止、我已经尝试过:
-
我们提到了 MSP430闪存 BSL 用户指南 并搜索中的示例 MSP430F6xxx 系列 引导加载程序参考代码。
-
我们将代码编写到:
-
通过 USART2接收数据并将其存储在缓冲区中。
-
应用
FCTL1和FCTL3用于解锁和写入闪存的寄存器。
-
-
引导加载程序逻辑似乎可以解决问题、但我不确定是否满足以下条件:
-
闪存已正确解锁 如果是 写入程序正确 。
-
使用时有任何问题 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 中适用于定制引导加载程序的任何示例。
提前感谢!