金牌会员
 
- 积分
- 1489
- 金钱
- 1489
- 注册时间
- 2016-9-19
- 在线时间
- 99 小时
|
3金钱
将 官方例程 Custom_HID 移植到 战舰 STM32 开发板。
对于这个例程官方提供了一个上位机软件,搭配例程,实现以下功能:
1.通过 PC 接收单片机按键
2.通过 PC 控制单片机的LED灯 亮/灭
3.通过 PC 接收单片机ADC1的读数
功能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]
|
|