查看: 5741|回复: 11

stm32f051问题求助

  [复制链接]
  • TA的每日心情
    奋斗
    2013-1-5 09:15
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2012-12-27 16:31:07 | 显示全部楼层 |阅读模式
    分享到:
            大家好,小弟刚接触开发板不久,在学习的过程中遭遇了一些问题,自己尝试着去解决可是没有成功。现在把问题发布在这里,希望各位前辈能给予指点,非常感谢。
            我做的实验是想使用stm32f0_DISCOVERY去驱动一个320*240的TFT屏(驱动芯片为ili9320)。通过参考网络上的一些程序,我完成了TFT驱动的修改并做了一个作用是在屏上输出彩带的测试函数。程序完成了,我连接上了硬件进行调试,在调试的结果可谓是“让我欢喜让我忧”。让我“欢喜”的是,某些时候,屏幕可以呈现出我预期的彩带图案,让我“忧”的是输出并不稳定,有些时候输出显示是正常的,有些时候输出显示依然是白茫茫的一片。
          对于这个问题,我的解决思路是,从对ili9320的寄存器读写开始排查。于是,我将代码进行修改,将多余的代码全部注释掉,只留下ili9320的寄存器读写函数。代码如下:
    1. /****************************************************/
    2. /* 函数功能:写命令操作对应寄存器 */
    3. /* 入口参数;CH:写命令 */
    4. /* 返回值: 无 */
    5. /* 说明: 寄存器号是16位数,8位连接方式需要写两次*/
    6. /****************************************************/
    7. void Lcd_Write_Com(unsigned int Com)
    8. {
    9. // Set_nRd //Rd=1,读失能
    10. Clr_Cs; //Cs=0,片选使能
    11. Clr_Rs; //Rs=0,命令

    12. Clr_nWr; //nWr=0,写入使能
    13. GPIOB->ODR &= 0xFF00;
    14. GPIOC->ODR &= 0xFF00;
    15. GPIOB->ODR |=((Com)&(0x00FF));
    16. GPIOC->ODR|=(Com>>8);
    17. Set_nWr; //nWr=1,写入失能
    18. //Set_Cs; //Cs=1,片选失能
    19. }

    20. /***************************************************/
    21. /* 函数功能;向选定的寄存器写数据 */
    22. /* 入口参数;DH:16位数据 */
    23. /* 返回: 无 */
    24. /* 说明: 写16位数据, */
    25. /* 使用时需要先使用Lcd_Write_Com(unsigned int CH)选择要把数据写到哪个寄存器里面。*/
    26. /***************************************************/
    27. void Lcd_Write_Data(unsigned int Data)
    28. {
    29. //Set_nRd //Rd=1,读失能
    30. Clr_Cs; //Cs=0,片选使能
    31. Set_Rs; //Rs=1,数据

    32. Clr_nWr; //nWr=0,写入使能
    33. GPIOB->ODR &= 0xFF00;
    34. GPIOC->ODR &= 0xFF00; //把PB,PC数据端口全部置低
    35. GPIOB->ODR|=((Data)&(0x00FF));//写入低8位
    36. GPIOC->ODR|=(Data>>8);//写入高八位
    37. Set_nWr; //nWr=1,写入失能

    38. Set_Cs; //Cs=1,片选失能
    39. }

    40. /******************************************************/
    41. /* 函数功能向寄存器里写数据 */
    42. /* 入口参数;com1:寄存器号 dat1:数据值 */
    43. /* 说明: 该函数是前两个函数的合成,也就是上面两个 */
    44. /* 函数一般的用法就是这样组合。 */
    45. /******************************************************/
    46. void Lcd_Write_Com_Data(unsigned int com1,unsigned int dat1)
    47. {

    48. Lcd_Write_Com(com1);
    49. Lcd_Write_Data(dat1);

    50. }

    51. /******************************************************/
    52. /* 函数功能读寄存器里的数据 */
    53. /* 入口参数;com2:寄存器号 */
    54. /******************************************************/
    55. uint16_t Lcd_Read_Com_Data(uint16_t com2)
    56. {
    57. uint16_t val1,val2,val;
    58. Lcd_Write_Com(com2);
    59. GPIOB->MODER&=0xFFFF0000; //将PB[7:0]设为 Input mode
    60. GPIOC->MODER&=0xFFFF0000; //将PC[7:0]设为 Input mode

    61. Clr_Cs; //Cs=0,片选使能
    62. Set_Rs; //Rs=1,数据
    63. Set_nWr;


    64. Clr_nRd; //nWr=0,读取使能
    65. val1 = GPIOB->IDR;
    66. val2 = GPIOC->IDR;
    67. val=((val1)&(0x00FF))+((val2<<8)&(0xFF00));
    68. Set_nRd; //nWr=0,读取失能


    69. Set_Cs;

    70. GPIOB->MODER|=0x00005555; //输入完了后从新设置为输出
    71. GPIOC->MODER|=0x00005555;

    72. return val;

    73. }
    复制代码
    然后,在main函数中去读两个寄存器的值,代码如下:
    1. int main(void)
    2. {
    3. Device_Init();
    4. Lcd_Write_Com_Data(0x0000,0x0001);
    5. delay_ms(50);
    6. id1=Lcd_Read_Com_Data(0x0000);

    7. delay_ms(50);


    8. while (1)
    9. {
    10. }


    11. }

    复制代码
    我的想法很简单,因为读寄存0x0000,理论上应该返回TFT的驱动ID:9320.       但是,测试结果依然让我失望。同样的代码,读取结果却各不相同:
    1.jpg

          我将整个工程文件打包在附件中,希望各位前辈指点。非常感谢。

    2012.12.26_stm32f0_TFT_test(1).rar

    1.34 MB, 下载次数: 32

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-1-5 09:15
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2012-12-27 16:34:05 | 显示全部楼层
    需要说明的是,在当可以正确读出ID是9320的时候,TFT输出图像程序是完全可以正常运行的,如下图:
    2.jpg
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-12-27 16:40:41 | 显示全部楼层
    littleway 发表于 2012-12-27 16:34
    需要说明的是,在当可以正确读出ID是9320的时候,TFT输出图像程序是完全可以正常运行的,如下图:  ...

    你使用的TFT驱动的IO管脚是否空接的,也就是说在板子上是否有接其它东西?明显是干扰造成的。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-1-5 09:15
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2012-12-27 16:44:27 | 显示全部楼层
    青风 发表于 2012-12-27 16:40
    你使用的TFT驱动的IO管脚是否空接的,也就是说在板子上是否有接其它东西?明显是干扰造成的。 ...

    我没明白您的意思,我把我的连接图给您看一下吧。谢谢

    TFT引脚图.jpg
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-12-27 16:46:30 | 显示全部楼层
    这几个管脚在DISCOVEY上是不是没接其它器件?空接的?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-1-5 09:15
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2012-12-27 16:49:02 | 显示全部楼层
    青风 发表于 2012-12-27 16:46
    这几个管脚在DISCOVEY上是不是没接其它器件?空接的?

    是的,DISCOVEY只连了TFT,  调试也是通过miniUSB使用板载的ST-LINK。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-12-27 16:50:20 | 显示全部楼层
    还是硬件的连接问题,代码没有问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-1-5 09:15
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2012-12-27 16:56:05 | 显示全部楼层
    青风 发表于 2012-12-27 16:50
    还是硬件的连接问题,代码没有问题

    我之前担心是使用杜邦线连接,数据传输会有影响,因此还特意用洞洞板搭了一个底座并且用万用表一个管脚一个管脚进行了检查。然后,使用底座以后,问题依旧。如果说,这种现象是硬件造成的,那估计就是TFT屏本身的问题了。实在是无奈,折腾了好几天了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-1-5 09:15
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2012-12-27 17:01:57 | 显示全部楼层
    青风 发表于 2012-12-27 16:50
    还是硬件的连接问题,代码没有问题

    还有一个没搞明白的问题想请教一下:看您的青风教程点亮LCD中,使用 PB11去映射了CM,并且将它初始化为0. 也就是说当CM=0的时候,使用的是16位数据模式,假如我将该位初始化为1,那么我就可以使用8位的数据模式咯? 假如是这样的话,是使用DB[15:8]还是DB[7:0]呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2012-12-27 17:06:57 | 显示全部楼层
    DB[7:0],好像TFT说明文档里有说明,这个是做液晶屏的人定义的
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-24 20:12 , Processed in 0.209207 second(s), 36 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.