OpenEdv-开源电子网

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

STM32内部Flash读写会对延时函数delay有影响,导致delay内部循环

[复制链接]

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-1-27
在线时间
18 小时
发表于 2017-7-17 16:33:51 | 显示全部楼层 |阅读模式
8金钱
这是主程序的循环
    while(1)
        {
                delay_ms(100);  
                LED0=!LED0;//提示系统正在运行
                Config_RetrieveSettings();
                       
        }  
1、Flash能正常读写,且正确,内存位置也对
2、Config_RetrieveSettings();为Flash读写函数,无特殊操作,只是写入数据,然后在读出来,最后串口发送

问题:主循环中Config_RetrieveSettings();删除后,系统完全正常运行。
         主循环加入Config_RetrieveSettings();,删除delay_ms(100); 系统正常运行,读取,LED都正常
         以上两个同是写入,第一遍LED正常延时,点亮,Flah读写打印出数据。第二遍循环,程序异常,死循环在delay_ms(100);


图片红框内为死循环异常的地方,在执行第一遍之后,就一直停留在这里循环。         

1

1


望大神能够解答。
ALIENTEK MINISTM32 实验26 FLASH模拟EEPROM实验.zip (2.47 MB, 下载次数: 201)

最佳答案

查看完整内容[请看2#楼]

我测试的方法是在楼主的主程序后面加两个led全亮的语句: while(1) { //Config_RetrieveSettings(); delay_ms(300); LED0=!LED0;//提示系统正在运行 LED1=!LED1; Config_RetrieveSettings(); LED0=1;LED1=1; } 如果是delay ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2017-7-17 16:33:52 | 显示全部楼层
本帖最后由 ba5rw 于 2017-8-22 10:13 编辑

我测试的方法是在楼主的主程序后面加两个led全亮的语句:
        while(1)
        {
                //Config_RetrieveSettings();
                delay_ms(300);  
                LED0=!LED0;//提示系统正在运行
                LED1=!LED1;
               
                Config_RetrieveSettings();
                LED0=1;LED1=1;
                        
        }              

如果是delay里边死循环,应该就会全亮,但是实际上没有,只停留在一个LED灯上。

然后把LED0=1;LED1=1;拎到前面:
while(1)
        {
                //Config_RetrieveSettings();
                delay_ms(300);  
                LED0=!LED0;//提示系统正在运行
                LED1=!LED1;
                LED0=1;LED1=1;
                Config_RetrieveSettings();
               
                        
        }           
则两个LED全亮并保持,说明问题在 Config_RetrieveSettings();这个函数没有执行完,什么地方卡住了,或等待应答什么的……

这种测试办法和逻辑很简单吧  
然后我继续用这两个LED指令插入到 Config_RetrieveSettings();里边,发现问题在FLASH_READ_VAR(FLASH_SAVE_ADDR,stored_ver);
接着找到:
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)           
{
        u16 i;
        LED0=1;LED1=1;//标志测试
        for(i=0;i<NumToRead;i++)
        {
                pBuffer=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.
                ReadAddr+=2;//偏移2个字节.        
        }
        
}

在for之前两个灯是亮的,在for之后就不行了。
然后跟踪到
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
        
        return *(vu16*)faddr;
        
}


问题就在这个函数里了,全亮在return前是有效的,return后就不亮了,说明在这一句return *(vu16*)faddr; 卡住了!而不是读取flash影响delay函数。

回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-1-27
在线时间
18 小时
 楼主| 发表于 2017-7-17 17:23:26 | 显示全部楼层
具体问题出在哪找到了,程序现在可以正常运行,但原因不知道是什么。
如下,我在每次读写FLash后都重新初始化一次delay函数,{delay_init2()(不是delay_init()具体看下面代码)};,然后系统就正常运行了。
所以问题应该出在这里。       
    while(1)
        {
                delay_ms(100);  
                LED0=!LED0;                      //提示系统正在运行
                Config_RetrieveSettings(); //读写flash,并串口打印
                delay_init2();                      //添加的重配置函数               
        }
