打印

STM32F105 串口乱码问题

[复制链接]
3311|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ffeige1984|  楼主 | 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!");
但是输出的始终是乱码,中断接收的一个单个数据后打印后又是正常的。
沙发
ffeige1984|  楼主 | 2010-10-11 12:51 | 只看该作者
模拟调试的时候,可以正常输出打印信息!!

使用特权

评论回复
板凳
john_light| | 2010-10-11 16:09 | 只看该作者
波特率有误差吗?
你所使用的是不是原生串口?

使用特权

评论回复
地板
ploto| | 2010-10-11 16:33 | 只看该作者
如果使用了外部晶振,请检查外部晶振与文件中定义的晶振频率是否一致。 如果用MDK,最简单的是在配置中设置外部晶振的值,然后在外围设备信息中查看波特率。
还有一个原因,你的总线频率分频到115200的值差比较大。
总线频率/(16x波特率) 应该是一个整数或是很接近整数。
如果总线为8M,那么 8000000/(16x115200) = 4.34  ,因此115200的波特率很难达到。误差太大,数据收到经常会出错。

使用特权

评论回复
5
ffeige1984|  楼主 | 2010-10-11 17:22 | 只看该作者
谢谢,楼上的建议 我的问题解决了

使用特权

评论回复
6
无冕之王| | 2010-10-11 18:22 | 只看该作者
楼主的问题出在哪,如何解决的,楼上的貌似只说了几种可能性

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

107

主题

134

帖子

1

粉丝