打印
[STM32F4]

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

[复制链接]
1439|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nsdsb1991|  楼主 | 2018-10-17 15:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
cube产生的usb虚拟串口代码,烧录到f4的板子后,可以认到设备,实现数据收发。由于其他应用程序需要用到usb虚拟串口的功能,就直接加到了cube产生的usb虚拟串口的代码上,烧录到板子上,就不能认到设备了。原先产生的代码没动过。有遇到这个问题的朋友吗?
沙发
nsdsb1991|  楼主 | 2018-10-17 15:57 | 只看该作者
自己尝试了,将应用程序移到usb虚拟串口的代码后,注释掉了main函数中其他代码,只留下usb的初始化函数,这样,其实就跟cube产生的usb虚拟串口代码一样了,还是认不到设备。

使用特权

评论回复
板凳
香水城| | 2018-10-17 16:27 | 只看该作者
如果你都屏蔽掉所有其它了,你重新插拔下试试。

使用特权

评论回复
地板
nsdsb1991|  楼主 | 2018-10-17 16:27 | 只看该作者
本帖最后由 nsdsb1991 于 2018-10-17 16:35 编辑

当应用程序移到usb虚拟串口后,不注释main函数,进行调试,出现如下结果。

Inked1539764592(1)_LI.jpg (322.32 KB )

Inked1539764592(1)_LI.jpg

557045bc6f2b9a5b51.png (172.3 KB )

557045bc6f2b9a5b51.png

使用特权

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

试了啊,插拔没用。

使用特权

评论回复
6
mohanwei| | 2018-10-17 17:44 | 只看该作者
仔细深入看看代码
ST提供的例程一般只适合验证特定功能,喜欢把时钟、IO初始化、重定向等代码都放倒功能模块里,一整合往往就抓瞎了……做实际产品最好自己理顺功能,参考最开始的库函数例程,也就是时钟、IO初始化等各集中到一块,代码多注释就好了。

使用特权

评论回复
7
mohanwei| | 2018-10-17 17:51 | 只看该作者
IO初始化框架参考:

#include "includes.h"
#include "TrafficLights_GPIO_Config.h"

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

        GPIO_Init(Port, &GPIO_InitStructure);
}
//  */

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

void TrafficLights_GPIO_Configuration(void)//初始化所用到的GPIO
{
        u8 i,num=TrafficLights_GPIO_Count;
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);        //串口1:TXD
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1); //串口1:RXD
        for(i=0;i<num;i++)
        {
                if(TrafficLights_Gpio[i].no != i)//检查管脚编号是否正确
                {
                //        DebugPrint("错误的管脚编号!");
                        while(1)
                                ;
                }
                else
                {
                        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);
                }
        }
        //添加其它初始化(如重映射、拉高或拉低某些IO等等)……
}



使用特权

评论回复
8
mohanwei| | 2018-10-17 17:53 | 只看该作者
c和h都是从excel里提取IO定义,自动生成的

#ifndef __TrafficLights_GPIO_Config_h__
#define __TrafficLights_GPIO_Config_h__

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

//用点焊机控制板改红绿灯控制板。使用IO模拟SPI口
typedef enum
{
        HC595_CLK=0,        //PA0 定义为HC595_CLK
        KEY1,        //PA1 定义为KEY1
        HC595_DATA,        //PA2 定义为HC595_DATA
        HC595_DI,        //PA3 定义为HC595_DI
        HC595_SHIFT,        //PA4 定义为HC595_SHIFT
        KEY_LED3,        //PA5 定义为KEY_LED3
        KEY_LED2,        //PA6 定义为KEY_LED2
        KEY_LED1,        //PA7 定义为KEY_LED1
        RUN_LED,        //PB1 定义为RUN_LED
        TX1,        //PA9 定义为TX1
        RX1,        //PA10定义为RX1

        TrafficLights_GPIO_Count        //使用的IO总数
}TrafficLights_GPIO_Enum;

extern const GPIO_Define_Struct TrafficLights_Gpio[TrafficLights_GPIO_Count];

