专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
请教:擦除了一个函数,重启就不再工作了
2020-01-01 17:41
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
9437
41
41
随便写了一个很简单的函数,将其编译在一个特定的页
1.此页只有它,无其它内容;
2.板子重启后,也不会被调用(特定条件才会被执行)
用烧写软件,将此页删除,程序立即死掉(可以理解)
断电重启,发现板子还是死掉的,这一点很难理解,大家有什么见解?谢谢
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
41条回答
落叶随风
2020-01-05 12:12
楼主,我不知道你擦除的那个程序有多复杂,我自己做了个简单的测试,擦除后重启也没问题的,不知道是不是太简单的关系。
下面是简单的测试程序
#include <stm32f10x.h>
void func_test(void) __attribute__((section("test")));
void delay(void)
{
int time = 0xfffff;
while(time-- > 0);
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOD, &GPIO_InitStructure);
while(1)
{
GPIO_SetBits(GPIOC, GPIO_Pin_12);
delay();
GPIO_ResetBits(GPIOC, GPIO_Pin_12);
delay();
if((*(uint32_t *)func_test) != 0xffffffff)
{
func_test();
RCC_HSICmd(ENABLE);
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
FLASH_ErasePage((uint32_t)func_test);
FLASH_Lock();
}
}
}
void func_test(void)
{
GPIO_SetBits(GPIOD, GPIO_Pin_2);
delay();
GPIO_ResetBits(GPIOD, GPIO_Pin_2);
delay();
}
复制代码
scatter文件
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 { ; load region size_region
ER_IROM1 AlignExpr(+0, 0x0800) { ; load address = execution address
*.o (RESET, +First)
*(InRoot$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00010000 { ; RW data
.ANY (+RW +ZI)
}
}
LR_IROM2 AlignExpr(+0, 0x0800) 0x0800
{
ER_IROM2 +0
{
*(test)
}
}
复制代码
看具体的FLASH数据
memory1_擦除后.jpg
(160.98 KB, 下载次数: 0)
下载附件
擦除后
2017-1-7 20:43 上传
加载中...
查看其它41个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
下面是简单的测试程序
- #include <stm32f10x.h>
- void func_test(void) __attribute__((section("test")));
- void delay(void)
- {
- int time = 0xfffff;
- while(time-- > 0);
- }
- int main(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
-
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- while(1)
- {
- GPIO_SetBits(GPIOC, GPIO_Pin_12);
- delay();
- GPIO_ResetBits(GPIOC, GPIO_Pin_12);
- delay();
- if((*(uint32_t *)func_test) != 0xffffffff)
- {
- func_test();
- RCC_HSICmd(ENABLE);
- FLASH_Unlock();
- FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
- FLASH_ErasePage((uint32_t)func_test);
- FLASH_Lock();
- }
- }
- }
- void func_test(void)
- {
- GPIO_SetBits(GPIOD, GPIO_Pin_2);
- delay();
- GPIO_ResetBits(GPIOD, GPIO_Pin_2);
- delay();
- }
复制代码scatter文件
- ; *************************************************************
- ; *** Scatter-Loading Description File generated by uVision ***
- ; *************************************************************
- LR_IROM1 0x08000000 { ; load region size_region
- ER_IROM1 AlignExpr(+0, 0x0800) { ; load address = execution address
- *.o (RESET, +First)
- *(InRoot$Sections)
- .ANY (+RO)
- }
- RW_IRAM1 0x20000000 0x00010000 { ; RW data
- .ANY (+RW +ZI)
- }
- }
- LR_IROM2 AlignExpr(+0, 0x0800) 0x0800
- {
- ER_IROM2 +0
- {
- *(test)
- }
- }
复制代码看具体的FLASH数据
memory1_擦除后.jpg (160.98 KB, 下载次数: 0)
下载附件
擦除后
2017-1-7 20:43 上传
一周热门 更多>