[STM32F4] 将其他应用程序移植到,cube产生的usb虚拟串口程序后,PC认不到设备了

[复制链接]
 楼主| nsdsb1991 发表于 2018-10-17 15:46 | 显示全部楼层 |阅读模式
cube产生的usb虚拟串口代码,烧录到f4的板子后,可以认到设备,实现数据收发。由于其他应用程序需要用到usb虚拟串口的功能,就直接加到了cube产生的usb虚拟串口的代码上,烧录到板子上,就不能认到设备了。原先产生的代码没动过。有遇到这个问题的朋友吗?
 楼主| nsdsb1991 发表于 2018-10-17 15:57 | 显示全部楼层
自己尝试了,将应用程序移到usb虚拟串口的代码后,注释掉了main函数中其他代码,只留下usb的初始化函数,这样,其实就跟cube产生的usb虚拟串口代码一样了,还是认不到设备。 669995bc6eb55ecc0c.png
香水城 发表于 2018-10-17 16:27 | 显示全部楼层
如果你都屏蔽掉所有其它了,你重新插拔下试试。
 楼主| nsdsb1991 发表于 2018-10-17 16:27 | 显示全部楼层
本帖最后由 nsdsb1991 于 2018-10-17 16:35 编辑

当应用程序移到usb虚拟串口后,不注释main函数,进行调试,出现如下结果。
Inked1539764592(1)_LI.jpg
557045bc6f2b9a5b51.png

评论

其实,这不是个问题。需要烧录下bootloader就解决了。bootloader里面有跳转到0x8008000地址处的代码。所以出现上面问题是因为指令读取从0x8000000开始,但是那边没有指令执行,所以出现上面问题。  发表于 2018-10-19 14:25
原来只有app,没移植usb虚拟串口代码时,app在0x8008000地址位置是可以运行的。现在移植好后的代码在0x8000000地址处可以运行,但放到0x8008000地址位置就没法运行了。地址方面的都改过了,是不是还有其他需要注意的方面???  发表于 2018-10-19 11:18
这个usb虚拟串口,加app的程序,不能识别的问题是usb初始化前,没有开它的管脚时钟,将自动生成的管脚初始化函数去掉了,可以加回去,也可以将app的管脚初始化函数放在usb初始化前面。现在问题是,这个程序有bootloader,需要将移植好的程序放到0x8008000地址的位置,地址都设置好后,程序就不能运行了???  发表于 2018-10-19 11:01
发现产生这个现象的问题了,还不知道如何解决。Cube产生的可以用的虚拟串口代码,终端像量表是重定位到0x080000000地址上。我改到0x08008000位置,就认不到设备,调试时就会出现上图现象。有哪个朋友知道什么情况的吗?  发表于 2018-10-18 11:23
 楼主| nsdsb1991 发表于 2018-10-17 16:33 | 显示全部楼层
香水城 发表于 2018-10-17 16:27
如果你都屏蔽掉所有其它了,你重新插拔下试试。

