OpenEdv-开源电子网

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

sprintf函数怪问题!!!!!!!!!!!!!!!!

[复制链接]

8

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2012-12-22
在线时间
65 小时
发表于 2019-8-7 23:13:41 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 陈孤帆 于 2019-8-7 23:27 编辑

最近发现一个问题·
首先STM32也玩了好几年了。工程编译无任何报警与错误。
eerpm使用AT24C64.
芯片是STM32F429
程序定义为如下。u8 cca[16];
u8 key_code;
sprintf((char*)cca,"KEY:%04x",key_code);

最近要检测按键值,无意中发现程序中只要加入sprintf这个语句程序的IIC就莫名其妙的·IIC写入失效,无法写入。sprintf这个语句正常。
只要注销这个sprintf语句程序就一切正常。程序中无其他sprintf语句,只有这一个。
很多方法都试了
首先u8 cca[16];这个语句定位为 char cca[16];然后长度char cca[8];都试验过了。
还有我有两个程序一个用来IAP启动函数程序(BOOT) 另一个是执行程序(IAP),底层完全一样,然后sprintf((char*)cca,"KEY:%04x",key_code);语句放到BOOT工程的 USH_User_App里的while 里面然后IIC就没事可以正常写入。另一个就没有USB,sprintf((char*)cca,"KEY:%04x",key_code);语句就放到main 的while的循环里面然后ICC就读取可以,写入无效。

然后工程中有很多其他的初始化以及程序,把IIC的初始化放到最前面,然后进行写入读取操作得到相同的结果,保留sprintf,IIC无法写入,注销就正常。程序如下:
        int main(void)
          {
             u32 free,total;
              u8 res=0;        
           //        UINT br1;
              u8 cca[16];
             u8 key_code;
             Stm32_Clock_Init(360,8,2,8);   //设置时钟,180Mhz
             delay_init(180);                //初始化延时函数     uart_init(115200);              //初始化USART               
             AT24CXX_Init();                                                        //初始化 IIC
                while(AT24CXX_Check())
                {
                        SYS_waring=SYS_EEPROM;                        //初始化 IIC
                }

               AT24CXX_WriteOneByte(0,0XCC);//各个写入地址都有试验过,不只是地址0
               res=AT24CXX_ReadOneByte(0);
             ···········其他硬件初始化以及程序。
             while
             {
               ··········其他程序
                        if(key_up)
                        {
                        sprintf((char*)cca,"KEY:%04x",key_code);//显示按键值
                        LCD_ShowString(30,250,300,32,32,cca);                        
                        FMQ=FEON;
                        }

               ··········其他程序
               }
       }
问题1:为什么我加入sprintf语句后及时把IIC放到最前面写入也不行,按照逻辑sprintf语句就算有错误也应该是程序执行过sprintf语句后才出现问题。为什么只要一加入就会出错。有哪些可能会出现这种现象。(注:在线调试的时候程序下载完成后和进入在线调试之前程序会有执行但不会执行sprintf语句)
问题2:我有两个工程。为什么sprintf语句放的位置不一样也会出现就会出现一个工程没问题一个工程有问题。
我有点怀疑是不是这个sprintf函数的问题。
希望有大神或者有相关问题经验的朋友解答。或者留下联系方式  本人QQ:416754707也可以加我。感谢!!!!!!!!!!!!!!!!!!!

最佳答案

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

问题已经解决,自己从新写了下IIC的驱动程序,问题不会出现了。应该是芯片厂家的差异,时序上面有细微的差异,我把各个地方的保持时间加长了。至于之前为什么会加入sprintf就无法写入原因不详,我估计是某个时序的时间已经到极限导致。不排除碰巧的可能。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2012-12-22
在线时间
65 小时
 楼主| 发表于 2019-8-7 23:13:42 | 显示全部楼层
问题已经解决,自己从新写了下IIC的驱动程序,问题不会出现了。应该是芯片厂家的差异,时序上面有细微的差异,我把各个地方的保持时间加长了。至于之前为什么会加入sprintf就无法写入原因不详,我估计是某个时序的时间已经到极限导致。不排除碰巧的可能。
回复

使用道具 举报

0

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
376
金钱
376
注册时间
2019-5-8
在线时间
46 小时
发表于 2019-8-8 07:59:01 | 显示全部楼层
sprintf((char*)cca,"KEY:%04x",key_code);
改为
sprintf((char*)cca,"KEY:%02x",key_code);
回复

使用道具 举报

8

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2012-4-18
在线时间
76 小时
发表于 2019-8-8 11:21:58 | 显示全部楼层
数组定义小了,会导致IIC跳不出延时函数。
回复

使用道具 举报

8

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2012-12-22
在线时间
65 小时
 楼主| 发表于 2019-8-8 11:39:32 | 显示全部楼层
o0cg 发表于 2019-8-8 07:59
sprintf((char*)cca,"KEY:%04x",key_code);
改为
sprintf((char*)cca,"KEY:%02x",key_code);

测试了··还是一样·写入无效
回复

使用道具 举报

8

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2012-12-22
在线时间
65 小时
 楼主| 发表于 2019-8-8 11:39:56 | 显示全部楼层
o0cg 发表于 2019-8-8 07:59
sprintf((char*)cca,"KEY:%04x",key_code);
改为
sprintf((char*)cca,"KEY:%02x",key_code);

测试了·无效
回复

使用道具 举报

8

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2012-12-22
在线时间
65 小时
 楼主| 发表于 2019-8-8 11:41:30 | 显示全部楼层
guer 发表于 2019-8-8 11:21
数组定义小了,会导致IIC跳不出延时函数。

ICC时序完全正常·读取数据没什么问题··写入在线仿真·寄存器内容正常,不会出现在延时里面无法跳出的情况
回复

使用道具 举报

8

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2012-12-22
在线时间
65 小时
 楼主| 发表于 2019-8-8 16:31:15 | 显示全部楼层
今天又拿示波器测试了下,把写入函数内的各个时序分为了10个部分,就是各个命令的10个子函数,然后分别用示波器来测试这10个子函数的时序,测试结果:加了sprintf与不加sprintf这两个程序中时钟线与数据线的时序完全一样,但还是加了sprintf的无法写入。不加的就能写入。跟换AT24C64芯片无效,问题没能解决。头大,不解决以后都不敢用sprintf这个函数了··好痛苦
回复

使用道具 举报

34

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
857
金钱
857
注册时间
2018-9-16
在线时间
240 小时
发表于 2019-8-9 09:09:16 | 显示全部楼层
可能没加头文件把
回复

使用道具 举报

36

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2015-11-24
在线时间
162 小时
发表于 2019-8-9 12:00:35 | 显示全部楼层
我感觉跟sprintf完全没有关系,只是恰好碰巧而已,把栈空间改大一点
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 00:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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