ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM8] 做过STM8--bootloader的进来围观指导一下~~

[复制链接]
3237|39
 楼主 | 2019-7-5 14:35 | 显示全部楼层 |阅读模式
本帖最后由 hzocce 于 2019-7-10 14:49 编辑

1.之前模仿别人的,没有成功,估计是坛里太活跃了,帖沉的太快,没有引起注意;2.现在贴上我自己调好的代码:
   现象如下:A.程序从0x8000启动之后过一定时间,跳转到另外一个分割区,main函数是运行了,while(1)也运行了,就是发现跳转后无法使用中断,是何种原因呢?
   开启了串口,串口工具接收到的数据:
   Bootloader_Boot_ADD_0x8000_to_0xA3FE
   Bootloader_APP__ADD_0xA3FF_to_0xFFFF
  也就是刚好是不同的main函数打印出来的;

  boot串口中断是接收到什么字符,原封不动得发送出来,中断法让蓝灯50ms闪烁,现象都出现;
APP程序是让绿灯渐亮渐暗,但是串口用不了,定时器也没有进入中断。
  boot main函数:
//----------------------------------------------------------------------------------------------------------------------------------------------
void main(void)
{
    unsigned char len;  
    unsigned int Count;
    unsigned int jump_APP_Flag=0;
    CLK_Config();
    Init_UART2();
    GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
    GPIO_WriteHigh(GPIOG,GPIO_PIN_0);
    TIM2_Config();


    enableInterrupts();
    printf("Bootloader_Boot_ADD_0x8000_to_0xA3FE\r\n");

    while (1)   
    {
//------接收串口---------------------------------------------------------
      if(UART_RX_NUM&0x80)
      {
        len=UART_RX_NUM&0x3f;/*得到此次接收到的数据长度*/
        UART2_SendString("You sent the messages is:",sizeof("You sent the messages is"));
        UART2_SendString(RxBuffer,len);
        printf("\r\n得到此次接收到的数据长度:%dByte\r\n",len);
        UART_RX_NUM=0;
      };

//------闪烁蓝灯泡---------------------------------------------------------   
      if(ms_Cout==0xaf)
      {  
        ms_Cout=0;

        if(Count++>=50)
        {

          Count=0;
          GPIO_WriteReverse(GPIOG , GPIO_PIN_0);
        };

//------超时跳转--------------------------------------------------------        
        if(jump_APP_Flag++>=6000)
        {
          asm("JPF $A3FF");
        };

      }


  }

}

//其中ms_Cout是在定时器2的中断中将其值改成0xaf;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~icf文件中:

define memory with size = 16M;

define region TinyData = [from 0x00 to 0xF7];//define region TinyData = [from 0x00 to 0xFF];
define region BootData = [from 0xF8 to 0xFF];

define region NearData = [from 0x0008 to 0x07FF];

define region Eeprom = [from 0x4000 to 0x43FF];

define region BootROM = [from 0x6000 to 0x67FF];

define region NearFuncCode = [from 0x8000 to 0xA3fe];

define region FarFuncCode = [from 0x8000 to 0xA3fe];

define region HugeFuncCode = [from 0x8000 to 0xA3fe];



App main函数:
//----------------------------------------------------------------------------------------------------------------------------------------------
void main(void)
{
    unsigned char len;
    unsigned int Count;
    CLK_Config();
    Init_UART2();            //初始化串口2
    GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);
    TIM2_Config();
    GPIO_WriteLow(GPIOG,GPIO_PIN_0);
    enableInterrupts();

    printf("Bootloader_APP__ADD_0xA3FF_to_0xFFFF\r\n");

  while (1)
  {
//------渐变绿灯泡---------------------------------------------------------
      Breathing_Light();

//------接收串口---------------------------------------------------------
      if(UART_RX_NUM&0x80)
      {
        len=UART_RX_NUM&0x3f;/*得到此次接收到的数据长度*/
        UART2_SendString("You sent the messages is:",sizeof("You sent the messages is"));
        UART2_SendString(RxBuffer,len);
        printf("\r\n得到此次接收到的数据长度:%dByte\r\n",len);
        UART_RX_NUM=0;
      };

//------闪烁蓝灯泡--------------------------------------------------------      
      if(ms_Cout==0xaf)
      {
        ms_Cout=0;
        if(Count++>=500)
        {
          Count=0;
          GPIO_WriteReverse(GPIOG , GPIO_PIN_0);
           printf("App_Runing\r\n");
        }
      }


  }

}

//其中ms_Cout是在定时器2的中断中将其值改成0xaf;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


define memory with size = 16M;

define region TinyData = [from 0x00 to 0xF7];//------------原来是define region TinyData = [from 0x00 to 0xFF];更改来
define region BootData = [from 0xF8 to 0xFF];//------------------增加于2019.07.10
define region NearData = [from 0x0000 to 0x07FF];

define region Eeprom = [from 0x4000 to 0x43FF];

define region BootROM = [from 0x6000 to 0x67FF];

define region NearFuncCode = [from 0xA3ff to 0xFFF7];//------------原来是define region NearFuncCode = [from 0x8000 to 0xFFFF];更改来

define region FarFuncCode = [from 0xA3ff to 0xFFF7];//------------原来是define region FarFuncCode = [from 0x8000 to 0xFFFF];更改来

define region HugeFuncCode = [from 0xA3ff to 0xFFF7];//------------原来是define region HugeFuncCode = [from 0x8000 to 0xFFFF];更改来

define region MainValidCode = [from 0xFFF8 to 0xFFFF];//-------------增加于2019.07.10



使用特权

评论回复
 楼主 | 2019-7-8 09:31 | 显示全部楼层
浮起来把~~~

