USB HID的程序,加了个Boot后,跳到APP后HID不能识别(解决,答案37楼

2019-12-10 18:14发布

本帖最后由 SkyGz 于 2016-8-9 15:56 编辑

一个原基于USB HID的通讯程序, 平时是插电脑上用的
所以就加了个Bootloader, 可以方便通过USB更新程序

能正常启动到Bootloader下,  也能更新程序,  通过JLINK 读整芯片数据回来 一一对比检查, 也没有错
可是 设为APP启动,  就无法识别 USB HID了,      问这是什么问题呢
HID程序 改了起始地址 就不能运行了??????????????

首先我这这USB HID是 NRF24L01的接收器, 上面有一个LED, 有通讯 就快闪, 没通讯就慢闪
经过测试,   能与另一块板子NRF24L01通信,  LED能快闪,  说明已跳到APP程序中运行,  程序也没有卡死现像

已设置向量表偏移了(见图2代码中首行),,,就是唯独USB HID无法识别了.......




如果 丢个 点亮LED的测试程序 是没有问题的

Bootloader 跳到用户APP区的代码
#define         IN_FLASH_STAR                      0x08006000
33.JPG (15.7 KB, 下载次数: 0) 下载附件 2016-8-8 19:53 上传


上2个程序的代码,  各位大大有时间 帮我看看咋回事
zzzzzz.rar (965.85 KB, 下载次数: 83) 2016-8-9 09:39 上传 点击文件名下载附件

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
58条回答
SkyGz
1楼-- · 2019-12-14 14:43
yanghuanchun 发表于 2016-8-9 13:39
boot跳到APP之前要关闭所有中断,楼主关了吗,除了HID无法识别之外APP中其他的功能正常吗 ...

是用 __asm("CPSID   I");不...
对,  除了HID无法识别, 其它都正常


        __asm("CPSID   I");
        GPIO_DeInit(GPIOA);
        GPIO_DeInit(GPIOB);
        GPIO_DeInit(GPIOC);
        GPIO_DeInit(GPIOD);
        GPIO_DeInit(GPIOE);

        if (((*(vu32 *)IN_FLASH_STAR) & 0x2FFE0000 ) == 0x20000000)
        {

            JumpAddress = *(vu32 *) (IN_FLASH_STAR + 4);
            Jump_To_Application = (USER_APP) JumpAddress;
                                          //NVIC_SystemReset();

            __set_MSP(*(vu32 *) IN_FLASH_STAR );
            Jump_To_Application();
        }
        *((u32 *)0xE000ED0C) = 0x05fa0004;
    }
    while(1);
duxingkei
2楼-- · 2019-12-14 16:19
Leave_LowPowerMode
函数里面会更改系统配置,我之前移植使用内部时钟时,就被坑过,还好仿真时跳到这里面死等外部晶振起振
bad_fpga
3楼-- · 2019-12-14 20:15
SkyGz 发表于 2016-8-9 14:05
是用 __asm("CPSID   I");不...
对,  除了HID无法识别, 其它都正常

我在楼主位下载的工程修改几个部分,测试通过

USB6.jpg (134.9 KB, 下载次数: 0)

下载附件

2016-8-9 15:30 上传



/*******************************************************************************
* Function Name  : Leave_LowPowerMode.
* Description    : Restores system clocks and power while exiting suspend mode.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Leave_LowPowerMode(void)
{
  DEVICE_INFO *pInfo = &Device_Info;
  
  /* Set the device state to the correct state */
  if (pInfo->Current_Configuration != 0)
  {
    /* Device configured */
    bDeviceState = CONFIGURED;
  }
  else
  {
    bDeviceState = ATTACHED;
  }
  
  /*Enable SystemCoreClock*/
  SystemInit(); //之前这里我建议屏蔽,但屏蔽了不行,不知什么原因,我之前的一个产品也是由于这里导致一些问题,我的屏蔽就没问题,你可以研究一下
}
bad_fpga
4楼-- · 2019-12-15 01:59
duxingkei 发表于 2016-8-9 14:22
Leave_LowPowerMode
函数里面会更改系统配置,我之前移植使用内部时钟时,就被坑过,还好仿真时跳到这里面 ...

在这里我也被坑了好久。。。
SkyGz
5楼-- · 2019-12-15 04:46
 精彩回答 2  元偷偷看……
SkyGz
6楼-- · 2019-12-15 06:07
本帖最后由 SkyGz 于 2016-8-9 16:12 编辑
bad_fpga 发表于 2016-8-9 15:33
我在楼主位下载的工程修改几个部分,测试通过


可以了.............再次感谢...   还有 感谢 以上所有 解答的坛友...


总结

BOOT我没有动, 还是原来的...

原因如下
1. 没有开中断 __enable_irq(),   之前一直在想着是否漏了哪里 还没有关掉 导致的...  却忽略了中断是否打开.
2. 向量表  在system_stm32f10x.c里改 #define VECT_TAB_OFFSET  0x7000. 才成功.

    在程序开始处使用NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x7000);  以及 Leave_LowPowerMode注释SystemInit 都无效.....

3. D+上位电阻可直接3.3V, 无需IO控制.

一周热门 更多>