MSP432 BSL流程(UART)

发布者:大头玩家最新更新时间:2020-01-03 来源: eefocus关键字:MSP432  BSL流程  UART 手机看文章 扫描二维码
随时随地手机看文章

升级流程

PC程序会解析脚本中的命令,根据命令码做相应的操作。数据来自于命令后的文件(当前目录下的数据文件)


# cat script_P4xx_uart.txt


LOG     //记录日志

MODE P4xx UART 9600 COM25 PARITY    //初始化串口

RX_PASSWORD_32 .pass256_wrong.txt  //解锁BSL

RX_PASSWORD_32 .pass256_default.txt

MASS_ERASE      //擦除整块flash

RX_DATA_BLOCK_32 Blink_LED.txt  //写flash

//RX_DATA_BLOCK_32 Blink_LED.hex

TX_BSL_VERSION_32   //获取bsl version

TX_DATA_BLOCK_32 0x0000 0x4000 ReadBlock_MSP432P401R.txt    //读flash

//TX_DATA_BLOCK_32 0x0000 0x4000 ReadBlock_MSP432P401R.hex

REBOOT_RESET    //复位


数据结构

数据结构

PC侧

COMMANDS 

需要处理的命令列表,所有的操作都是以命令形式触发


#define COMMANDS(DO)

    DO(LOG)

    DO(MODE)

    DO(RX_DATA_BLOCK)

    DO(RX_PASSWORD)

    DO(ERASE_SEGMENT)

    DO(TOGGLE_INFO)

    DO(ERASE_BLOCK)

    DO(MASS_ERASE)

    DO(CRC_CHECK)

    DO(SET_PC)

    DO(TX_DATA_BLOCK)

    DO(TX_BSL_VERSION)

    DO(TX_BUFFER_SIZE)

    DO(RX_DATA_BLOCK_FAST)

    DO(RX_DATA_BLOCK_32)

    DO(RX_PASSWORD_32)

    DO(ERASE_SEGMENT_32)

    DO(REBOOT_RESET)

    DO(CRC_CHECK_32)

    DO(SET_PC_32)

    DO(TX_DATA_BLOCK_32)

    DO(TX_BSL_VERSION_32)

    DO(RX_SECURE_DATA_BLOCK)

    DO(CHANGE_BAUD_RATE)

    DO(FACTORY_RESET)

    DO(JTAG_LOCK)

    DO(JTAG_PASSWORD)

    DO(VERBOSE)

    DO(DELAY)

    DO(CUSTOM_COMMAND)


主要函数 

命令处理中,主要命令处理函数是:接收命令处理函数和发送命令处理函数


void Interpreter::executeCommand(CommandParams cmd);    //命令处理

void Interpreter::executeRxCommand();       //接收命令

void Interpreter::executeTxCommand();       //发送命令


void UartComm::transmitBuffer(std::vector* txBuffer);  //发送数据

std::vector* UartComm::receiveBuffer(int32_t size);    //接收数据


init 

初始化的时候,PC发送一个字节“0xFF”,MSP432去计算波特率,然后回应PC一个字节“0x00”,初始化成功。连续发送10次,直到初始化成功,否则初始化失败


void UartComm::init(ModeParams* modeParams);

void UartComm::transmitP4xxInitialization();

const uint8_t loopInitialization = 10;


transmitBuffer 

每当发送数据完成,PC端都会验证MSP432回应的ACK是否正确,如果不正确,很可能MSP432没有接收到数据


Header = 0x80

txBuffer->size() & 0xFF

(txBuffer->size() >> 8) & 0xFF

txBuffer        //数据

getCheckSumLow()

getCheckSumHigh()


receiveBuffer 

接收数据格式和发送数据格式一致。接收延时1000ms,接收端会首先接收并检查ack是否正确,接收buf是256个字节


uint32_t msDelay = 1000;

this->setTimer(msDelay);

this->startReadAck(&ack, expSize);


Header = 0x80

rxUartBuffer = 256


MSP432侧

中断注册


