在usb虚拟端口中的一个很令人奔溃和费解的问题

2019-10-15 03:50发布

最近在学习usb虚拟端口的过程中发现了一个问题,反复检查我的代码也没发现什么问题,但这些代码好像总是和GPIO_Init()过不去一样,先贴一个main的代码吧
[mw_shl_code=c,true]int main(void)
{
        u8 i;
        delay_init();
        LCD_Init();
        LCD_ClearScreen(BLUE);
  LCD_DrawString(10,10,16,WHITE,"This is a virual com.");               

        delay_ms(1800);
        USB_Port_Set(0);
        delay_ms(700);       
        USB_Port_Set(1);
        delay_ms(700);
        Set_System();
        Set_USBClock();
        USB_Interrupts_Config();
        USB_Init();       

        uart_init(115200);
               
        while(1)
        {
                printf("a");
                delay_ms(500);
//                        USB_Port_Set(0);

        }
}[/mw_shl_code]
好吧,下面问题来了,这段程序在运行时可以正常工作,有USART1有数据传输,USB可以被正常识别,但这段程序对顺序却有严格的要求,也不能添加微库。如果把uart_init(115200)放在LCD_Init()之前就会出现程序跑死在屏幕初始化中,如果把LCD_Init()和uart_init()放在usb_init()之后就是USB不能被识别,然后就是也跑死在屏幕初始化上了,如果使用了微库程序只能到LCD_ClearScreen(BLUE)。感觉问题应该还是在串口初始化上,这里使用的是例程中的。usb库在使用的时候,只是修改了官方例程中的和平台有关的platform_config.h,删除了和串口有关的内容,主要在usb_prop.c和hw_config.h里,目前我使用的mdk版本是5.14。
把LCD的初始化代码贴出来,使用的是HX8357D,主要是GPIOH和FSMC
[mw_shl_code=c,true]void TFT_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
| RCC_APB2Periph_GPIOG, ENABLE);

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOG, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4
| GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_8
| GPIO_Pin_9 | GPIO_Pin_10 |GPIO_Pin_11
| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14
| GPIO_Pin_15 );

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9
| GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12
| GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);

GPIO_Init(GPIOE, &GPIO_InitStructure);
}

void TFT_FSMC_Config(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTiming;

FSMC_NORSRAMTiming.FSMC_AddressSetupTime = 0x02;

FSMC_NORSRAMTiming.FSMC_AddressHoldTime = 0x00;

FSMC_NORSRAMTiming.FSMC_DataSetupTime = 0x05;

FSMC_NORSRAMTiming.FSMC_DataLatency = 0x00;

FSMC_NORSRAMTiming.FSMC_BusTurnAroundDuration = 0x00;

FSMC_NORSRAMTiming.FSMC_CLKDivision = 0x01;

FSMC_NORSRAMTiming.FSMC_AccessMode = FSMC_AccessMode_B;

FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;

FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;

FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;

FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;

FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;

FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;

FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTiming;

FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTiming;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);       
}[/mw_shl_code]

这些程序没有用到相同的管脚,在编译的过程中出现过GPIO_Init()只能有一个存在的情况,要不就是只要有添加了除官方历程中的以外的GPIO_Init的函数,usb就不能被识别,很奇怪的是,今天什么也没有改,居然就过去了!!!!而且百试不爽!!!有人有遇到过这类问题吗?是MDK的问题还是什么呢?那个微库不能使用又是怎么一回事呢?


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
正点原子
1楼-- · 2019-10-15 08:30
 精彩回答 2  元偷偷看……
zhu83453958
2楼-- · 2019-10-15 13:50
正点原子 发表于 2017-2-11 18:53
可以参考下我们的USB虚拟串口例程

原子哥,我觉得出问题的就是usart这里,单独用是没什么事,我也怕以前我写的液晶驱动可能有问题,然后也用了别的例程里的程序直接拷贝了,在例程里,对usb的修改应该只有有关平台的头文件platform.h,以及hw_config.c还有中断函数stm32_it.c(例程写在了main.c里),还有usb_prop.c里有关虚拟串口初始化的函数里去掉usart1的部分吧,没有其他很重要更改了好像吧
正点原子
3楼-- · 2019-10-15 14:43
zhu83453958 发表于 2017-2-12 00:17
原子哥,我觉得出问题的就是usart这里,单独用是没什么事,我也怕以前我写的液晶驱动可能有问题,然后也 ...

可以看看我们的教程

一周热门 更多>