野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18300|回复: 23

一定要帮帮我啊,我快疯了!LCD显示中文问题

[复制链接]
发表于 2014-9-20 21:11:39 | 显示全部楼层 |阅读模式
一开始自己配置工程写程序,用液晶显示中文,只出现了前两行英文显示。
代码很简单,所以怀疑是工程配置问题,重新建了一个工程,把火哥的样例程序里的文件夹全部不多不少的拷贝在相应文件夹。
结果还是只显示了前两行英文,就是
fatfs init success
insure the sdcard has insert......
后面的中文显示全部没有了。
编译0个错误0个警告,又代码完全用的火哥的,所以确定是工程配置问题了。
于是我试了各种方法,选项卡里的设置对照样例程序的设置一点点全都确认了一遍,又把SD卡重新初始化了一遍,还是不行。
前几个程序自己也跟着写过,配置工程文件自觉很熟悉了,也都没怎么出过问题,但这次调了一下午死活出不来,实在没办法了...
你们一定要救救我呀,我不想让自己的进度死在这个地方啊!
回复

使用道具 举报

 楼主| 发表于 2014-9-20 21:31:03 | 显示全部楼层
把我的工程文件发上来,给自己顶一下
捕获1.JPG
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-20 21:34:18 | 显示全部楼层
这是我Project文件夹,为了让大家更方便找出问题,为了我的工程,我可是煞费苦心啊...
Project文件夹.JPG
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-20 21:52:10 | 显示全部楼层
调试的时候,我发现我程序死在这里了...怎么个情况,有没有人给解释一下...
捕获2.JPG
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-20 22:03:06 | 显示全部楼层
哈!通过断点调试,终于找到问题所在了,是在语句    myres = f_open(&myfsrc , "0:/HZLIB.bin", FA_OPEN_EXISTING | FA_READ);   这里就进入了死循环    void HardFault_Handler(void)    这是火哥写的程序啊!我真心没改过啊!哪位大神解释下我该怎么办呢?
捕获3.JPG
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-20 22:11:25 | 显示全部楼层
我已经把问题缩小到最小范围了,到这里我是真心看不懂也不知该怎么办了,就等待大神的拯救了,如下图,这是f_open函数内部,从这里跳转函数  void HardFault_Handler(void)。一定要来救救我呀!
捕获4.JPG
回复 支持 反对

使用道具 举报

发表于 2014-9-20 22:22:30 | 显示全部楼层
你没有在SD卡里面添加中文汉子库!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-20 22:33:04 | 显示全部楼层
我比较了一下样例程序和我配置的程序,错误在于        res = chk_mounted(&path, &dj.fs, (BYTE)(mode & ~FA_READ));   这个语句没有被执行就直接跳过了,嗯,我果然文件系统没学好,现在完全不知所措了...
回复 支持 反对

使用道具 举报

