打印
[STM32F1]

关于STM32调试问题

[复制链接]
781|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近在鼓捣一个案件数码管模块,用的TM1638的驱动芯片,按照芯片手册和例程写了个程序,显示正常,但是读不出键值,在调试时候。。。有点不懂了,请看图。
沙发
banxiafeixia|  楼主 | 2017-1-13 15:26 | 只看该作者
诸君请看,watch窗口检测的是i的值,单步运行时候i的值不变,但是GPIO_IDR,也就是PA3已经高电平了,为什么i值会不变啊

调试.png (394.62 KB )

调试.png

使用特权

评论回复
板凳
banxiafeixia|  楼主 | 2017-1-13 15:27 | 只看该作者
#include "stm32f10x.h"
#define Get(x)   GPIO_ReadInputDataBit(GPIOA,(x))==SET
#define DIO GPIO_Pin_3
void Delay(__IO u32 nCount);
void GPIO_Config_OUT(void);//ÍÆÍìÊä³ö
void GPIO_Config_IN(void);//¸¡¿ÕÊäÈë
void TM1638_Write(unsigned char DATA);
void Write_Cmd(unsigned char cmd);
void Write_Data(unsigned char add,unsigned char data);
void TM1638_Init(void);
void Write_LED(unsigned char LED_Flag);
unsigned char TM1638_Read(void);
unsigned char Read_Key(void);
unsigned char i;
const unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40};
unsigned char num[8];
int main(void)
{
  unsigned char i;   
  SystemInit();        // 72M        
  GPIO_Config_OUT();
        TM1638_Init();
        for(i=0;i<8;i++)
        Write_Data(i<<1,tab[5]);
        while(1)
        {
        GPIO_Config_IN();
        if(Get(DIO))//#define Get(x)   GPIO_ReadInputDataBit(GPIOA,(x))==SET

                i=1;
        else
                i=0;
               
  }
}
void Delay(__IO u32 nCount)
{
  for(; nCount != 0; nCount--);
}
void GPIO_Config_OUT(void)//ÅäÖÃÊä³ö
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);  
  // GPIO_SetBits(GPIOA, GPIO_Pin_1 );       
}
void GPIO_Config_IN(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë
        //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//ÏÂÀ­ÊäÈë
        //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//ÉÏÀ­ÊäÈë
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void TM1638_Write(unsigned char DATA)//д×Ö½Ú
  {
    unsigned char i;
          for(i=0;i<8;i++)
        {
    GPIO_ResetBits(GPIOA,GPIO_Pin_2);
          if(DATA&0x01)
         {
                 GPIO_SetBits(GPIOA,GPIO_Pin_3);
         
         }
         else
         {
                 GPIO_ResetBits(GPIOA,GPIO_Pin_3); //DIO
          
         }
     DATA>>=1;         
     GPIO_SetBits(GPIOA,GPIO_Pin_2);//CLK
}
}
unsigned char TM1638_Read(void)//¶Á×Ö½Ú
        {
  unsigned char i;
        unsigned char temp=0;
        GPIO_SetBits(GPIOA,GPIO_Pin_3);
        for(i=0;i<8;i++)
                {
           temp>>=1;
          GPIO_ResetBits(GPIOA,GPIO_Pin_2);
                        //GPIO_Config_IN();
          if(Get(DIO))
           temp|=0x80;
           GPIO_SetBits(GPIOA,GPIO_Pin_2);
           }
                return temp;
        }
void Write_Cmd(unsigned char cmd)
        {
            GPIO_ResetBits(GPIOA,GPIO_Pin_1);
                  TM1638_Write(cmd);
            GPIO_SetBits(GPIOA,GPIO_Pin_1);
        }
unsigned char Read_Key(void)//¶Á¼üÖµ
        {
          unsigned char c[4],i,key_value=0;
               
                //Delay(10);
                GPIO_ResetBits(GPIOA,GPIO_Pin_1);
                TM1638_Write(0x42);
                GPIO_SetBits(GPIOA,GPIO_Pin_3);
                GPIO_Config_IN();
                for(i=0;i<4;i++)
                c[i]=TM1638_Read();
                GPIO_SetBits(GPIOA,GPIO_Pin_1);
                for(i=0;i<4;i++)
                key_value|=c[i]<<i;
                for(i=0;i<8;i++)
                if((0x01<<i)==key_value)
                break;
          return i;
}
void Write_Data(unsigned char add,unsigned char data)
{
   Write_Cmd(0x44);
         GPIO_ResetBits(GPIOA,GPIO_Pin_1);
         TM1638_Write(0xc0|add);
   TM1638_Write(data);
   GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
void TM1638_Init(void)
{
unsigned char i;
  Write_Cmd(0x88);
  Write_Cmd(0x40);
        GPIO_ResetBits(GPIOA,GPIO_Pin_1);
        TM1638_Write(0xc0);
        for(i=0;i<16;i++)
        TM1638_Write(0x00);
        GPIO_SetBits(GPIOA,GPIO_Pin_1);
        }
void Write_LED(unsigned char LED_Flag)
{
  unsigned char i;
        for(i=0;i<8;i++)
        {
          if(LED_Flag&(1<<i))
                        Write_Data(2*i+1,1);
          else
                        Write_Data(2*i+1,0);
  }
}

使用特权

评论回复
地板
banxiafeixia|  楼主 | 2017-1-13 15:28 | 只看该作者
这是完整的程序,主函数里面是为了调试方便,因为读不出键值,主函数里面只写了几行关于读键值的程序。

使用特权

评论回复
5
mmuuss586| | 2017-1-13 16:43 | 只看该作者
跟踪下这句GPIO_ReadInputDataBit,跟踪到函数里面,返回的是多少

使用特权

评论回复
6
hh312| | 2017-1-13 18:40 | 只看该作者
未细看程序,根据经验,有一种可能就是开了优化。开了优化后,一些值会被优化掉,或者仿真的时候显示的值和实际值不一致。我是在eclipse环境中碰到这类问题的,不知keil是否也一样

使用特权

评论回复
7
ddllxxrr| | 2017-1-14 07:30 | 只看该作者
楼主在i=前面打个断点试试。有时断点停不了,就不显示值的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

93

帖子

2

粉丝