串口实验是很重要的,如果你从事嵌入式开发、下位机等都很需要掌握的技能,这是一个前辈和我说的。
之前遇到一个有意思的帖子,询问串口无法通信,运行了代码的确不能通讯。
【解决方法】
添加一句GPIO结构体的速度初始化
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
【测试过程】
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
USART1_Init();
while(1)
{
}
}
将所有的代码都复制了,运行后无法实现

我百思不得其解,然后我准备先点个led灯观察程序在运行吗,毕竟新手我也不会调试。
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
USART1_Init();
while(1)
{
// LED0=!LED0;
}
}
接下来神奇的一幕出现了,我以为是不是之前造成的影响特点测了好几次都是这样,而且我注释掉只剩下LED_Init()也是可以通信!我不知道问题出现在哪里。。

然后我观察了一下led和usart的区别后我发现,原来是没有定义GPIO速度,然后我加上这句话后就成功了!
void USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_Init(GPIOA,&GPIO_InitStruct);
USART_InitStruct.USART_BaudRate=115200;
USART_InitStruct.USART_HardwareFlowControl=
USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE); //开启中断 //使能串口1
}
【教训总结】