OpenEdv-开源电子网

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

STM 官方例程 Custom_HID 移植遇到的奇怪问题?

[复制链接]

3

主题

6

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1489
金钱
1489
注册时间
2016-9-19
在线时间
99 小时
发表于 2017-8-15 18:27:52 | 显示全部楼层 |阅读模式
3金钱
将 官方例程 Custom_HID 移植到 战舰 STM32 开发板。
对于这个例程官方提供了一个上位机软件,搭配例程,实现以下功能:
1.通过 PC 接收单片机按键
2.通过 PC 控制单片机的LED灯 亮/灭
3.通过 PC 接收单片机ADC1的读数

AA.JPG
功能2-3都实现,就是功能1失败,按键怎么按都没反映。
这个例程用到的两个按键都是配置为中断触发的。
这个中断由 Key UP 触发
[mw_shl_code=c,true]void EXTI0_IRQHandler(void)
{
  if(EXTI_GetITStatus(KEY_BUTTON_EXTI_LINE) != RESET)
  {PrevXferComplete = 1;/* Bug 待修复:此处PrevXferComplete不用赋值就应该是1 */
    if ((PrevXferComplete) && (bDeviceState == CONFIGURED))
    {
      Send_Buffer[0] = 0x05;
      if (STM_EVAL_PBGetState(Button_KEY) == Bit_RESET)   
      {
        Send_Buffer[1] = 0x01;
      }
      else
      {
        Send_Buffer[1] = 0x00;
      }  
      
      /* Write the descriptor through the endpoint */
      USB_SIL_Write(EP1_IN, (uint8_t*) Send_Buffer, 2);  
      SetEPTxValid(ENDP1);
      PrevXferComplete = 0;
    }
    /* Clear the EXTI line  pending bit */
    EXTI_ClearITPendingBit(KEY_BUTTON_EXTI_LINE);
  }
}[/mw_shl_code]

这个中断由 Key 1 触发
[mw_shl_code=c,true]void EXTI3_IRQHandler(void)
{
  if(EXTI_GetITStatus(TAMPER_BUTTON_EXTI_LINE) != RESET)
  {PrevXferComplete = 1;/* Bug 待修复:此处PrevXferComplete不用赋值就应该是1 */
    if ((PrevXferComplete) && (bDeviceState == CONFIGURED))
    {
      Send_Buffer[0] = 0x06;
      
      if (STM_EVAL_PBGetState(Button_TAMPER) == Bit_RESET)
      {
        Send_Buffer[1] = 0x01;
      }
      else
      {
        Send_Buffer[1] = 0x00;
      }
      
      /* Write the descriptor through the endpoint */   
      USB_SIL_Write(EP1_IN, (uint8_t*) Send_Buffer, 2);  
     
      SetEPTxValid(ENDP1);

      PrevXferComplete = 0;
    }
    /* Clear the EXTI line 13 pending bit */
    EXTI_ClearITPendingBit(TAMPER_BUTTON_EXTI_LINE);
  }
}[/mw_shl_code]

问题就是 PrevXferComplete 的值和预期有出入,进入中断的时候 PrevXferComplete 都为 0。
本来每次数据传输完成都应该由 EP1_IN_Callback 置 1,不知道什么原因由按键进入中断的时候,PrevXferComplete  都为 0
更奇怪的是ADC1的却不受影响,一直往PC发送数据
[mw_shl_code=c,true]void DMA1_Channel1_IRQHandler(void)
{  
  Send_Buffer[0] = 0x07;
  
  if((ADC_ConvertedValueX >>4) - (ADC_ConvertedValueX_1 >>4) > 4)
  {
    if ((PrevXferComplete) && (bDeviceState == CONFIGURED))
    {
      Send_Buffer[1] = (uint8_t)(ADC_ConvertedValueX >>4);
      
      /* Write the descriptor through the endpoint */
      USB_SIL_Write(EP1_IN, (uint8_t*) Send_Buffer, 2);  
      SetEPTxValid(ENDP1);
      ADC_ConvertedValueX_1 = ADC_ConvertedValueX;
      PrevXferComplete = 0;
    }
  }
  
  DMA_ClearFlag(DMA1_FLAG_TC1);
}[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-8-15 18:27:53 | 显示全部楼层
回复

使用道具 举报

3

主题

6

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1489
金钱
1489
注册时间
2016-9-19
在线时间
99 小时
 楼主| 发表于 2018-1-29 10:54:28 | 显示全部楼层
问题已解决,ADC导致,结帖。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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