历史上的今天
返回首页

历史上的今天

今天是:2025年01月03日(星期五)

正在发生

2020年01月03日 | MSP432 BSL流程(UART)

2020-01-03 来源:eefocus

升级流程

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); //恢复出厂设置

推荐阅读

史海拾趣

Clulite公司的发展小趣事
  1. 创业初期
    • 描述Clulite公司的创始人或核心团队如何识别电子行业中的某个市场机遇。
    • 讲述他们是如何筹集初始资金,设立公司,并开发出第一款产品或解决方案的。
    • 可以提及公司在初创阶段面临的挑战,如技术难题、市场竞争等。
  2. 技术创新
    • 讲述Clulite如何通过研发创新,推出了一款颠覆性的产品或技术,从而获得了市场认可。
    • 详细描述这一创新过程,包括研发团队的努力、关键技术的突破等。
    • 提及这一创新如何帮助公司在市场上取得了竞争优势。
  3. 市场拓展
    • 描述Clulite如何逐步扩大市场份额,从地区市场走向全国乃至国际市场。
    • 可以讲述公司如何建立销售网络、与合作伙伴建立合作关系,以及参与行业展会等活动来推广品牌和产品。
    • 提及公司在市场拓展过程中遇到的挑战和应对策略。
  4. 品质管理
    • 讲述Clulite如何注重产品质量和客户体验,通过严格的质量控制流程来提升产品可靠性。
    • 描述公司如何建立完善的售后服务体系,为客户提供及时、专业的支持。
    • 提及这些举措如何帮助公司赢得了客户的信任和口碑。
  5. 可持续发展
    • 讲述Clulite如何关注环境保护和社会责任,推动公司的可持续发展。
    • 描述公司如何采取环保措施,减少生产过程中的污染排放。
    • 提及公司如何参与社会公益事业,回馈社会。

请注意,这些故事需要根据Clulite公司的实际情况进行调整和补充。如果你需要更具体的内容,建议查阅Clulite公司的官方网站、新闻报道或行业分析报告,以获取更详细的信息和数据。

HCC Industries公司的发展小趣事

面对日益激烈的市场竞争和快速变化的市场需求,HCC Industries在2020年启动了数字化转型计划。公司投入大量资金引入先进的自动化生产线和智能化管理系统,实现了从原材料采购到成品出厂的全链条数字化管理。这一举措不仅大幅提高了生产效率和产品质量,还降低了运营成本和库存风险。同时,HCC还利用大数据和人工智能技术优化产品设计和市场策略,进一步提升了其市场竞争力。

Astec [Astec America, Inc]公司的发展小趣事

随着全球环保意识的不断提高,Astec也开始关注绿色环保和可持续发展问题。公司积极采用环保材料和节能技术,推出了一系列绿色电源产品。同时,Astec还加大了对环保技术的研发力度,努力在保持产品性能的同时,降低生产过程中的能耗和排放。这些举措不仅有助于公司应对环保法规的挑战,还提升了公司的社会形象。

超音(CY)公司的发展小趣事

品质是超音一直以来的追求。公司注重产品质量管理,建立了完善的质量检测体系,确保每一件产品都符合高标准的质量要求。同时,超音还加强了品牌建设,通过广告宣传、赞助活动等方式提升品牌知名度和美誉度。这些努力使得超音在消费者心中树立了良好的品牌形象,为公司的长期发展奠定了坚实的基础。

Anixter Inc公司的发展小趣事

为了进一步提升品牌影响力,超音开始积极拓展国际市场。公司参加了多个国际展会,与国际知名音频设备厂商建立了合作关系。同时,超音还加强了与国际市场的沟通和交流,了解不同地区的消费者需求,针对性地推出符合当地市场需求的产品。这些努力使得超音在国际市场上的知名度不断提升,产品销量也稳步增长。

Electro-Films Inc Semi-Films Div公司的发展小趣事