#define BSL432_MAX_BUFFER_SIZE 262  //buf大小262个字节

volatile uint8_t BSL432_RAM_TX_Buf[BSL432_MAX_BUFFER_SIZE + 6]; //6:Header + Buffersize + CheckSum


MAP_GPIO_registerInterrupt(BSL432_UART_PORT, BSL432_PI_UARTdetect);

BSL432_PI_initUART(BSL432_UARTBaudRates9600);

BSL432_PI_sendByteUART(BSL432_ACK);


BSL432_PI_UARTdetect:中断处理函数。响应PC端初始化流程,计算波特率并初始化UART,最后回应PC ACK


MAP_UART_registerInterrupt(BSL432_UART_MODULE, BSL432_PI_IRQ_UART);

void BSL432_PI_IRQ_UART(void);

uint8_t receivedData = MAP_UART_receiveData(BSL432_UART_MODULE);

BSL432_ReceiveBuffer[BSL432_PI_IRQ_RxDataCnt++] = receivedData;


BSL432_PI_IRQ_UART:接收中断处理函数。当有中断触发,MSP432开始接收数据,把数据保存到BSL432_ReceiveBuffer中,直到接收完成


数据解析


BSL432_eventFlags BSL432_PI_receivePacketUART();


数据解析由BSL432_PI_receivePacketUART函数完成。主要功能是校验头,记录数据大小,校验checksum 

BSL循环去接收串口数据,直到收完指定Buffersize大小,做一次处理


数据处理


void BSL432_CI_interpretCommand();


当一个正确的包接收并解析完成,由BSL432_CI_interpretCommand做数据处理并回应PC ACK


BSL432 Commands 

BSL侧命令列表,和PC侧是一一对应的


#define BSL432_RX_DATA_BLOCK     0x10

#define BSL432_RX_DATA_BLOCK_32  0x20

#define BSL432_RX_PASSWORD       0x21

#define BSL432_ERASE_SECTOR      0x12

#define BSL432_ERASE_SECTOR_32   0x22

#define BSL432_RX_MASS_ERASE     0x15

#define BSL432_REBOOT_RESET      0x25

#define BSL432_RX_CRC_CHECK      0x16

#define BSL432_RX_CRC_CHECK_32   0x26

#define BSL432_RX_LOAD_PC        0x17

#define BSL432_RX_LOAD_PC_32     0x27

#define BSL432_TX_DATA_BLOCK     0x18

#define BSL432_TX_DATA_BLOCK_32  0x28

#define BSL432_TX_BSL_VERSION    0x19

#define BSL432_FACTORY_RESET     0x30

#define BSL432_CHANGE_BAUD_RATE  0x52


BSL432_RX_DATA_BLOCK


void BSL432_CI_receiveDataBlock(uint32_t addr, uint8_t *data)

{

    uint8_t returnValue = BSL432_API_openMemory(); //flash写使能


    // Check if there is data in buffer (cmd + addr take 4 bytes, 24 bit addr)

    if((returnValue == BSL432_SUCCESSFUL_OPERATION) & (BSL432_ReceiveBufferSize > 4))

    {

        returnValue = BSL432_API_writeMemory(addr, BSL432_ReceiveBufferSize - 4, data); //写flash

    }


    BSL432_CI_sendMessage(returnValue); //回应PC

    BSL432_API_closeMemory(); //flash写锁定

}


BSL432_CI_receivePassword 

解锁BSL。对flash操作首先需要flash为非锁定状态,否则操作失败


void BSL432_CI_receivePassword()

{

    if (BSL432_API_unlockBSL(&BSL432_ReceiveBuffer[4]) == BSL432_SUCCESSFUL_OPERATION)

    {

        BSL432_CI_sendMessage(BSL432_ACK); //回应PC

    }

    else

    {

        BSL432_CI_sendMessage(BSL432_PASSWORD_ERROR);

    }

}


BSL432_ERASE_SECTOR


uint8_t BSL432_API_eraseSector(uint32_t addr)

