烧录到板子上,就不能认到设备了
cube产生的usb虚拟串口代码,烧录到f4的板子后,可以认到设备,实现数据收发。由于其他应用程序需要用到usb虚拟串口的功能,就直接加到了cube产生的usb虚拟串口的代码上,烧录到板子上,就不能认到设备了原先产生的代码没动过吗?
将应用程序移到usb虚拟串口的代码后,注释掉了main函数中其他代码
只留下usb的初始化函数
其实就跟cube产生的usb虚拟串口代码一样了,还是认不到设备。
如果你都屏蔽掉所有其它了,你重新插拔下试试。
当应用程序移到usb虚拟串口后,不注释main函数,进行调试,出现如下结果。
试了啊,插拔没用。
仔细深入看看代码
ST提供的例程一般只适合验证特定功能,喜欢把时钟、IO初始化、重定向等代码都放倒功能模块里,一整合往往就抓瞎了 做实际产品最好自己理顺功能,参考最开始的库函数例程,也就是时钟、IO初始化等各集中到一块,代码多注释就好了。
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_InitTypeDefGPIO_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 = {
{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.no != i)//检查管脚编号是否正确
{
// DebugPrint("错误的管脚编号!");
while(1)
;
}
else
{
SetGPIO(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin,TrafficLights_Gpio.speed,TrafficLights_Gpio.mode,TrafficLights_Gpio.otype,TrafficLights_Gpio.pupd);
}
}
//添加其它初始化(如重映射、拉高或拉低某些IO等等)……
} 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;
#define GPIO_ReadBits GPIO_ReadInputDataBit
//PA0 定义为HC595_CLK:
#define _SetHC595_CLK GPIO_SetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ClrHC595_CLK GPIO_ResetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ReadHC595_CLK GPIO_ReadBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
//PA1 定义为KEY1:
#define _SetKEY1 GPIO_SetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ClrKEY1 GPIO_ResetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ReadKEY1 GPIO_ReadBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
//PA2 定义为HC595_DATA:
#define _SetHC595_DATA GPIO_SetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ClrHC595_DATA GPIO_ResetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ReadHC595_DATA GPIO_ReadBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
//PA3 定义为HC595_DI:
#define _SetHC595_DI GPIO_SetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ClrHC595_DI GPIO_ResetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ReadHC595_DI GPIO_ReadBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
//PA4 定义为HC595_SHIFT:
#define _SetHC595_SHIFT GPIO_SetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ClrHC595_SHIFT GPIO_ResetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ReadHC595_SHIFT GPIO_ReadBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
//PA5 定义为KEY_LED3:
#define _SetKEY_LED3 GPIO_SetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ClrKEY_LED3 GPIO_ResetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ReadKEY_LED3 GPIO_ReadBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
//PA6 定义为KEY_LED2:
#define _SetKEY_LED2 GPIO_SetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ClrKEY_LED2 GPIO_ResetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ReadKEY_LED2 GPIO_ReadBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
//PA7 定义为KEY_LED1:
#define _SetKEY_LED1 GPIO_SetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ClrKEY_LED1 GPIO_ResetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ReadKEY_LED1 GPIO_ReadBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
//PB1 定义为RUN_LED:
//#define _SetRUN_LED GPIO_SetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
//#define _ClrRUN_LED GPIO_ResetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
//#define _ReadRUN_LED GPIO_ReadBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
//PA9 定义为TX1:
#define _SetTX1 GPIO_SetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ClrTX1 GPIO_ResetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ReadTX1 GPIO_ReadBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
//PA10定义为RX1:
#define _SetRX1 GPIO_SetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ClrRX1 GPIO_ResetBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.pin)
#define _ReadRX1 GPIO_ReadBits(TrafficLights_Gpio.Port,TrafficLights_Gpio.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.Port, TrafficLights_Gpio.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.Port, TrafficLights_Gpio.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.Port, TrafficLights_Gpio.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__ 确实这种可能。就是里面混合了其他配置。不能拿其他工程的代码套用
你最好还是在你这个工程上重新配置吧。
我应该深入的了解一下,
代码蛮多的
时钟改了,usb需要48MHz的时钟。移植后的代码,目前是认不到虚拟串口。debug显示Cannot access Memory,汇编代码停在MOVS r0, r0。
页:
[1]
2