打印
[STM32F4]

烧录到板子上,就不能认到设备了

[复制链接]
488|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houcs|  楼主 | 2020-7-24 20:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
cube产生的usb虚拟串口代码,烧录到f4的板子后,可以认到设备,实现数据收发。由于其他应用程序需要用到usb虚拟串口的功能,就直接加到了cube产生的usb虚拟串口的代码上,烧录到板子上,就不能认到设备了

使用特权

评论回复
沙发
ousj| | 2020-7-24 20:30 | 只看该作者
原先产生的代码没动过吗?

使用特权

评论回复
板凳
kangzj| | 2020-7-24 20:34 | 只看该作者
将应用程序移到usb虚拟串口的代码后,注释掉了main函数中其他代码

使用特权

评论回复
地板
llia| | 2020-7-24 20:39 | 只看该作者
只留下usb的初始化函数

使用特权

评论回复
5
houcs|  楼主 | 2020-7-24 20:42 | 只看该作者
其实就跟cube产生的usb虚拟串口代码一样了,还是认不到设备。

使用特权

评论回复
6
houcs|  楼主 | 2020-7-24 20:46 | 只看该作者

使用特权

评论回复
7
chuxh| | 2020-7-24 20:56 | 只看该作者
如果你都屏蔽掉所有其它了,你重新插拔下试试。

使用特权

评论回复
8
houcs|  楼主 | 2020-7-24 20:59 | 只看该作者
当应用程序移到usb虚拟串口后,不注释main函数,进行调试,出现如下结果。

使用特权

评论回复
9
houcs|  楼主 | 2020-7-24 21:01 | 只看该作者

使用特权

评论回复
10
houcs|  楼主 | 2020-7-24 21:05 | 只看该作者

使用特权

评论回复
11
houcs|  楼主 | 2020-7-24 21:11 | 只看该作者
试了啊,插拔没用。

使用特权

评论回复
12
hanwe| | 2020-7-24 21:16 | 只看该作者
仔细深入看看代码
ST提供的例程一般只适合验证特定功能,喜欢把时钟、IO初始化、重定向等代码都放倒功能模块里,一整合往往就抓瞎了

使用特权

评论回复
13
wangzsa| | 2020-7-24 21:19 | 只看该作者
做实际产品最好自己理顺功能,参考最开始的库函数例程,也就是时钟、IO初始化等各集中到一块,代码多注释就好了。

使用特权

评论回复
14
happy_10| | 2020-7-24 21:22 | 只看该作者
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等等)……
}

使用特权

评论回复
15
happy_10| | 2020-7-24 21:26 | 只看该作者
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__

使用特权

评论回复
16
songqian17| | 2020-7-24 21:31 | 只看该作者
确实这种可能。就是里面混合了其他配置。不能拿其他工程的代码套用

使用特权

评论回复
17
stly| | 2020-7-24 21:34 | 只看该作者
你最好还是在你这个工程上重新配置吧。

使用特权

评论回复
18
dingy| | 2020-7-24 21:37 | 只看该作者
我应该深入的了解一下,

使用特权

评论回复
19
houcs|  楼主 | 2020-7-24 21:40 | 只看该作者

代码蛮多的

使用特权

评论回复
20
houcs|  楼主 | 2020-7-24 21:43 | 只看该作者
时钟改了,usb需要48MHz的时钟。移植后的代码,目前是认不到虚拟串口。debug显示Cannot access Memory,汇编代码停在MOVS r0, r0。

使用特权

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

本版积分规则

743

主题

8382

帖子

5

粉丝