{

    uint8_t exceptions = BSL432_LOCKED;

    if(BSL432_LockedStatus == BSL432_STATUS_UNLOCKED)

    {

        exceptions = BSL432_SUCCESSFUL_OPERATION;

        exceptions = BSL432_API_openMemory();

#ifdef __MSP432P401R__

        MAP_FlashCtl_eraseSector(addr); //擦除指定扇区

#elif defined __MSP432P4111__

        MAP_FlashCtl_A_eraseSector(addr);

#else

#error Device not defined.

#endif

        exceptions = BSL432_API_closeMemory();

    }

    else

    {

        exceptions = BSL432_LOCKED;

    }

    return exceptions;

}


BSL432_RX_MASS_ERASE


uint8_t BSL432_API_massErase(uint32_t locked); //擦除整块扇区


BSL432_RX_CRC_CHECK


void BSL432_CI_CRCCheck(uint32_t addr, uint32_t length); //CRC校验


BSL432_RX_LOAD_PC


uint8_t BSL432_API_callAddress(uint32_t addr); //加载指定地址程序


BSL432_TX_DATA_BLOCK


void BSL432_CI_sendDataBlock(uint32_t addr, uint32_t length); //获取指定地址数据,发送给PC


BSL432_TX_BSL_VERSION


BSL432_CI_sendDataBlock((uint32_t)(&BSL432_VersionVendor), 10); //获取版本,发送给PC


BSL432_REBOOT_RESET


void BSL432_API_rebootReset(); //重启


BSL432_FACTORY_RESET


uint8_t BSL432_API_factoryReset(uint8_t *data); //恢复出厂设置

关键字:MSP432  BSL流程  UART 引用地址:MSP432 BSL流程(UART)

上一篇:MSP432开发板串口调试
下一篇:MSP432实现printf 输出

推荐阅读最新更新时间:2024-11-12 11:06