试了啊,插拔没用。
mohanwei 发表于 2018-10-17 17:44 | 显示全部楼层
仔细深入看看代码
ST提供的例程一般只适合验证特定功能,喜欢把时钟、IO初始化、重定向等代码都放倒功能模块里,一整合往往就抓瞎了……做实际产品最好自己理顺功能,参考最开始的库函数例程,也就是时钟、IO初始化等各集中到一块,代码多注释就好了。
mohanwei 发表于 2018-10-17 17:51 | 显示全部楼层
  1. IO初始化框架参考:

  2. #include "includes.h"
  3. #include "TrafficLights_GPIO_Config.h"

  4. //*  如果在其它c文件已定义,则去掉本行第一个斜杠,以屏蔽这个函数定义
  5. //STM32F0系列设置GPIO
  6. void SetGPIO(GPIO_TypeDef *Port,
  7.                          u16 pin,
  8.                          GPIOSpeed_TypeDef speed,
  9.                          GPIOMode_TypeDef mode,
  10.                          GPIOOType_TypeDef OType,
  11.                          GPIOPuPd_TypeDef PuPd)
  12. {
  13.         GPIO_InitTypeDef  GPIO_InitStructure;
  14.         GPIO_InitStructure.GPIO_Pin = pin;
  15.         GPIO_InitStructure.GPIO_Mode = mode;
  16.         GPIO_InitStructure.GPIO_OType = OType;
  17.         GPIO_InitStructure.GPIO_PuPd = PuPd;
  18.         GPIO_InitStructure.GPIO_Speed = speed;

  19.         GPIO_Init(Port, &GPIO_InitStructure);
  20. }
  21. //  */

  22. const GPIO_Define_Struct TrafficLights_Gpio[TrafficLights_GPIO_Count] = {
  23.         {GPIOA,        GPIO_Pin_0 ,GPIO_Speed_10MHz,        GPIO_Mode_OUT,        GPIO_OType_PP,        GPIO_PuPd_NOPULL,        HC595_CLK},        //PA0 定义为HC595_CLK
  24.         {GPIOA,        GPIO_Pin_1 ,GPIO_Speed_10MHz,        GPIO_Mode_IN,        GPIO_OType_OD,        GPIO_PuPd_UP,        KEY1},        //PA1 定义为KEY1
  25.         {GPIOA,        GPIO_Pin_2 ,GPIO_Speed_10MHz,        GPIO_Mode_OUT,        GPIO_OType_PP,        GPIO_PuPd_NOPULL,        HC595_DATA},        //PA2 定义为HC595_DATA
  26.         {GPIOA,        GPIO_Pin_3 ,GPIO_Speed_10MHz,        GPIO_Mode_IN,        GPIO_OType_OD,        GPIO_PuPd_UP,        HC595_DI},        //PA3 定义为HC595_DI
  27.         {GPIOA,        GPIO_Pin_4 ,GPIO_Speed_10MHz,        GPIO_Mode_OUT,        GPIO_OType_PP,        GPIO_PuPd_NOPULL,        HC595_SHIFT},        //PA4 定义为HC595_SHIFT
  28.         {GPIOA,        GPIO_Pin_5 ,GPIO_Speed_10MHz,        GPIO_Mode_OUT,        GPIO_OType_OD,        GPIO_PuPd_UP,        KEY_LED3},        //PA5 定义为KEY_LED3
  29.         {GPIOA,        GPIO_Pin_6 ,GPIO_Speed_10MHz,        GPIO_Mode_OUT,        GPIO_OType_OD,        GPIO_PuPd_UP,        KEY_LED2},        //PA6 定义为KEY_LED2
  30.         {GPIOA,        GPIO_Pin_7 ,GPIO_Speed_10MHz,        GPIO_Mode_OUT,        GPIO_OType_OD,        GPIO_PuPd_UP,        KEY_LED1},        //PA7 定义为KEY_LED1
  31.         {GPIOB,        GPIO_Pin_1 ,GPIO_Speed_10MHz,        GPIO_Mode_OUT,        GPIO_OType_PP,        GPIO_PuPd_NOPULL,        RUN_LED},        //PB1 定义为RUN_LED
  32.         {GPIOA,        GPIO_Pin_9 ,GPIO_Speed_10MHz,        GPIO_Mode_AF,        GPIO_OType_PP,        GPIO_PuPd_NOPULL,        TX1},        //PA9 定义为TX1
  33.         {GPIOA,        GPIO_Pin_10,GPIO_Speed_10MHz,        GPIO_Mode_IN,        GPIO_OType_OD,        GPIO_PuPd_UP,        RX1},        //PA10定义为RX1
  34. };

  35. void TrafficLights_GPIO_Configuration(void)//初始化所用到的GPIO
  36. {
  37.         u8 i,num=TrafficLights_GPIO_Count;
  38.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);        //串口1:TXD
  39.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1); //串口1:RXD
  40.         for(i=0;i<num;i++)
  41.         {
  42.                 if(TrafficLights_Gpio[i].no != i)//检查管脚编号是否正确
  43.                 {
  44.                 //        DebugPrint("错误的管脚编号!");
  45.                         while(1)
  46.                                 ;
  47.                 }
  48.                 else
  49.                 {
  50.                         SetGPIO(TrafficLights_Gpio[i].Port,TrafficLights_Gpio[i].pin,TrafficLights_Gpio[i].speed,TrafficLights_Gpio[i].mode,TrafficLights_Gpio[i].otype,TrafficLights_Gpio[i].pupd);
  51.                 }
  52.         }
  53.         //添加其它初始化(如重映射、拉高或拉低某些IO等等)……
  54. }