进入21世纪后,随着全球电子产业的蓬勃发展,Semi-Films Division 开始积极拓展国际市场。公司参加了多个国际性的电子产品展览会,与全球各地的客户建立了联系。同时,公司还加大了对海外市场的投入,设立了多个海外办事处和代理商,为客户提供更加便捷的服务。这些举措使得 Semi-Films 的产品逐渐走向世界,成为国际知名的薄膜材料供应商。

问答坊 | AI 解惑

WINCE下电话与IE共存问题!

嘿 各位:    现在我想在WINCE6.0下面做一个电话与IE共存的软件,想要做到当如果在下载数据或是浏览网页的时候有电话打进来需要挂住数据通道,电话接完后可以很快的浏览网页或是下载数据,以前我采用的方式是RAS函数库+AT指令方式,当想 ...…

查看全部问答>

关于CE下线程执行优先级的问题

{ ...... // 启动线程,开始播放声音, 并将线程的优先权设置为最高,希望它立即去执行 HANDLE m_hThread = CreateThread(NULL, 0, TOPlaySoundThread, NULL, 0, NULL); SetThreadPriority( m_hThread,THREAD_PRIORITY_TIME_CRITICAL); Sleep( ...…

查看全部问答>

请教高手printf和vprintf的问题

环境Vxworks 5.5.1 在相同的地方,如果使用printf可以正确打印,但是使用vprintf就会报如下错误:     CPU: Motorola MPC82xx ADS - HIP7    Runtime Name: VxWorks Runtime Version: 5.5.1     BSP version: 1 ...…

查看全部问答>

有关噪音传感器的问题

大师们好!     有谁能给我提供一些噪音传感器的商品介绍。加入测马路上的噪音应该用到什么样子灵敏度的噪音,有没有推荐的。     只有mic加放大器够用么?…

查看全部问答>

怎么使得CComboBox默认是上拉?

一般来说只要到屏幕底端有足够空间,就下拉. 如果没有足够空间就上拉. 那么应该存在的上拉这个功能. 我想让它自动默认的为上拉,该怎么做? 如果不行,也可以这样,让下拉菜单不要长出我的对话框的底端也可以…

查看全部问答>

LPC1114数据寄存器

最近又看了一下LPC1114的数据寄存器的内容。数据寄存器允许从被设置为输入的引脚上读取数据,往被设置输出的引脚写值。每个端口数据寄存器占用地址空间的0-0X3FFC,地址位13:2用于屏蔽。如图1:  原先一直对这个数据屏蔽作用搞不太懂,现在 ...…

查看全部问答>

求 邦华330 无线扩音器电路原理图!

邦华330改进版、 最新功能:数字收音,USB、SD读卡功能,数字显示屏,卡座功能           技术参数:   1.电源:AC220V 内置DC12V/1.2AH 蓄电池,外接VDC   2.频率范围:VHF165-265MHz   3.振 ...…

查看全部问答>

卖点多余下来的零散东西

大家好,最近整理了一下,整理出好多打样有没有使用,多余的东西。有继电器、各种芯片、可燃气体传感器等等好多种类,但是每种数量都很少,这里就不一一列举了。如果你需要,可以QQ我,告诉我你要的一些常用的东西,我尽量帮你找,一次性处理,想收 ...…

查看全部问答>

版主jishuaihu, 小小白, 江汉大学南瓜帮忙看看

https://bbs.eeworld.com.cn/thread-308442-1-1.html 此贴貌似冒的人看啊!给新人一点帮助嘛!…

查看全部问答>

电化学酒精传感器

各位朋友,那位大哥了解这个内传感器,找遍了国内做传感器的都没有做这个传感器,小弟愚昧到目前还没有这类传感器的具体型号.各位在传感器行业做了很久,应该有所了解有个项目要做个酒精检测仪器不能用常见那个半导体气敏传感器!现在头大啊!求各位帮帮 ...…

查看全部问答>