STM32F105串口乱码问题

6562748   2010-10-11 10:09 楼主
采用的是STM32F105,串口输入始终是乱码
以下是串口的配置信息
void USART1_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// USART_ClockInitTypeDef USART_ClockInitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
            RCC_APB2Periph_AFIO |
            RCC_APB2Periph_USART1 ,
            ENABLE);
    /* A9 USART1_Tx */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    /* A10 USART1_Rx  */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

//  /* Configure the NVIC Preemption Priority Bits */  
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
//   
//   /* Enable the USART1 Interrupt */
   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
    USART_Cmd(USART1, DISABLE);  
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_ClockInitStructure.USART_Clock = USART_Clock_Disable;
// USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
// USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
// USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
//
// USART_ClockInit(USART1, &USART_ClockInitStructure);

USART_Cmd(USART1, ENABLE);     
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
void USART1_IRQHandler(void)
{
u8 c;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{  
     c=USART1->DR;
  USART1_SendByte(c);      
}
  
}
void USART1_Putc(unsigned char c)
{
    USART_SendData(USART1, c);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
}
void USART1_Puts(char * str)
{
    while(*str)
    {
        USART_SendData(USART1, *str++);
        /* Loop until the end of transmission */
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    }
}

主程序如下
   USART1_Configuration();
   USART1_Puts("CAN1 CAN2 Init OK!");
但是输出的始终是乱码,中断接收的一个单个数据后打印后又是正常的。

回复评论 (6)

                                 模拟调试的时候,可以正常输出打印信息!!
点赞  2010-10-11 12:51
波特率有误差吗?
你所使用的是不是原生串口?
点赞  2010-10-11 16:09
如果使用了外部晶振,请检查外部晶振与文件中定义的晶振频率是否一致。 如果用MDK,最简单的是在配置中设置外部晶振的值,然后在外围设备信息中查看波特率。
还有一个原因,你的总线频率分频到115200的值差比较大。
总线频率/(16x波特率) 应该是一个整数或是很接近整数。
如果总线为8M,那么 8000000/(16x115200) = 4.34  ,因此115200的波特率很难达到。误差太大,数据收到经常会出错。
点赞  2010-10-11 16:33
                                 谢谢,楼上的建议 我的问题解决了
点赞  2010-10-11 17:22
                                 楼主的问题出在哪,如何解决的,楼上的貌似只说了几种可能性
点赞  2010-10-11 18:22
引用: 原帖由 solarissolaris 于 2010-10-11 17:22 发表 谢谢,楼上的建议 我的问题解决了

强烈鄙视这种垃圾,问问题时就大段代码,情况又描述不清,解决问题了又不说明白,简直就是过河拆桥。
点赞  2011-9-15 09:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复