升级流程

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

# cat script_P4xx_uart.txtLOG     //记录日志
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    //复位
Created with Raphaël 2.1.2PCPCBSLBSL解锁BSLBSL检验。检验成功解锁BSL成功返回0x00;失败返回0x05擦除整块flash成功返回0x00;失败返回0x04写flash成功返回0x00;失败返回0x04获取bsl version成功返回version;失败返回0x04读flash成功返回flash数据;失败返回0x04flash数据记录到文件复位

数据结构

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<uint8_t>* txBuffer);  //发送数据
std::vector<uint8_t>* 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); //回应PCBSL432_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.
#endifexceptions = 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)相关推荐

  1. MSP432库函数学习笔记-UART

    目录 MSP432工作框图 UART初始化 UART使能 UART数据传输 UART休眠 UART状态查询 UART中断使能 UART中断状态查询和中断处理 UART字符串传输 MSP432工作框图 ...

  2. IC验证之UART模块

    IC验证之UART模块 1.UART 模块 1.1UART 工作原理 1.2UART 模块初始化流程 2.UART 流控信号 3.Modem 3.1计算机与modem连接 3.2计算机与非modem连 ...

  3. 基于 FPGA 的 UART 控制器设计(VHDL)(下)

    今天给大侠带来基于FPGA的 UART 控制器设计(VHDL)(下),由于篇幅较长,分三篇.今天带来第三篇,下篇,使用 FPGA 实现 UART.话不多说,上货. 之前有关于 Veriliog HDL ...

  4. esp32的uart串口发送16进制通信指令调用实例

    esp32的uart串口发送16进制通信指令调用实例 简介 最近想用esp32通过uart发送的16进制指令来控制一个语言播放模块,记录一下调用uart的过程,请大佬斧正.比较愚笨,过程中踩了很多坑, ...

  5. MSP432的串行通信

    目录 专栏 数字通信基本知识 组成 串行通信和并行通信 同步通信和异步通信 异步串行通信的通用基础知识 异步串行通信的格式 串行通信的波特率 奇偶校验 串行通信传输方式术语 1.全双工(Full-du ...

  6. Linux驱动开发——串口设备驱动

    Linux驱动开发--串口设备驱动 一.串口简介 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单.使用两条线即可实现双向通信,一条用于发送,一条用于 ...

  7. ZYNQ7035PS--串口打印 及串口通信原理

    琐碎知识点 PS端的IO分配相对固定,不能任意分配,且不需要在Vivado软件里分配管脚.但还是需要建立Vivado工程配置PS管脚.在IP生成的输出文件中已经包含了PS端引脚分配的XDC文件,绑定了 ...

  8. 2021年电赛信号失真度测量装置(A题)

    2021年全国大学生电子设计竞赛 信号失真度测量装置(A题) [本科组] 目录 摘 要 1 方案的论证与选择 1.1 输入信号处理的论证与选择 1.2 显示方案的论证与选择 1.3 THD计算的论证与 ...

  9. V210 UART TX 流程

    1. 虽然V210的uart驱动是平台总线设备驱动模型,但实际上他还是以字符设备驱动存在,那么分析他的发送流程, 首先找到他的file_operations的write函数 drivers/char/ ...

  10. V210 UART 整体流程

    2.6内核以后,多数驱动都是以平台总线的方式编写,因此对于这种类型的驱动,实际就是要分成两个流程来分析 平台总线设备的构造,平台总线驱动的构造. 下面先分析平台总线设备的构造,平台总线设备里是硬件相关 ...

最新文章

  1. Go语言之 Struct Tag
  2. 华硕服务器 u盘安装系统,华硕用u盘如何安装系统
  3. xml配置linux启动脚本,linux中利用Shell脚本实现自动安装部署weblogic服务
  4. redis笔记_源码_简单动态字符串SDS
  5. 【系统设计】架构设计说明书
  6. JAVA xml转dom_如何在Java中将String转换为DOMSource?
  7. 【python】面向对象类、对象的介绍
  8. 求一个有序整数数组中和为K的数的对数
  9. 打破数据孤岛难题,翼方健数解码隐私安全计算技术
  10. java 文件无法下载_无法从Java中的URL下载文件
  11. apiclod 上传图片_apiCloud图片选择、处理、上传模块
  12. B18-iOS9的适配相关
  13. esp8266 爆改车间主任版本 使用 已解决
  14. c++获取子类窗口句柄位置_C++中各种获取窗口句柄的方法
  15. 关于0.96OLED的显示过程详解(I2C通信方式)
  16. SpringBoot 集成积木报表
  17. Rockchip平台DDR调试排查手段
  18. 一个屌丝程序猿的人生(二十一)
  19. android caj转word,如何把整篇CAJ文章转换成Word文档
  20. 内外双修,人剑合璧——IT运维人员的九阳神功(大结局)

热门文章

  1. Matlab yalmip 符号变量syms和sdpvar的替换
  2. flea-jersey使用之Flea RESTful接口介绍
  3. 【白帽子学习笔记】CTF实践
  4. python求偏导_python中几种自动微分库解析
  5. 268. 丢失的数字【我亦无他唯手熟尔】
  6. 主板风扇转不开机是什么问题_电脑主板通电,风扇也转,怎么开不了机,显示屏也没反应...
  7. W3Cschool从零开始学C语言笔记(1-2)位、字节及排列组合
  8. free源码分析---1
  9. centos7+ 安装RabbitMQ
  10. 简单体验阿里巴巴在线java诊断工具Arthas