这是每次的初始化代码,也就是时钟选择这里。但为什么Flash读写会影响delay的时钟配置呢?
void delay_init2()         
{
        fac_us=SystemCoreClock/8000000;        //为系统时钟的1/8  
        fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数   
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-7-18 01:42:54 | 显示全部楼层
关键看你这个函数李曼的代码了。
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-1-27
在线时间
18 小时
 楼主| 发表于 2017-7-18 21:11:11 | 显示全部楼层
正点原子 发表于 2017-7-18 01:42
关键看你这个函数李曼的代码了。

这是里面存储的代码。FLASH_WRITE_VAR就是写函数
void Config_StoreSettings()
{
  char ver[4]= "000";
  char ver2[4]=FLASH_SET_EEPROM_VERSION;
       
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET,ver);// invalidate data first            //char      4个字节     版本号              
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET+4,axis_steps_per_unit);                  //float     4*4个字节   4轴电机每mm的步数     M92   
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET+20,max_feedrate);                        //float           4*4个字节   4轴最大速度           M202     
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET+36,max_acceleration_units_per_sq_second);//uni long  4*4个字节   4轴最大加速度         M201  
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET+52,acceleration);                        //float     4个字节     4轴统一默认打印加速度  M204  'S'
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET+56,retract_acceleration);                //1float    4个字节     4轴统一默认回抽加速度  M204  'T'
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET+60,minimumfeedrate);                     //float           4个字节     4轴统一最小速度        M205  'S'
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET+64,mintravelfeedrate);                   //float           4个字节     4轴统一最小行程速度    M205  'T'
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET+68,minsegmenttime);                      //uni long  4个字节     4轴统一最小时间us      M205  'B'
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET+72,max_xy_jerk);                         //float           4个字节     XY轴不需加速的速度     M205  'X'
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET+76,max_z_jerk);                          //float           4个字节     Z轴不需加速的速度      M205  'Z'
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET+80,add_homeing);                         //float           4个字节     归位偏差              M206
         
  FLASH_WRITE_VAR(FLASH_SET_STORE_OFFSET,ver2); // validate data                  //char      4个字节     新版本号      
  SERIAL_ECHO_START;
  printf("Settings Stored\r\n");
}
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-1-27
在线时间
18 小时
 楼主| 发表于 2017-7-18 21:12:08 | 显示全部楼层
15638904980 发表于 2017-7-18 21:11
这是里面存储的代码。FLASH_WRITE_VAR就是写函数
void Config_StoreSettings()
{

写函数只是重新宏定义了一下,用的还是教程里的读写函数
#define FLASH_WRITE_VAR(address,value) STMFLASH_Write(address,(u16*)&value,sizeof(value)); //写数据,16位,每个数据占4字节(32位)
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-7-19 01:18:11 | 显示全部楼层
15638904980 发表于 2017-7-18 21:12
写函数只是重新宏定义了一下,用的还是教程里的读写函数
#define FLASH_WRITE_VAR(address,value) STMFL ...

继续追踪下一级。
看看有没有和delay相关的设置
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-1-27
在线时间
18 小时
 楼主| 发表于 2017-8-26 16:12:40 | 显示全部楼层
ba5rw 发表于 2017-7-17 16:33
我测试的方法是在楼主的主程序后面加两个led全亮的语句:
        while(1)
        {

感谢回答。
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2017-8-28 09:50:49 | 显示全部楼层

u8 datatemp[SIZE];

这个数组变量移到main之外,或叫全局变量什么的,就没事了……
回复

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2021-2-22
在线时间
25 小时
发表于 2021-6-16 20:51:50 | 显示全部楼层
想问下楼主,最后是怎么解决flash影响delay函数的,还是重新配置delay时钟吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-22 22:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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