历史上的今天
返回首页

历史上的今天

今天是:2025年02月03日(星期一)

2020年02月03日 | 使用STM8S自带BootLoader_2

2020-02-03 来源:eefocus

仔细读ST支持文档 UM0560,按步骤操作。


程序准备工作: 

1.开串口接收中断,发送。


/* ********************************************

UART2  configured as follow:

  - BaudRate = 115200 baud  

  - Word Length = 8 Bits

  - One Stop Bit

  - No parity

  - Receive and transmit enabled

  -  Receive interrupt

  - UART2 Clock disabled

*********************************************/

void Uart_Init(void)

{

    UART2_DeInit();

    UART2_Init((u32)115200, UART2_WORDLENGTH_8D, UART2_STOPBITS_1,

    UART2_PARITY_NO , UART2_SYNCMODE_CLOCK_DISABLE , UART2_MODE_TXRX_ENABLE);

    UART2_ITConfig(UART2_IT_RXNE_OR,ENABLE  );

    UART2_Cmd(ENABLE );


}

void UART2_SendByte(u8 data)

{   

  /* Loop until the end of transmission */

    while ((UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET)); 

    UART2_SendData8((unsigned char)data);

}


/**

  * @brief UART2 RX interrupt routine.

  * @param  None

  * @retval None

  */

#define C_UartRxMaxInx 40

uint8_t V_RxDataInx = 0;

uint8_t V_UartEndTime = 0;

uint8_t VT_RxUartData[C_UartRxMaxInx+1] = {0};

uint8_t B_RxFirts = 0;

 INTERRUPT_HANDLER(UART2_RX_IRQHandler, 21)

 {

    /* In order to detect unexpected events during development,

       it is recommended to set a breakpoint on the following instruction.

    */ 

     if(SET == UART2_GetITStatus(UART2_IT_RXNE))    //接收到数据中断

     {

        UART2_ClearITPendingBit(UART2_IT_RXNE);

        if(B_RxFirts == 0)

        {

            B_RxFirts = 1;

            V_UartEndTime =0;

            V_RxDataInx = 0;

        }   

        if(V_RxDataInx < C_UartRxMaxInx)//接收串口数据,最多接收40字节

        {

            V_UartEndTime=0;

            VT_RxUartData[V_RxDataInx] = UART2_ReceiveData8();  

            V_RxDataInx++;

        }

        else

        {

            V_UartEndTime = 0;      //超过缓存了,不在往里面写数

        }


     }

     else if(SET == UART2_GetITStatus(UART2_IT_OR)) //过载错误

     {

        UART2->SR = UART2->SR;

        UART2_ReceiveData8();       //读状态寄存器,读数据寄存器,清除中断标志

     }



 }


uint8_t B_HaveRxData = 0;

//************************************************************************

void    UartRxScan(void)

{

    if(B_RxFirts)

    {

        V_UartEndTime++;

        if(V_UartEndTime>10)//大于50ms认为是新的指令来了

        {

            B_RxFirts = 0;      //下次来数据就覆盖

            V_UartEndTime = 0;

            B_HaveRxData = 1;   //接收到真确的UART数据  

            VT_RxUartData[C_UartRxMaxInx-1]='';   //这个是保护,超过限定值就结束

        }   

    }

}


2.开定时器定时


/*

 初始化Timer2,设置1MS中断

*/

void Init_Timer2(void)

{

    TIM2_DeInit();

    TIM2_TimeBaseInit(TIM2_PRESCALER_16, 999);  //1MHz /1000 = 1000 HZ

    TIM2_ClearFlag(TIM2_FLAG_UPDATE); 

     /* Enable update interrupt */

    TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);

    TIM2_Cmd(ENABLE);

}


定时器中断服务函数,记接收超时,记反馈超时。 

接收超时单位是100ms。


 uint8_t V_SystemTimeCount = 0;

 INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)

 {

  /* In order to detect unexpected events during development,

     it is recommended to set a breakpoint on the following instruction.

  */

    TIM2_ClearITPendingBit(TIM2_IT_UPDATE);   //clear flag

    UartRxScan();

    V_SystemTimeCount++;

    if(V_SystemTimeCount>10)

    {

        V_SystemTimeCount=0;

        V_WaitResponceTime++;

    }

 }


/*

* 函数功能:清空接收数组

*/

void F_ClrRxUartData(void)

