初级会员

- 积分
- 156
- 金钱
- 156
- 注册时间
- 2012-12-22
- 在线时间
- 65 小时
|
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就无法写入原因不详,我估计是某个时序的时间已经到极限导致。不排除碰巧的可能。
|