使用STM8S自带BootLoader_2

本文档详细介绍了如何使用STM8S的内置BootLoader进行串口通信和内存操作。遵循ST官方文档UM0560,重点在于串口中断接收、定时器设置、命令响应以及读写内存的字节格式。在读取和写入内存过程中,需要注意地址计算、校验和以及特定型号MCU的数据差异。通过添加适当的写RAM操作,可以成功执行擦除和写入命令。
摘要由CSDN通过智能技术生成

仔细读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]='\0';   //这个是保护,超过限定值就结束
        }   
    }
}

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 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值