一文了解UART总线工作原理、优缺点和应用
还记得当年的打印机,鼠标和调制解调器吗?他们都有巨大笨重的连接器和粗电缆,并且必须拧到你的电脑上。这些设备正是使用UART协议与计算机进行通信。虽然USB几乎完全取代了旧的电缆和连接器,但UART绝对没有过时。您会发现目前许多项目中使用UART的GPS模块、蓝牙模块和RFID读卡器模块等连接到Raspberry Pi,Arduino或其他微控制器上。 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。 它不是像SPI
[嵌入式]
一文了解<font color='red'>UART</font>总线工作原理、优缺点和应用
STM32 FreeModbus RTU从机移植以及UART配置
FreeModbus的具体介绍就不提了。至于为什么要移植,大概就是因为移植比较快,而且比较稳定,可以减少因为自己编写出现的漏洞。 但是FreeModbus 1.5版本是没有主机的,因此移植的时候只可以做从机。网上有几个关于Modbus主机的源代码,回头等我弄好了再更新。 ================================== 理论上来说,此处我移植了全部,但是只调试了RTU部分,因此其他部分不做赘述。 移植过程: 1.将modbus目录下所有文件拷贝加入工程。 2.对modbus中的include下的mbconfig.h进行编辑,裁剪其中需要的模块。(此处我没有进行裁剪,因此选项都是默认) 3.将
[单片机]
STM32 FreeModbus RTU从机移植以及<font color='red'>UART</font>配置
MSP432学习笔记:GPIO的使用与配置
有官方提供的库函数中有以下库函数,让我们来一一解答。 个人认为GPIO函数主要分两类一类是GPIO中断配置函数 主要有以下几个参数设置大同小异,selectedPort可选有 GPIO_PORT_P1 GPIO_PORT_P2 GPIO_PORT_PA 而selectedPins可选有 GPIO_PIN0 GPIO_PIN1 GPIO_PIN2 GPIO_PIN3 GPIO_PIN4 GPIO_PIN5 GPIO_PIN6 GPIO_PIN7 GPIO_PIN8 GPIO_PIN9 GPIO_PIN10 GPIO_PIN11 GPIO_PIN12 GPIO_PIN13 GPIO_PIN14 GPIO_PIN15 //GPI
[单片机]
MSP432(Keil5)——10.通过匿名上位机看数据
使用过匿名上位机的朋友应该知道,这个软件还是做的十分不错的,加之其可以通过串口将数据发送到电脑上,完成波形的显示,十分有效。 本次例程将完成在MSP432上与上位机通讯协议的编写。 在这个实例中我只完成了03号命令的发送,具体拓展可以自己修改。如果对匿名上位机不了解的话,建议先学习B站课程:传送门,一下就学会了,以后学其他的协议也很快。 ano.c #include ano.h unsigned char DataToSend ; //发送数组缓冲区 void ANO_Send03(short a,short b,short c,unsigned char d) { unsigned char cnt =
[单片机]
<font color='red'>MSP432</font>(Keil5)——10.通过匿名上位机看数据
S3C2440的UART详解
1、UART原理简介 在介绍2440的UART控制器之前,我们首先来了解一下UART的原理 UART:Universal Asynchronous Receiver/Transmitter(通用异步收发送器),用来传输串行数据,发送数据时,CPU将并行数据写入UART,UART按照一定格式在TxD线上串行发出;接收数据时,UART检测到RxD线上的信号,将串行收集放到缓冲区中,CPU即可读取UART获得的这些数据。 UART最精简的连线形式只有3根线,TXD用于发送,RXD用于接收,GND用于提供参考电平。UART之间以帧作为数据传输单位,帧由具有完整意义的若干位组成,它包含开始位、数据位、校验位和停止位。发送数据之前,互相通信
[单片机]
S3C2440的<font color='red'>UART</font>详解
51单片机入门——UART串口通信
前言 通信,按照传统的理解就是信息的传输与交换。对于单片机来说通信则与传感器、存储芯片、外围控制芯片等技术紧密结合,成为整个单片机系统的“神经中枢”。没有通信,单片机所实现的功能仅仅局限于单片机本身,就无法通过其它设备获得有用信息,也无法将自己产生的信息告诉其它设备。如果单片机通信没处理好的话,它和外围器件的合作程度就受到限制,最终整个系统也无法完成强大的功能,由此可见单片机通信技术的重要性。UART(Universal Asynchronous Receiver/Transmitter,即通用异步收发器)串行通信是单片机最常用的一种通信技术,通常用于单片机和电脑之间以及单片机和单片机之间的通信。 1.什么是串行通信 通信按照
[单片机]
51单片机入门——<font color='red'>UART</font>串口通信
STM8S_004_UART基本收发数据
Ⅰ、写在前面 做软件开发的人都知道打印信息的重要,说到打印信息,我们就不得不说UART串口打印。做单片机开发的人,打印信息主要的来源就是UART串口打印。因此,关于UART相关的知识就比较重要。 printf、scanf这种标准的函数不只是可以在电脑上可以使用,在我们单片机上也同样可以使用,本文只讲述关于UART的基础知识,关于printf、scanf这一块后面将再次给大家整理一篇文章。 本文将结合“STM8S参考手册”和软件源代码给大家讲述关于UART的基础知识和用法。 为方便大家阅读,本文内容已经整理成PDF文件: http://pan.baidu.com/s/1i5uWhJR 作者:strongerHuan
[单片机]
STM8S_004_<font color='red'>UART</font>基本收发数据
51单片机IO口模拟UART串口通信
#include reg52.h #include main.h #include smartcard.h #include stdio.h typedef enum { false, true }bool; #if 0 sbit PIN_RXD = P1^0; //接收发送同一个引脚定义 sbit PIN_TXD = P1^0; //接收发送同一个发送引脚定义 sbit PIN_CLK = P3^1; //智能卡时钟引脚定义 sbit PIN_3v5v = P3^2; //智能卡3v_5v引脚定义 sbit PIN_RST = P3^3; //智能卡复位引脚定义 sbit PIN_CMDVCC = P3^4; //智能卡CMD
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved