YinFu 发表于 2024-2-28 11:43:32

IAP跳转到APP ,串口打印首字母乱码问题

boot loader跳转到APP程序,首先打印检测到EEPROM,但是打印第一个汉字乱码,我改成字母也是乱码,前面加一个空格也是乱码


上位机显示:
开始更新固件...
固件更新完成!
开始执行FLASH用户代码!!
?--已经检测到串行EEPROM-- :


只有第一个是乱码,尝试了网上不少方法,
第一种方法:
波特率现在是115200,改成9600,只是传输慢了,依然乱码。
第二种方法

        USART_SendData(USART1, (uint8_t) ch);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
        {}

这两句调换位置也没效果
第三种方法:
初始化顺序问题,我看硬汉哥这个顺序也没错
第四种方法:

    __disable_irq();
    __set_PRIMASK(1);        /* 禁止全局中断 */      
    SCB->VTOR = FLASH_BASE | 0x2800; /* Vector Table Relocation in Internal FLASH. */
    __enable_irq();//打开总中断   
    __set_PRIMASK(0);        /* 使能全局中断 */         
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级       
   delay_init();                                          //延时函数初始化       
   LED_Init();                                                            //初始化LED指示灯
   bsp_InitUart();                           //初始化串口
   bsp_InitI2C();                /* 配置I2C总线 */
// bsp_InitKey();                /* 初始化按键 */       
// bsp_InitTimer();        /* 初始化系统滴答定时器 (此函数会开中断) */
    TIM_PWM_Init(255,9);       //不分频。PWM频率=72000000/(256*10)=28.125Khz
    memset(buf, 0, 32);
    memset(buf2, 0, 32);



这个顺序不知道是不是有问题,还有其他原因导致第一个字乱码吗,APP跳转到IAP打印是没问题的,就是IAP跳APP有这个问题,附上APP跳到IAP用的软复位
void SoftReset(void)    //软复位

{
    __set_FAULTMASK(1); // 关闭所有中断
//    TIM_DeInit(TIM2);
//    TIM_DeInit(TIM3);
//    TIM_DeInit(TIM4);
    NVIC_SystemReset();// 复位

}

skyshine 发表于 2024-2-28 13:33:06

bootloader也用到打印了吗,boot和app通信配置是否完全一致,比如停止位和奇偶校验位,bootloader打印完等一会再跳转,跳转之前清掉各种中断配置。
参考硬汉哥教程 实战技能分享,一劳永逸的解决BOOT跳转APP失败问题,含MDK AC5,AC6和IAR,同时制作了一个视频操作说明

YinFu 发表于 2024-2-28 15:13:19

skyshine 发表于 2024-2-28 13:33
bootloader也用到打印了吗,boot和app通信配置是否完全一致,比如停止位和奇偶校验位,bootloader打印完等 ...

boot loader用到了打印,前面几句都是在boot loader打印的,两边通信配置一致,乱码的地方在APP的第一句打印的第一个字,bootloader里面的打印都没有问题没乱码,IAP到APP的跳转也没问题,跳转之前关闭了总中断,关闭了串口中断,在APP重新打开的,跳转那块我没用硬汉哥的例程,串口用的硬汉哥的

skyshine 发表于 2024-2-28 15:58:27

看描述可能就是跳转这部分没搞好,没完全初始化,可以在app程序初始化打个断点看下跳转到app初始化的时候串口外设寄存器配置是不是默认值

snakeemail 发表于 2024-2-28 21:11:13

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)

like your code that check USART_FLAG_TC, there are another flag, you should try to check it too.
Good luck

YinFu 发表于 2024-3-1 10:32:59

skyshine 发表于 2024-2-28 15:58
看描述可能就是跳转这部分没搞好,没完全初始化,可以在app程序初始化打个断点看下跳转到app初始化的时候串 ...

找到问题了,是打印跟不上速度,加个一毫秒延时就好了,跳转之前如果有打印得加点延时再跳

YinFu 发表于 2024-3-1 10:34:58

snakeemail 发表于 2024-2-28 21:11
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)

like your code that check USART_FLAG_ ...

这段代码没问题,是printf比程序运行慢,加个1MS延时就好了

benny 发表于 2024-3-1 16:34:33

YinFu 发表于 2024-3-1 10:34
这段代码没问题,是printf比程序运行慢,加个1MS延时就好了

我总觉得是你跳转后主频还没有稳定造成的UART波特率偏差才打印出错。
页: [1]
查看完整版本: IAP跳转到APP ,串口打印首字母乱码问题