本帖最后由 xsophiax 于 2015-8-31 10:44 编辑
采用STM32F429I进行串口通信测试验证,因为初学这个,采用都是网上成熟的CODE验证,首先使用跳线把Tx/Rx短接
上,数据都正确,而后采用串口助手接收,发现不管弄,感觉串口波特率就是不对,后面使用示波器抓线上的数据,
发现是对的(后面有图),但是其波特率差异就有点大(没有修改过开发板的任何部件),现在想请教各位大侠,接下
来怎么调。
【此问题已解决,后面有就此问题的解决步骤及其途径,期望对大家有点作用,在此感谢关注此贴的人,谢谢!】。
1. 采用如下CODE,加入到官方的Demo程序里进行调试验证。
void NVIC_Config()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void USART_Gpio_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB, ENABLE);
//PB6->TX PB7->Rx
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1);
}
void USART_Config(void)
{
USART_Gpio_Config();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
}
void USART1_IRQHandler(void)
{
char c;
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
{
c = USART_ReceiveData(USART1);
USART_SendData(USART1,c);
}
}
int main(void)
{
NVIC_Config();
USART_Config();
while(1)
{
while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
USART_SendData(USART1,0x55);
while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
USART_SendData(USART1,0xAA);
Delay_us(1000);
}
}
2. 持续的发送0x55AA,采用串口助手收数据,收到的数据完全与0x55AA不搭边(0xB5 0x35)。
【分析】上图显示是波特率不对的,然后查发现HSE_VALUE 为25M晶振配置(这是网上Down的【STM32F429I-Discovery_FW_V1.0.1】,没有进行任何修改),再查是否还有其它地方也要修改的,发现PLL_M也要修改为8.
3.而采用示波器抓取的数据如下图所示:
【分析】通过上图分析得出波特率为106666bps,明显不对。大家看出来了么,这是TTL电平呀。
4.时钟&串口寄存器信息
【分析】如果采用的外部8M的晶振,CLK取值就应该和上面一样的,如果不一样的亲们,请注意了。
5.底板
【分析】这部分接线要注意了,因为板子出去的TTL电平,直接连到串口上Tx/Rx是不对的,因为串口是RS232电平。所以需要一个电平转换IC。我之前就是没有注意这块,所以搞错了,这贴出分析,希望大家不要再走弯路,费时费脑。。
|