MSP432 BSL流程(UART)
升级流程
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 //复位
数据结构
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)相关推荐
- MSP432库函数学习笔记-UART
目录 MSP432工作框图 UART初始化 UART使能 UART数据传输 UART休眠 UART状态查询 UART中断使能 UART中断状态查询和中断处理 UART字符串传输 MSP432工作框图 ...
- IC验证之UART模块
IC验证之UART模块 1.UART 模块 1.1UART 工作原理 1.2UART 模块初始化流程 2.UART 流控信号 3.Modem 3.1计算机与modem连接 3.2计算机与非modem连 ...
- 基于 FPGA 的 UART 控制器设计(VHDL)(下)
今天给大侠带来基于FPGA的 UART 控制器设计(VHDL)(下),由于篇幅较长,分三篇.今天带来第三篇,下篇,使用 FPGA 实现 UART.话不多说,上货. 之前有关于 Veriliog HDL ...
- esp32的uart串口发送16进制通信指令调用实例
esp32的uart串口发送16进制通信指令调用实例 简介 最近想用esp32通过uart发送的16进制指令来控制一个语言播放模块,记录一下调用uart的过程,请大佬斧正.比较愚笨,过程中踩了很多坑, ...
- MSP432的串行通信
目录 专栏 数字通信基本知识 组成 串行通信和并行通信 同步通信和异步通信 异步串行通信的通用基础知识 异步串行通信的格式 串行通信的波特率 奇偶校验 串行通信传输方式术语 1.全双工(Full-du ...
- Linux驱动开发——串口设备驱动
Linux驱动开发--串口设备驱动 一.串口简介 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单.使用两条线即可实现双向通信,一条用于发送,一条用于 ...
- ZYNQ7035PS--串口打印 及串口通信原理
琐碎知识点 PS端的IO分配相对固定,不能任意分配,且不需要在Vivado软件里分配管脚.但还是需要建立Vivado工程配置PS管脚.在IP生成的输出文件中已经包含了PS端引脚分配的XDC文件,绑定了 ...
- 2021年电赛信号失真度测量装置(A题)
2021年全国大学生电子设计竞赛 信号失真度测量装置(A题) [本科组] 目录 摘 要 1 方案的论证与选择 1.1 输入信号处理的论证与选择 1.2 显示方案的论证与选择 1.3 THD计算的论证与 ...
- V210 UART TX 流程
1. 虽然V210的uart驱动是平台总线设备驱动模型,但实际上他还是以字符设备驱动存在,那么分析他的发送流程, 首先找到他的file_operations的write函数 drivers/char/ ...
- V210 UART 整体流程
2.6内核以后,多数驱动都是以平台总线的方式编写,因此对于这种类型的驱动,实际就是要分成两个流程来分析 平台总线设备的构造,平台总线驱动的构造. 下面先分析平台总线设备的构造,平台总线设备里是硬件相关 ...
最新文章
- Go语言之 Struct Tag
- 华硕服务器 u盘安装系统,华硕用u盘如何安装系统
- xml配置linux启动脚本,linux中利用Shell脚本实现自动安装部署weblogic服务
- redis笔记_源码_简单动态字符串SDS
- 【系统设计】架构设计说明书
- JAVA xml转dom_如何在Java中将String转换为DOMSource?
- 【python】面向对象类、对象的介绍
- 求一个有序整数数组中和为K的数的对数
- 打破数据孤岛难题,翼方健数解码隐私安全计算技术
- java 文件无法下载_无法从Java中的URL下载文件
- apiclod 上传图片_apiCloud图片选择、处理、上传模块
- B18-iOS9的适配相关
- esp8266 爆改车间主任版本 使用 已解决
- c++获取子类窗口句柄位置_C++中各种获取窗口句柄的方法
- 关于0.96OLED的显示过程详解(I2C通信方式)
- SpringBoot 集成积木报表
- Rockchip平台DDR调试排查手段
- 一个屌丝程序猿的人生(二十一)
- android caj转word,如何把整篇CAJ文章转换成Word文档
- 内外双修,人剑合璧——IT运维人员的九阳神功(大结局)
热门文章
- Matlab yalmip 符号变量syms和sdpvar的替换
- flea-jersey使用之Flea RESTful接口介绍
- 【白帽子学习笔记】CTF实践
- python求偏导_python中几种自动微分库解析
- 268. 丢失的数字【我亦无他唯手熟尔】
- 主板风扇转不开机是什么问题_电脑主板通电,风扇也转,怎么开不了机,显示屏也没反应...
- W3Cschool从零开始学C语言笔记(1-2)位、字节及排列组合
- free源码分析---1
- centos7+ 安装RabbitMQ
- 简单体验阿里巴巴在线java诊断工具Arthas