发表于 2014-9-20 22:55:15 | 显示全部楼层
獨自、成雙 发表于 2014-9-20 22:33
我比较了一下样例程序和我配置的程序,错误在于        res = chk_mounted(&path, &dj.fs, (BYTE)(mode & ~FA_READ ...

现在解决了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-21 15:15:04 | 显示全部楼层
芯儿 发表于 2014-9-20 22:55
现在解决了吗?

没有啊!怎么会没添加...我烧火哥的程序汉字都出来的,就是那个HZLIB.bin文件么,直接拷贝在SD卡里。
回复 支持 反对

使用道具 举报

发表于 2014-9-21 15:16:19 | 显示全部楼层
是的,放SD卡就行了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-21 15:21:31 | 显示全部楼层
芯儿 发表于 2014-9-21 15:16
是的,放SD卡就行了。

呃,这个问题到底怎么解决么?   res = chk_mounted(&path, &dj.fs, (BYTE)(mode & ~FA_READ));   这个语句没有被执行就直接跳过了...求大神指点!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-21 15:22:45 | 显示全部楼层
芯儿 发表于 2014-9-21 15:16
是的,放SD卡就行了。

我用的程序和样例程序一模一样,只是工程自己配置的,可样例程序能跑出来这一步,我的却不行,为什么会出现这种情况?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-21 16:50:27 | 显示全部楼层
继续更新,今天继续调试,努力很了很多遍之后   [code=c]res = chk_mounted(&path, &dj.fs, (BYTE)(mode & ~FA_READ));[/code]  能够执行了,但是死在          [code=c]if (disk_read(fs->drv, fs->win, sect, 1) != RES_OK)[/code]  这句上了,原因是执行函数
[code=c]SD_Error SD_WaitReadOperation(void)
{
  SD_Error errorstatus = SD_OK;
                  //μè′ydma′«êä½áêø
  while ((SD_DMAEndOfTransferStatus() == RESET) && (TransferEnd == 0) && (TransferError == SD_OK))
  {}

  if (TransferError != SD_OK)
  {
    return(TransferError);
  }

  return(errorstatus);
}[/code]
时在 [code=c] if (TransferError != SD_OK)[/code]   处设置断点会跳到函数
[code=c]void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}[/code]
这里,而单步往下执行时可以执行到   [code=c] if (TransferError != SD_OK)[/code] 这一句。
这是什么情况...求解释...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-21 16:52:01 | 显示全部楼层
[code=c]SD_Error SD_WaitReadOperation(void)
{
  SD_Error errorstatus = SD_OK;
                  //μè′ydma′«êä½áêø
  while ((SD_DMAEndOfTransferStatus() == RESET) && (TransferEnd == 0) && (TransferError == SD_OK))
  {}

  if (TransferError != SD_OK)
  {
    return(TransferError);
  }

  return(errorstatus);
}[/code]
捕获1.JPG
捕获.JPG
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-21 17:32:24 | 显示全部楼层
有没有懂调试的?
捕获.JPG
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-21 22:36:30 | 显示全部楼层
继续更新,我铁了心要解决这个bug
这个问题我现在解决算一半了吧。

[code=c]SD_WaitReadOperation()或者SD_WaitWriteOperation()[/code]函数死循环
原因:数据传输错误导致传输中断,无法满足退出等待的判断条件。
代码分析:
[code=c]SD_Error SD_WaitReadOperation(void)
{
  SD_Error errorstatus = SD_OK;

  while ((SD_DMAEndOfTransferStatus() == RESET) && (TransferEnd == 0) && (TransferError == SD_OK))
  {}
  if (TransferError != SD_OK)
  {
    return(TransferError);
  }
  return(errorstatus);
}[/code]
代码中用了while()是导致死循环的原因。TransferEnd ,TransferError 这两个参数是在中断中修改的, SD_DMAEndOfTransferStatus() 的结束条件是DMA传输结束。
看中断例程:
[code=c]SD_Error SD_ProcessIRQSrc(void)
{
  if (StopCondition == 1)
  {
    SDIO->ARG = 0x0;
    SDIO->CMD = 0x44C;
    TransferError = CmdResp1Error(SD_CMD_STOP_TRANSMISSION);
  }
  else
  {
    TransferError = SD_OK;
  }
  SDIO_ClearITPendingBit(SDIO_IT_DATAEND);
  SDIO_ITConfig(SDIO_IT_DATAEND, DISABLE);
  TransferEnd = 1;
  return(TransferError);
}[/code]
中断配置为数据传输结束中断SDIO_ITConfig(SDIO_IT_DATAEND, ENABLE);
数据传输出错导致传输中断的情况下,SD_DMAEndOfTransferStatus的判断为false,TransferEnd 和TransferError 的状态也不会改变,导致while循环无法退出。
解决:
中断配置为SDIO_ITConfig(SDIO_IT_RXOVERR|SDIO_IT_DTIMEOUT|SDIO_IT_DCRCFAIL|SDIO_IT_DATAEND, ENABLE);
中断例程修改:
[code=c]SD_Error SD_ProcessIRQSrc(void)
{
if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
{
  SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
  TransferError = SD_DATA_TIMEOUT;
}
else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
{
  SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
  TransferError = SD_DATA_CRC_FAIL;
}
else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)
{
  SDIO_ClearFlag(SDIO_FLAG_RXOVERR);
  TransferError = SD_RX_OVERRUN;
}
else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
{
  SDIO_ClearFlag(SDIO_FLAG_STBITERR);
  TransferError = SD_START_BIT_ERR;
}
else
{
  if (StopCondition == 1)
  {
  SDIO->ARG = 0x0;
  SDIO->CMD = 0x44C;
  TransferError = CmdResp1Error(SD_CMD_STOP_TRANSMISSION);
  }
  else
  {
  TransferError = SD_OK;
  }
}
  
  SDIO_ITConfig(SDIO_IT_RXOVERR|SDIO_IT_DTIMEOUT|SDIO_IT_DCRCFAIL|SDIO_IT_DATAEND, DISABLE);
  TransferEnd = 1;
  return(TransferError);
}[/code]
这么做的作用是发生错误时也会进入中断,即使dma没有结束,也能退出while循环。

