OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3553|回复: 5

关于stm32f103vct6单片机IAP程序升级(数据来源串口)

[复制链接]

3

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-12-17
在线时间
14 小时
发表于 2021-1-13 17:26:25 | 显示全部楼层 |阅读模式
本帖最后由 15104684669 于 2021-1-14 08:13 编辑

if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)
{  
            iap_write_appbin(FLASH_APP1_ADDR+fwaddr,FramesDataArray,DataLength);   
            DataLength = 0;
            FramesArrayData();
}
这个是BootLoader中的一段代码,程序到了if这就进不去了,不知道是什么原因,但是程序还不死机,只是进不去if

这个数组是串口接收数组
u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)));

这个是串口接收函数,这个数据都是可以正常过来的没有问题
void UART5_IRQHandler()
{
                //RX
    if(USART_GetITStatus(UART5, USART_IT_RXNE) == SET)
                {
                                u8 Rxd;
                                Rxd = USART_ReceiveData(UART5);
                                if(USART_RX_CNT<USART_REC_LEN)
                                {
                                                USART_RX_BUF[USART_RX_CNT]=Rxd;
                                                USART_RX_CNT++;                                                                                                      
                                }
                                ComData5.ucRxBuf[ComData5.uiRxEndIndex] = USART_ReceiveData(UART5);
                                ComData5.uiRxEndIndex++;
                                if(ComData5.uiRxEndIndex >= ComRxBufferSize)
                                {
                                                ComData5.uiRxEndIndex = 0;
                                }

                                ComData5.uiRxReadyFlag = 0;
                                ComData5.uiRxTimeOut   = 0;       
                }
                //TX
                if(USART_GetITStatus(UART5, USART_IT_TC) == SET)
                {
                                USART_ClearITPendingBit(UART5, USART_IT_TC);
                                //·¢?ííê±?í£?1·¢?í
                                if(ComData5.uiTxStartIndex == ComData5.uiTxEndIndex)
                                {
                //                     USART2->CR1 &= ~USART_Mode_Tx;  
                                                ComData5.uiTxReadyFlag = 1;
                                }
                                        //·¢?íêy?Y
                                else
                                {
                                                UART5->DR = ComData5.ucTxBuf[ComData5.uiTxStartIndex];
                                                                ComData5.uiTxStartIndex++;
                                                if(ComData5.uiTxStartIndex >= ComTxBufferSize)
                                                {
                                                                ComData5.uiTxStartIndex = 0;
                                                }
                                }  
                }
        //RX over
                if (USART_GetFlagStatus(UART5, USART_FLAG_ORE) != RESET)
    {
        (void)USART_ReceiveData(UART5);
    }
}
下面是关于rom和ram的地址分配

IROM    0X80000000    0X5000    IRAM   0X20000000    0XC00

希望大神能够帮帮忙,在这里谢谢了。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-1-13 21:34:36 | 显示全部楼层
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)是判断你的BIN文件是否是有效的程序文件。你打开BIN文件看一下第2个32bit数,把这个数与0xFF000000进行位于操作,结果应该等于0x08000000。如果不是,那就是bin文件有问题;如果是,那仔细检查你的BOOTLOADER程序里设置串口接收的数据存放地址是否是0X20001000开始。
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-12-17
在线时间
14 小时
 楼主| 发表于 2021-1-14 10:27:05 | 显示全部楼层
c2007s 发表于 2021-1-13 21:34
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)是判断你的BIN文件是否是有效的程序文件。你打开BI ...

u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)));这个是串口接收数组。
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-12-17
在线时间
14 小时
 楼主| 发表于 2021-1-14 11:02:39 | 显示全部楼层
c2007s 发表于 2021-1-13 21:34
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)是判断你的BIN文件是否是有效的程序文件。你打开BI ...

刚才按照您的意思  进行了一下测试  
781f  0020  4551  0008  89c3  0008   8984  0008  我选择的是0x45510008&0xf0000000确
实是不等于0x80000000那我需要更改哪里呢  

我app的地址配置是ROM  0x80005000  0x3b000   ram  0x20000000  0xc000

问题出在哪里呢  您觉得
回复 支持 反对

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-1-14 11:08:42 | 显示全部楼层
你的bin文件是怎么生成的?
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-12-17
在线时间
14 小时
 楼主| 发表于 2021-1-15 08:09:49 | 显示全部楼层
c2007s 发表于 2021-1-14 11:08
你的bin文件是怎么生成的?

在 KEIL 点击 Options for Target?User 选项卡,在 After Build/Rebuild 栏,
勾选 Run #1   

C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe   --bin -o  .\Obj\Template.bin .\Obj\Template.axf前边是安装的地址   后边是输出bin文件的地址和文件名字   这个都是我在网上当下来的  应该没啥问题吧   

不好意思  昨天有事   没看回帖  希望大神谅解

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 21:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表