mohanwei 发表于 2018-10-17 17:53 | 显示全部楼层
  1. c和h都是从excel里提取IO定义,自动生成的

  2. #ifndef __TrafficLights_GPIO_Config_h__
  3. #define __TrafficLights_GPIO_Config_h__

  4. //*  如果在其它h文件已定义,则去掉本行第一个斜杠,以屏蔽这个结构体定义
  5. typedef struct
  6. {
  7.         GPIO_TypeDef *Port;
  8.         u16 pin;
  9.         GPIOSpeed_TypeDef speed;
  10.         GPIOMode_TypeDef mode;
  11.         GPIOOType_TypeDef otype;
  12.         GPIOPuPd_TypeDef pupd;
  13.         u8 no;//枚举号
  14. }GPIO_Define_Struct;
  15. //  */

  16. //用点焊机控制板改红绿灯控制板。使用IO模拟SPI口
  17. typedef enum
  18. {
  19.         HC595_CLK=0,        //PA0 定义为HC595_CLK
  20.         KEY1,        //PA1 定义为KEY1
  21.         HC595_DATA,        //PA2 定义为HC595_DATA
  22.         HC595_DI,        //PA3 定义为HC595_DI
  23.         HC595_SHIFT,        //PA4 定义为HC595_SHIFT
  24.         KEY_LED3,        //PA5 定义为KEY_LED3
  25.         KEY_LED2,        //PA6 定义为KEY_LED2
  26.         KEY_LED1,        //PA7 定义为KEY_LED1
  27.         RUN_LED,        //PB1 定义为RUN_LED
  28.         TX1,        //PA9 定义为TX1
  29.         RX1,        //PA10定义为RX1

  30.         TrafficLights_GPIO_Count        //使用的IO总数
  31. }TrafficLights_GPIO_Enum;

  32. extern const GPIO_Define_Struct TrafficLights_Gpio[TrafficLights_GPIO_Count];

  33. #define GPIO_ReadBits        GPIO_ReadInputDataBit
  34. //PA0 定义为HC595_CLK:
  35. #define _SetHC595_CLK          GPIO_SetBits(TrafficLights_Gpio[HC595_CLK].Port,TrafficLights_Gpio[HC595_CLK].pin)
  36. #define _ClrHC595_CLK        GPIO_ResetBits(TrafficLights_Gpio[HC595_CLK].Port,TrafficLights_Gpio[HC595_CLK].pin)
  37. #define _ReadHC595_CLK        GPIO_ReadBits(TrafficLights_Gpio[HC595_CLK].Port,TrafficLights_Gpio[HC595_CLK].pin)
  38. //PA1 定义为KEY1:
  39. #define _SetKEY1               GPIO_SetBits(TrafficLights_Gpio[KEY1].Port,TrafficLights_Gpio[KEY1].pin)
  40. #define _ClrKEY1             GPIO_ResetBits(TrafficLights_Gpio[KEY1].Port,TrafficLights_Gpio[KEY1].pin)
  41. #define _ReadKEY1             GPIO_ReadBits(TrafficLights_Gpio[KEY1].Port,TrafficLights_Gpio[KEY1].pin)
  42. //PA2 定义为HC595_DATA:
  43. #define _SetHC595_DATA         GPIO_SetBits(TrafficLights_Gpio[HC595_DATA].Port,TrafficLights_Gpio[HC595_DATA].pin)
  44. #define _ClrHC595_DATA       GPIO_ResetBits(TrafficLights_Gpio[HC595_DATA].Port,TrafficLights_Gpio[HC595_DATA].pin)
  45. #define _ReadHC595_DATA       GPIO_ReadBits(TrafficLights_Gpio[HC595_DATA].Port,TrafficLights_Gpio[HC595_DATA].pin)
  46. //PA3 定义为HC595_DI:
  47. #define _SetHC595_DI           GPIO_SetBits(TrafficLights_Gpio[HC595_DI].Port,TrafficLights_Gpio[HC595_DI].pin)
  48. #define _ClrHC595_DI         GPIO_ResetBits(TrafficLights_Gpio[HC595_DI].Port,TrafficLights_Gpio[HC595_DI].pin)
  49. #define _ReadHC595_DI         GPIO_ReadBits(TrafficLights_Gpio[HC595_DI].Port,TrafficLights_Gpio[HC595_DI].pin)
  50. //PA4 定义为HC595_SHIFT:
  51. #define _SetHC595_SHIFT        GPIO_SetBits(TrafficLights_Gpio[HC595_SHIFT].Port,TrafficLights_Gpio[HC595_SHIFT].pin)
  52. #define _ClrHC595_SHIFT      GPIO_ResetBits(TrafficLights_Gpio[HC595_SHIFT].Port,TrafficLights_Gpio[HC595_SHIFT].pin)
  53. #define _ReadHC595_SHIFT      GPIO_ReadBits(TrafficLights_Gpio[HC595_SHIFT].Port,TrafficLights_Gpio[HC595_SHIFT].pin)
  54. //PA5 定义为KEY_LED3:
  55. #define _SetKEY_LED3           GPIO_SetBits(TrafficLights_Gpio[KEY_LED3].Port,TrafficLights_Gpio[KEY_LED3].pin)
  56. #define _ClrKEY_LED3         GPIO_ResetBits(TrafficLights_Gpio[KEY_LED3].Port,TrafficLights_Gpio[KEY_LED3].pin)
  57. #define _ReadKEY_LED3         GPIO_ReadBits(TrafficLights_Gpio[KEY_LED3].Port,TrafficLights_Gpio[KEY_LED3].pin)
  58. //PA6 定义为KEY_LED2:
  59. #define _SetKEY_LED2           GPIO_SetBits(TrafficLights_Gpio[KEY_LED2].Port,TrafficLights_Gpio[KEY_LED2].pin)
  60. #define _ClrKEY_LED2         GPIO_ResetBits(TrafficLights_Gpio[KEY_LED2].Port,TrafficLights_Gpio[KEY_LED2].pin)
  61. #define _ReadKEY_LED2         GPIO_ReadBits(TrafficLights_Gpio[KEY_LED2].Port,TrafficLights_Gpio[KEY_LED2].pin)
  62. //PA7 定义为KEY_LED1:
  63. #define _SetKEY_LED1           GPIO_SetBits(TrafficLights_Gpio[KEY_LED1].Port,TrafficLights_Gpio[KEY_LED1].pin)
  64. #define _ClrKEY_LED1         GPIO_ResetBits(TrafficLights_Gpio[KEY_LED1].Port,TrafficLights_Gpio[KEY_LED1].pin)
  65. #define _ReadKEY_LED1         GPIO_ReadBits(TrafficLights_Gpio[KEY_LED1].Port,TrafficLights_Gpio[KEY_LED1].pin)
  66. //PB1 定义为RUN_LED:
  67. //#define _SetRUN_LED            GPIO_SetBits(TrafficLights_Gpio[RUN_LED].Port,TrafficLights_Gpio[RUN_LED].pin)
  68. //#define _ClrRUN_LED          GPIO_ResetBits(TrafficLights_Gpio[RUN_LED].Port,TrafficLights_Gpio[RUN_LED].pin)
  69. //#define _ReadRUN_LED          GPIO_ReadBits(TrafficLights_Gpio[RUN_LED].Port,TrafficLights_Gpio[RUN_LED].pin)
  70. //PA9 定义为TX1:
  71. #define _SetTX1                GPIO_SetBits(TrafficLights_Gpio[TX1].Port,TrafficLights_Gpio[TX1].pin)
  72. #define _ClrTX1              GPIO_ResetBits(TrafficLights_Gpio[TX1].Port,TrafficLights_Gpio[TX1].pin)
  73. #define _ReadTX1              GPIO_ReadBits(TrafficLights_Gpio[TX1].Port,TrafficLights_Gpio[TX1].pin)
  74. //PA10定义为RX1:
  75. #define _SetRX1                GPIO_SetBits(TrafficLights_Gpio[RX1].Port,TrafficLights_Gpio[RX1].pin)
  76. #define _ClrRX1              GPIO_ResetBits(TrafficLights_Gpio[RX1].Port,TrafficLights_Gpio[RX1].pin)
  77. #define _ReadRX1              GPIO_ReadBits(TrafficLights_Gpio[RX1].Port,TrafficLights_Gpio[RX1].pin)

  78. #define _ClrHC595_EN ///定义两个兼容的宏
  79. #define _SetHC595_RST

  80. #define _SetLED_Run                _SetKEY_LED1
  81. #define _ClrLED_Run                _ClrKEY_LED1
  82. #define _ReadLED_Run        _ReadKEY_LED1
  83. #define _Read_LED_Run_Output        GPIO_ReadOutputDataBit(TrafficLights_Gpio[KEY_LED1].Port,        TrafficLights_Gpio[KEY_LED1].pin)
  84. #define _Run_LED_ON                _ClrKEY_LED1
  85. #define _Run_LED_OFF        _SetKEY_LED1

  86. #define _SetLED_Step        _SetKEY_LED2
  87. #define _ClrLED_Step        _ClrKEY_LED2
  88. #define _ReadLED_Step        _ReadKEY_LED2
  89. #define _Read_LED_Step_Output        GPIO_ReadOutputDataBit(TrafficLights_Gpio[KEY_LED2].Port,        TrafficLights_Gpio[KEY_LED2].pin)
  90. #define _Step_LED_ON        _ClrKEY_LED2
  91. #define _Step_LED_OFF        _SetKEY_LED2

  92. #define _SetLED_Mode        _SetKEY_LED3
  93. #define _ClrLED_Mode        _ClrKEY_LED3
  94. #define _ReadLED_Mode        _ReadKEY_LED3
  95. #define _Read_LED_Mode_Output        GPIO_ReadOutputDataBit(TrafficLights_Gpio[KEY_LED3].Port,        TrafficLights_Gpio[KEY_LED3].pin)
  96. #define _Mode_LED_ON        _ClrKEY_LED3
  97. #define _Mode_LED_OFF        _SetKEY_LED3

  98. void SetGPIO(GPIO_TypeDef *Port,
  99.                          u16 pin,
  100.                          GPIOSpeed_TypeDef speed,
  101.                          GPIOMode_TypeDef mode,
  102.                          GPIOOType_TypeDef OType,
  103.                          GPIOPuPd_TypeDef PuPd
  104.                          );
  105. void TrafficLights_GPIO_Configuration(void);//初始化所用到的GPIO

  106. PT_THREAD(Test74HC595Thread(struct pt *pt));//74HC595测试线程

  107. #endif //__TrafficLights_GPIO_Config_h__