这样,循环就不会死在函数[code=c]SD_WaitReadOperation(void)[/code]中了。
继续编译,发现循环又死在了函数[code=c]SD_DMAEndOfTransferStatus(void)[/code]中,此刻我无力吐槽...
网上的资源说:
SD_DMAEndOfTransferStatus函数内没有清标志位,按照datasheet,标志位是由手动清除的。
然后问题就来了,他所说的标志位是哪个...求大神解答...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-22 00:14:15 | 显示全部楼层
火哥,你在哪...我实在实在想不通,为什么我重新配置一个工程(工程设置和例程完全一样,我一一对照了的),程序完完全全拷贝的例程。例程能够完美运行,而我配置的程序死活出不来汉字?这算哪门子事情?太神奇了吧也!我的工程文件太大上传不了,所以只能把工程里的几个文件夹打包上传了(除了Output文件夹),其实里面的c文件和例程是一样的...跪求好心人可怜拯救...

Listing.rar

13.79 KB, 下载次数: 20

Libraries.rar

254.18 KB, 下载次数: 18

User.rar

520.69 KB, 下载次数: 16

Project.rar

55.87 KB, 下载次数: 20

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-22 14:22:39 | 显示全部楼层
功夫不负有心人,我今天早上的最后一遍尝试终于成功啦!哈哈!
当我看到液晶上“我终于成功了尼玛”几个字时我都快要疯掉了...几天的痛苦经历啊...
事实证明我之前的想法是对的
[code=c]void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}[/code]
程序会死在这个函数,确实就像它的函数名一样,程序其本身或许没有问题,而是因为配置工程时导致硬件配置错误。
而一切错误的根源在于[code=c]startup_stm32f10x_hd.s[/code]这个文件的配置。
我言尽于此,更具体的看我整个帖子的分析历程就可以了。
希望能够对遇到同样问题的朋友有所帮助!
回复 支持 反对

使用道具 举报

发表于 2014-10-8 09:25:34 | 显示全部楼层
你好 可否留个联系方式  hardfault问题求助  调了七八天 快被逼疯了
回复 支持 反对

使用道具 举报

发表于 2014-10-8 09:35:10 | 显示全部楼层
qq:275652684
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-8 16:26:37 | 显示全部楼层
lichudgl 发表于 2014-10-8 09:35
qq:275652684

15008213616@163.com我邮箱~我很少上Q的~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-8 16:30:34 | 显示全部楼层
你启动文件添加的哪个?用的什么单片机?最好能把你Opion选项配置截图给我看下~
[www.chuxue123.com]捕获1.JPG
回复 支持 反对

使用道具 举报

发表于 2014-10-10 15:29:08 | 显示全部楼层
你好,邮件已发送,麻烦查收一下不吝赐教
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-12-26 11:47 , Processed in 0.039038 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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