#define GPIO_ReadBits        GPIO_ReadInputDataBit
//PA0 定义为HC595_CLK:
#define _SetHC595_CLK          GPIO_SetBits(TrafficLights_Gpio[HC595_CLK].Port,TrafficLights_Gpio[HC595_CLK].pin)
#define _ClrHC595_CLK        GPIO_ResetBits(TrafficLights_Gpio[HC595_CLK].Port,TrafficLights_Gpio[HC595_CLK].pin)
#define _ReadHC595_CLK        GPIO_ReadBits(TrafficLights_Gpio[HC595_CLK].Port,TrafficLights_Gpio[HC595_CLK].pin)
//PA1 定义为KEY1:
#define _SetKEY1               GPIO_SetBits(TrafficLights_Gpio[KEY1].Port,TrafficLights_Gpio[KEY1].pin)
#define _ClrKEY1             GPIO_ResetBits(TrafficLights_Gpio[KEY1].Port,TrafficLights_Gpio[KEY1].pin)
#define _ReadKEY1             GPIO_ReadBits(TrafficLights_Gpio[KEY1].Port,TrafficLights_Gpio[KEY1].pin)
//PA2 定义为HC595_DATA:
#define _SetHC595_DATA         GPIO_SetBits(TrafficLights_Gpio[HC595_DATA].Port,TrafficLights_Gpio[HC595_DATA].pin)
#define _ClrHC595_DATA       GPIO_ResetBits(TrafficLights_Gpio[HC595_DATA].Port,TrafficLights_Gpio[HC595_DATA].pin)
#define _ReadHC595_DATA       GPIO_ReadBits(TrafficLights_Gpio[HC595_DATA].Port,TrafficLights_Gpio[HC595_DATA].pin)
//PA3 定义为HC595_DI:
#define _SetHC595_DI           GPIO_SetBits(TrafficLights_Gpio[HC595_DI].Port,TrafficLights_Gpio[HC595_DI].pin)
#define _ClrHC595_DI         GPIO_ResetBits(TrafficLights_Gpio[HC595_DI].Port,TrafficLights_Gpio[HC595_DI].pin)
#define _ReadHC595_DI         GPIO_ReadBits(TrafficLights_Gpio[HC595_DI].Port,TrafficLights_Gpio[HC595_DI].pin)
//PA4 定义为HC595_SHIFT:
#define _SetHC595_SHIFT        GPIO_SetBits(TrafficLights_Gpio[HC595_SHIFT].Port,TrafficLights_Gpio[HC595_SHIFT].pin)
#define _ClrHC595_SHIFT      GPIO_ResetBits(TrafficLights_Gpio[HC595_SHIFT].Port,TrafficLights_Gpio[HC595_SHIFT].pin)
#define _ReadHC595_SHIFT      GPIO_ReadBits(TrafficLights_Gpio[HC595_SHIFT].Port,TrafficLights_Gpio[HC595_SHIFT].pin)
//PA5 定义为KEY_LED3:
#define _SetKEY_LED3           GPIO_SetBits(TrafficLights_Gpio[KEY_LED3].Port,TrafficLights_Gpio[KEY_LED3].pin)
#define _ClrKEY_LED3         GPIO_ResetBits(TrafficLights_Gpio[KEY_LED3].Port,TrafficLights_Gpio[KEY_LED3].pin)
#define _ReadKEY_LED3         GPIO_ReadBits(TrafficLights_Gpio[KEY_LED3].Port,TrafficLights_Gpio[KEY_LED3].pin)
//PA6 定义为KEY_LED2:
#define _SetKEY_LED2           GPIO_SetBits(TrafficLights_Gpio[KEY_LED2].Port,TrafficLights_Gpio[KEY_LED2].pin)
#define _ClrKEY_LED2         GPIO_ResetBits(TrafficLights_Gpio[KEY_LED2].Port,TrafficLights_Gpio[KEY_LED2].pin)
#define _ReadKEY_LED2         GPIO_ReadBits(TrafficLights_Gpio[KEY_LED2].Port,TrafficLights_Gpio[KEY_LED2].pin)
//PA7 定义为KEY_LED1:
#define _SetKEY_LED1           GPIO_SetBits(TrafficLights_Gpio[KEY_LED1].Port,TrafficLights_Gpio[KEY_LED1].pin)
#define _ClrKEY_LED1         GPIO_ResetBits(TrafficLights_Gpio[KEY_LED1].Port,TrafficLights_Gpio[KEY_LED1].pin)
#define _ReadKEY_LED1         GPIO_ReadBits(TrafficLights_Gpio[KEY_LED1].Port,TrafficLights_Gpio[KEY_LED1].pin)
//PB1 定义为RUN_LED:
//#define _SetRUN_LED            GPIO_SetBits(TrafficLights_Gpio[RUN_LED].Port,TrafficLights_Gpio[RUN_LED].pin)
//#define _ClrRUN_LED          GPIO_ResetBits(TrafficLights_Gpio[RUN_LED].Port,TrafficLights_Gpio[RUN_LED].pin)
//#define _ReadRUN_LED          GPIO_ReadBits(TrafficLights_Gpio[RUN_LED].Port,TrafficLights_Gpio[RUN_LED].pin)
//PA9 定义为TX1:
#define _SetTX1                GPIO_SetBits(TrafficLights_Gpio[TX1].Port,TrafficLights_Gpio[TX1].pin)
#define _ClrTX1              GPIO_ResetBits(TrafficLights_Gpio[TX1].Port,TrafficLights_Gpio[TX1].pin)
#define _ReadTX1              GPIO_ReadBits(TrafficLights_Gpio[TX1].Port,TrafficLights_Gpio[TX1].pin)
//PA10定义为RX1:
#define _SetRX1                GPIO_SetBits(TrafficLights_Gpio[RX1].Port,TrafficLights_Gpio[RX1].pin)
#define _ClrRX1              GPIO_ResetBits(TrafficLights_Gpio[RX1].Port,TrafficLights_Gpio[RX1].pin)
#define _ReadRX1              GPIO_ReadBits(TrafficLights_Gpio[RX1].Port,TrafficLights_Gpio[RX1].pin)

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