使用特权

评论回复
 楼主 | 2019-7-9 13:37 | 显示全部楼层
                               ?

使用特权

评论回复
| 2019-7-9 14:44 | 显示全部楼层
感觉 STM32042 的boot 启动也会有一些问题。。。解决不了。。。

使用特权

评论回复
 楼主 | 2019-7-10 09:47 | 显示全部楼层
本帖最后由 hzocce 于 2019-7-10 14:50 编辑

跳了,可是中断不能用了!

使用特权

评论回复
 楼主 | 2019-7-10 14:50 | 显示全部楼层
求围观!

使用特权

评论回复
| 2019-7-10 15:17 | 显示全部楼层
楼主有设置APP固件的中断向量表重映射吗?

使用特权

评论回复
 楼主 | 2019-7-10 15:21 | 显示全部楼层
qiangtech 发表于 2019-7-10 15:17
楼主有设置APP固件的中断向量表重映射吗?

没有哎,有改动的,都贴出来了,
就是跳转后,没有中断了!

使用特权

评论回复
| 2019-7-10 15:35 | 显示全部楼层
你可以看下官方的AN2659文档参考一下。 01.png
里面有APP的中断向量表地址的设置。

使用特权

评论回复
 楼主 | 2019-7-10 16:16 | 显示全部楼层
如何重映射? 按照我现在改动的地址,应该如何修改?

使用特权

评论回复
 楼主 | 2019-7-10 16:38 | 显示全部楼层
qiangtech 发表于 2019-7-10 15:35
你可以看下官方的AN2659文档参考一下。
里面有APP的中断向量表地址的设置。
...

IAR如何修改呢?
原来的在哪里?
找不到

使用特权

评论回复
| 2019-7-10 17:45 | 显示全部楼层
官方文档是用STVD来DEMO的,没有实际操作过。
你这芯片是自带BOOTLOADER的吧。

使用特权

评论回复
 楼主 | 2019-7-11 08:13 | 显示全部楼层
qiangtech 发表于 2019-7-10 17:45
官方文档是用STVD来DEMO的,没有实际操作过。
你这芯片是自带BOOTLOADER的吧。 ...

我的意思,开发自己的bootloader,自己学习一下~~

使用特权

评论回复
| 2019-7-11 15:05 | 显示全部楼层
学习学习,谢谢分享

使用特权

评论回复
 楼主 | 2019-7-12 08:55 | 显示全部楼层
参考了下“small野狼”在CSDN分享的帖子"动手写一个STM8的轻量级bootloader".
原贴链接:https://blog.csdn.net/qq_29788023/article/details/73992386

APP程序中中断无法使用,
原来中断向量地址是0x8000-0x8080, 我现在是从0xa3ff开始,那按我的理解就是在main函数之外添加一下代码:

__root const long reintvec[]@".intvec"=
{
0xA3FF,0xA403,0xA407,0xA40B,
0xA40F,0xA413,0xA417,0xA41B,
0xA41F,0xA423,0xA427,0xA42B,
0xA42F,0xA433,0xA437,0xA43B,
0xA43F,0xA443,0xA447,0xA44B,
0xA44F,0xA453,0xA457,0xA45B,
0xA45F,0xA463,0xA467,0xA46B,
0xA46F,0xA473,0xA477,0xA47B,
};

同时编译后也有报错:Error[Lp004]: actual size (0x100) exceeds maximum size (0x80) for block "INTVEC"
后面也在icf文件中将原来的“define block INTVEC with size = 0x80 { ro section .intvec };”改成了“define block INTVEC with size = 0x100 { ro section .intvec };”;编译通过!
下载程序!

可是现在我本意是执行几秒钟bootloader后调转到APP中;
也就是如果执行了APP程序,在串口调试工具中可以收到:
[08:46:54.156]收←◆Bootloader_Boot_ADD_0x8000_to_0xA3FE
[08:47:01.274]收←◆Bootloader_APP__ADD_0xA3FF_to_0xFFFF

间隔时间为6秒左右;

可是我增加了以上中重映射代码后,串口一直收到:
[08:49:16.468]收←◆Bootloader_Boot_ADD_0x8000_to_0xA3FE

[08:49:23.582]收←◆Bootloader_Boot_ADD_0x8000_to_0xA3FE

[08:49:30.698]收←◆Bootloader_Boot_ADD_0x8000_to_0xA3FE

[08:49:37.814]收←◆Bootloader_Boot_ADD_0x8000_to_0xA3FE

[08:49:44.932]收←◆Bootloader_Boot_ADD_0x8000_to_0xA3FE

也就是压根调不到APP中执行了,问题似乎更糟糕了,是何解呢?

当然将上面的重映射注释掉之后,可以回到以前情况,能跳到APP,就是中断仍然无法使用,所以肯定还是中断设置的问题。

使用特权

评论回复
 楼主 | 2019-7-15 10:17 | 显示全部楼层
求关注~~

使用特权

评论回复
| 2019-7-16 12:05 | 显示全部楼层
IAR 的话要改一下.

lnkstm8s103f3.icf

使用特权

评论回复
 楼主 | 2019-7-16 13:50 | 显示全部楼层
junyee 发表于 2019-7-16 12:05
IAR 的话要改一下.

lnkstm8s103f3.icf

改完之后不能使用中断是什么原因呢?

难道只能boot使用,APP就不能使用了?

使用特权

评论回复
| 2019-7-16 15:52 | 显示全部楼层
你统一把中断向量表定义到RAM中就好了,具体怎么实现,应该有资料说明的

使用特权

评论回复
| 2019-7-16 15:52 | 显示全部楼层
你的问题在于中断向量表没有做remap所致

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表