dongliushui 发表于 2018-10-17 21:15 | 显示全部楼层
楼上大侠的见解很独特,确实这种可能。就是里面混合了其他配置。不能拿其他工程的代码套用。你最好还是在你这个工程上重新配置吧。
xiaoqi000 发表于 2018-10-17 21:41 来自手机 | 显示全部楼层
我应该深入的了解一下,
xiaoqi000 发表于 2018-10-17 21:41 来自手机 | 显示全部楼层
代码蛮多的
 楼主| nsdsb1991 发表于 2018-10-18 10:02 | 显示全部楼层

时钟改了,usb需要48MHz的时钟。移植后的代码,目前是认不到虚拟串口。debug显示Cannot access Memory,汇编代码停在MOVS r0, r0。
876845bc7e9d394f49.png

877049204 发表于 2018-10-19 08:53 | 显示全部楼层
关注,期待解决
 楼主| nsdsb1991 发表于 2018-10-19 09:15 | 显示全部楼层
Cube生成的代码,是放在0x8000000地址的,烧录可以执行。但是放在0x8008000地址,就认不到设备了。修改了system_stm32f4xx.c中的#define VECT_TAB_OFFSET  0x8000,target选项中的on chip下的IROM1 0x8008000  72000 。编译链接成功,烧录后,认不到设备了。调试就会出现上图cannot read memory的现象。如何解决usb代码无法重定向到其他地址的问题呢?
木木guainv 发表于 2018-10-22 16:02 | 显示全部楼层
usb本来就不稳定
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

11

帖子

1

粉丝

1

主题

11

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部