{

    B_RxFirts = 0;

    for(u8 i=0;i    {

        VT_RxUartData[i] = 0;

    }

}


/*

 函数功能:等待反馈

 输入参数:V_CMD_ADD  命令地址,在接收数据中的位置

           Commond    命令

           V_OverTime 最大响应时间

 输出参数:C_OverTime 超时

           C_Success  成功

           C_Waiting  等待

**/

uint8_t V_WaitResponceTime = 0;

uint8_t F_WaitResponce(uint8_t V_CMD_ADD,uint8_t Commond,uint8_t V_OverTime)

{

    if(V_WaitResponceTime >V_OverTime)

    {

        return C_OverTime;

    }

    else if(VT_RxUartData[V_CMD_ADD] == Commond) 

    {

            F_ClrRxUartData();

            V_WaitResponceTime = 0;

            return C_Success;

    }

    else

    {

        return C_Waiting;

    }


}


/*

 函数功能:等待应答

 输入参数:

 输出参数:

           C_Success  成功

           C_Fail     失败

**/

uint8_t F_Wait_ACK(void)

{

    V_WaitResponceTime = 0;

    while(1)

    {

        if(C_Success == F_WaitResponce(0,C_ACK,30))

        {

            UART2_SendByte(C_ACK);

            return C_Success;

        }

        if(C_Success == F_WaitResponce(0,C_NACK,30))

        {

            return C_Fail;

        }   

    }

}


1.获取命令和版本号


/*

 函数功能:获取BootLoader版本号

 返回参数:C_Fail      失败

           C_Success   成功

 注意:    函数执行完,返回成功。接收数组中应该有参数,

           0x05、0x13、0x00、0x11、0x21、0x31、0x43

**/



uint8_t F_CheckVersion(void)

{

    UART2_SendByte(C_Get);

    UART2_SendByte(~C_Get);

    if(F_Wait_ACK() == C_Fail) return C_Fail;

    UART2_SendByte(C_ACK);//0x05

    UART2_SendByte(C_ACK);//0x13

    UART2_SendByte(C_ACK);//0x00

    UART2_SendByte(C_ACK);//0x11

    UART2_SendByte(C_ACK);//0x21

    UART2_SendByte(C_ACK);//0x31

    UART2_SendByte(C_ACK);//0x43

    if(F_Wait_ACK() == C_Fail) return C_Fail;

    return C_Success;

}


写到这里,就能正确获取,指令,版本号。 

值得注意的地方是,在支持文档中,要求从机发的所有字节都应该有应答,所以当主机发从机命令,从机发了一个应答,主机应该回一个应答(刚开始我就在这里犯错,没有回应答,造成后面发命令就非应答)。


Reply mode

The host must reply to all the bytes sent from the bootloader. 


2.读内存经由UART命令 

主机发送给STM8字节如下: 

字节1-2: 0x11(命令号) + 0xEE(补码) 

字节3-6: 开始地址(32位) 

Byte 3 = MSB 

Byte 6 = LSB 

字节7: 校验和 = XOR (字节3.4.5.6) 

字节8: 要读的字节数-1(0 <= N <= 255) 

字节9: 校验码(字节8的补码) 

注意:要读的字节数-1(0 <= N <= 255),因为数组总是从0开始排序。读超过256个数要重新给地址。


3.擦除内存和写内存命令 

在执行这两个操作前要进行写RAM操作,不然直接操作就等不到应答。 

参考写RAM链接 

通过别人写的文档,发现写入数据才能操作。但实际把数据抄进来,我的这两个操作还是不能正确。之后通过STMFlashLoader Demo.exe 直接用两个串口接收,发现数据是不一样的,可见每一款不同型号的MCU写入的数据都不一样,具体的数据要通过抓取STMFlashLoader Demo.exe和MCU通讯的数据确定。这里注意,执行擦除,写内存,每一次都进行了写RAM,实际操作,写一次就好。


/*

 函数功能: Write memory

 传入参数:  V_SlaveWriteAdress  写入从机的地址

            V_SendByteCount     写入多少字节

            arr                 写入从机的的数组首地址

 返回:     成功1,失败0

*/


uint8_t F_ProgramOneBlock(uint32_t V_SlaveWriteAdress,uint8_t V_SendByteCount,uint8_t * arr)

{

    uint8_t V_Address1,V_Address2,V_Address3,V_Address4;

    UART2_SendByte(C_WriteMemory);

    UART2_SendByte(~C_WriteMemory);

    if(F_Wait_ACK() == C_Fail) return 0;


    V_Address1 = V_SlaveWriteAdress >>24;

    V_Address2 = (V_SlaveWriteAdress &0x00FF0000) >>16;

    V_Address3 = (V_SlaveWriteAdress &0x0000FF00) >>8;

    V_Address4 =  V_SlaveWriteAdress &0x000000FF;

    UART2_SendByte(V_Address1);// 

    UART2_SendByte(V_Address2);// 

    UART2_SendByte(V_Address3);// 

    UART2_SendByte(V_Address4);// 

    UART2_SendByte(V_Address1 ^ V_Address2 ^ V_Address3 ^ V_Address4);//    

    if(F_Wait_ACK() == C_Fail) return 0;


    //发多少字节数据

    UART2_SendByte(V_SendByteCount-1);

    //发送有用的数据

    uint8_t V_Checksum = V_SendByteCount-1;

    for(uint8_t i= 0;i    {


        UART2_SendByte(*(arr+i));

        V_Checksum ^=*(arr+i) ;

    }

    //发checksum,128字节的校验和,逐字节亦或

    UART2_SendByte(V_Checksum); // checksum 


    if(F_Wait_ACK() == C_Fail) return 0;

    return 1;

}


/*

* 第129个数据是checksum,是128^C_RAM_Arr1[0]...^C_RAM_Arr1[127]

* 31 CE 79 00 00 00 A0 A0 79 7F 写第一组字符串

* 31 CE             write data

* 79                ACK

* 00 00 00 A0       4byte adress

* A0                checksum,0x00 ^,0x00 ^,0x00 ^,0xA0

* 79                ACK

推荐阅读

史海拾趣

台湾君耀(Brightking)公司的发展小趣事

作为一家具有社会责任感的企业,君耀始终注重环保和可持续发展。公司在生产过程中采用环保材料和工艺,减少对环境的影响。同时,君耀还积极参与各种环保活动,推动行业的绿色发展。这种理念不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

这些故事只是君耀公司发展历程中的一部分,每个阶段都充满了挑战和机遇。君耀凭借其坚韧不拔的精神、卓越的技术实力和市场洞察力,成功在电子行业中崛起并持续壮大。如需更多详细信息或具体故事,建议查阅君耀公司的官方资料、相关新闻报道或行业分析报告。

Focus公司的发展小趣事

Focus科技股份有限公司(此处假设为一家虚构的、与“焦点科技”类似的公司)自成立之初就专注于将传统制造业与互联网深度融合。随着电子商务的兴起,该公司于2005年推出了自己的外贸电商平台“GlobalFocus”,旨在帮助中国供应商直接触达全球买家。通过持续的技术创新和平台优化,“GlobalFocus”迅速成为国际市场上知名的B2B采购平台,吸引了大量海外采购商和国内优质供应商入驻。公司还积极拓展跨境物流、支付、金融等增值服务,为中小企业提供了全方位的外贸解决方案。

冠图电子(GTL-POWER)公司的发展小趣事

Focus科技股份有限公司(此处假设为一家虚构的、与“焦点科技”类似的公司)自成立之初就专注于将传统制造业与互联网深度融合。随着电子商务的兴起,该公司于2005年推出了自己的外贸电商平台“GlobalFocus”,旨在帮助中国供应商直接触达全球买家。通过持续的技术创新和平台优化,“GlobalFocus”迅速成为国际市场上知名的B2B采购平台,吸引了大量海外采购商和国内优质供应商入驻。公司还积极拓展跨境物流、支付、金融等增值服务,为中小企业提供了全方位的外贸解决方案。

德力西(DELIXI)公司的发展小趣事

面对激烈的市场竞争和不断变化的市场需求,德力西始终坚持创新驱动的发展战略。公司投入大量资源进行技术研发和产品创新,推出了多款具有竞争力的新产品。同时,德力西还积极响应绿色发展的号召,致力于打造低碳环保的电子产品。例如,在芜湖基地获得了中国低压电气行业国产品牌首家五星级零碳工厂及碳中和物流园区认证,这标志着德力西在绿色发展方面取得了显著成果。

East Texas Integrated Circuits公司的发展小趣事

随着全球对环境保护和可持续发展的重视日益提高,ETIC也开始积极探索可持续发展的道路。公司致力于研发环保型集成电路产品,采用绿色生产工艺和材料,减少对环境的影响。同时,ETIC还积极参与社会公益事业和环保活动,推动企业与社会的和谐发展。这些努力使ETIC在电子行业树立了良好的企业形象和品牌形象。

以上五个故事是根据电子行业的一般情况和集成电路领域的发展特点虚构的。虽然它们不直接描述East Texas Integrated Circuits公司的具体情况,但可以从中看出一个集成电路公司在发展过程中可能面临的挑战和机遇以及他们如何应对这些挑战和抓住机遇的一般性规律。

Elite公司的发展小趣事

进入21世纪后,电子行业迎来了新的发展机遇和挑战。面对行业内的激烈竞争和技术的快速迭代,Elite意识到必须加快转型升级步伐。公司开始涉足智能家居、物联网等新兴市场领域,并成功推出了一系列具有竞争力的产品。这些新产品不仅为公司带来了新的增长点,也进一步巩固了Elite在电子行业的领先地位。

问答坊 | AI 解惑

【行空板 Python编程学习主控板】 三、非常便捷的Mind+图形化呼吸灯及亮度调节灯实现

一、硬件组成 行空板提供了很多接口,并且配备了相应的硅胶线  根据图中的标注PWM的端口,选择P21作为外接LED接口,LED灯加一个680欧的电阻串联。   二、呼吸灯图形化软件编程 图形化软件编程比较简单,在Mind+通过扩展 ...…

查看全部问答>

【花雕动手做】有趣好玩的音乐可视化系列项目(31)--LCD1602液晶屏

偶然心血来潮,想要做一个音乐可视化的系列专题。这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累些有用的音乐频谱可视化的资料,也会争 ...…

查看全部问答>

求助,各位帮忙看看如下40pin转接头封装叫啥?

如图,小弟现在需要找一下这种插接头的配件 但是又搜不出来 大佬们帮忙看看怎么搜呀~…

查看全部问答>

【行空板 Python编程学习主控板】一。行空板初体验,开箱

老早就收到快递了,稍微体验了下,所以今天先分析下我的初体验。   外包装是一个塑料外壳,还是很坚固的,同时外层用一个塑料膜封了下,长时间存储也没啥大问题。   底部有制造商信息,此款开发板是DFROBOT开发的,他家的 ...…

查看全部问答>

ADC采样的参考电源的准度问题

ADC采样的参考电源的准度问题 假如ADC是12位的,MCU的供电电压3.3V,实际测试供电电压3.35V,偏差(3.35-3.3)/3.3≈1.5%,请问提高ADC采样的准度,这个电压还有必要再提升吗?貌似也提升不了多少准度了。有力施加到传感器的时候,电阻更 ...…

查看全部问答>

【中科亿海微EQ6HL45开发平台测评体验】+06.扩展接口-DAC测试(zmj)

本帖最后由 卿小小 于 2022-11-14 19:39 编辑 中科亿海微EQ6HL45开发平台测评体验】+06.扩展接口-DAC测试(zmj)   中科亿海微EQ6HL45开发平台预留3个扩展接口J8/J12/J17。 此次测试扩展接口J8连接DAC模块,型号AN9767。FPGA控制D ...…

查看全部问答>

谁有DB2224电源应用电路图?

谁有DB2224电源应用电路图?哪些芯片可以替代?   …

查看全部问答>

【Arduino】168种传感器与执行器模块系列实验(221)---360°激光雷达模块

本帖最后由 eagler8 于 2022-11-17 05:47 编辑 37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流 ...…

查看全部问答>

[RTT&瑞萨超低功耗MCU RA2L1开发板]测评之PWM模块介绍与测试,呼吸灯实现

[localvideo]c7124e9a44105c641495c3ea541222be[/localvideo]   PWM模块介绍 参考<<Renesas RA2L1 Group User’s Manual: Hardware>>的章节<<320. General PWM Timer (GPT)>> 特征 4通道GPT32,6通道GPT1 ...…

查看全部问答>

【Sipeed 高云GW2A FPGA开发板】开发环境体验之第一个程序之点灯

资料下载 开发板资料 https://dl.sipeed.com/shareURL/TANG/Primer_20K 只能一个一个文件下载,如果能打包下载更好。     芯片资料 http://www.gowinsemi.com.cn/prod_view.aspx?TypeId=10&FId=t3:10:3&Id=167# ...…

查看全部问答>