#define _SetLED_Run                _SetKEY_LED1
#define _ClrLED_Run                _ClrKEY_LED1
#define _ReadLED_Run        _ReadKEY_LED1
#define _Read_LED_Run_Output        GPIO_ReadOutputDataBit(TrafficLights_Gpio[KEY_LED1].Port,        TrafficLights_Gpio[KEY_LED1].pin)
#define _Run_LED_ON                _ClrKEY_LED1
#define _Run_LED_OFF        _SetKEY_LED1

#define _SetLED_Step        _SetKEY_LED2
#define _ClrLED_Step        _ClrKEY_LED2
#define _ReadLED_Step        _ReadKEY_LED2
#define _Read_LED_Step_Output        GPIO_ReadOutputDataBit(TrafficLights_Gpio[KEY_LED2].Port,        TrafficLights_Gpio[KEY_LED2].pin)
#define _Step_LED_ON        _ClrKEY_LED2
#define _Step_LED_OFF        _SetKEY_LED2

#define _SetLED_Mode        _SetKEY_LED3
#define _ClrLED_Mode        _ClrKEY_LED3
#define _ReadLED_Mode        _ReadKEY_LED3
#define _Read_LED_Mode_Output        GPIO_ReadOutputDataBit(TrafficLights_Gpio[KEY_LED3].Port,        TrafficLights_Gpio[KEY_LED3].pin)
#define _Mode_LED_ON        _ClrKEY_LED3
#define _Mode_LED_OFF        _SetKEY_LED3

void SetGPIO(GPIO_TypeDef *Port,
                         u16 pin,
                         GPIOSpeed_TypeDef speed,
                         GPIOMode_TypeDef mode,
                         GPIOOType_TypeDef OType,
                         GPIOPuPd_TypeDef PuPd
                         );
void TrafficLights_GPIO_Configuration(void);//初始化所用到的GPIO

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

#endif //__TrafficLights_GPIO_Config_h__



使用特权

评论回复
9
dongliushui| | 2018-10-17 21:15 | 只看该作者
楼上大侠的见解很独特,确实这种可能。就是里面混合了其他配置。不能拿其他工程的代码套用。你最好还是在你这个工程上重新配置吧。

使用特权

评论回复
10
xiaoqi000| | 2018-10-17 21:41 | 只看该作者
我应该深入的了解一下,

使用特权

评论回复
11
xiaoqi000| | 2018-10-17 21:41 | 只看该作者
代码蛮多的

使用特权

评论回复
12
nsdsb1991|  楼主 | 2018-10-18 10:02 | 只看该作者

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


使用特权

评论回复
13
877049204| | 2018-10-19 08:53 | 只看该作者
关注,期待解决

使用特权

评论回复
14
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代码无法重定向到其他地址的问题呢?

使用特权

评论回复
15
木木guainv| | 2018-10-22 16:02 | 只看该作者
usb本来就不稳定

使用特权

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

本版积分规则

1

主题

11

帖子

1

粉丝