最近在学习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的问题还是什么呢?那个微库不能使用又是怎么一回事呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
原子哥,我觉得出问题的就是usart这里,单独用是没什么事,我也怕以前我写的液晶驱动可能有问题,然后也用了别的例程里的程序直接拷贝了,在例程里,对usb的修改应该只有有关平台的头文件platform.h,以及hw_config.c还有中断函数stm32_it.c(例程写在了main.c里),还有usb_prop.c里有关虚拟串口初始化的函数里去掉usart1的部分吧,没有其他很重要更改了好像吧
可以看看我们的教程
一周热门 更多>