打印
[STM32F1]

stm32串口总是乱码,求指导!

[复制链接]
6360|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
martin0221|  楼主 | 2014-11-5 22:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下:
USART.C的

#include "stm32f10x.h"
#include "Usart.h"
#include "led.h"
#include "stdio.h"
#include "Delay.h"


//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
        return ch;
}
#endif

void USART1_Init(void)
{
/**********串口1时钟配置**********/

        USART_ClockInitTypeDef  USART_ClockInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; //串口时钟禁止
        USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; //数据低电平有效
        USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;//配置CPHA使数据在第2个边沿的时候被捕获         
        USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;// 禁用最后一位,使对应的时钟脉冲不会再输出到SCLK引脚       
        USART_ClockInit(USART1, &USART_ClockInitStructure); //配置USART与时钟相关的设置          

/**********串口1GPIO配置**********/       

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA
        |RCC_APB2Periph_AFIO, ENABLE);        //USART1串口时钟及GPIOA时钟使能
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;        //USART1_TX          PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);        //USART1_TX初始化
      
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;         //USART1_RX          PA.10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //USART1_RX初始化

/**********串口1配置**********/

        USART_InitStructure.USART_BaudRate = 9600;  //波特率9600
        USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长8位
        USART_InitStructure.USART_StopBits = USART_StopBits_1;  //1位停止字节
        USART_InitStructure.USART_Parity = USART_Parity_No;    //无奇偶校验
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无流控制       
        USART_InitStructure.USART_Mode = USART_Mode_Tx;         //TX模式使能
//        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;         //Rx模式和Tx模式使能       
        USART_Init(USART1,&USART_InitStructure);    //串口1配置初始化

/**********串口1中断配置**********/

        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1

        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//开启串口1发送中断
        USART_Cmd(USART1,ENABLE);   //启动串口1        
}


void USART1_IRQHandler()
{
        if(USART_GetITStatus(USART1,USART_IT_TXE)!=RESET)//        检测是否开启串口1 TC发送中断
        {
                LED0_ON;               
                LED1_ON;
                USART_SendData(USART1,0X02); //发送数据0X01
//                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=RESET); //等待数据发送完成               
//                USART_ClearFlag(USART1,USART_IT_TC);//        清除TC发送完成标志位
                Delay_ms(500);
                LED0_OFF;               
                LED1_OFF;
//                USART_ClearITPendingBit(USART1,USART_IT_TXE); //清除TXE中断标志位
        }

}

main.c如下
#include "stm32f10x.h"
#include "Delay.h"
#include "led.h"
#include "key.h"
#include "Usart.h"
#include "stdio.h"



int main()
{
        u8 time=0;
        SystemInit();        //系统时钟等初始化
        Key_Init();        //       
        LED_Init();//
        Delay_init(72);//
        USART1_Init();//
        while(1)
        {

                time++;
//                USART_ClearFlag(USART1,USART_IT_TC);
                printf("\n welcome to the world of STM32 \n");
                USART_SendData(USART1,0X01);
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=RESET);
                USART_ClearFlag(USART1,USART_IT_TC);
                while(time%5000==0)
                {
                        printf("\n welcome to the world of STM32 \n");
                        printf("\n the data you have sent is :\n");
                        USART_SendData(USART1,0X01);
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=RESET);
//                        USART_ClearFlag(USART1,USART_IT_TC);//        清除TC发送完成中断标志位

                }
               

        }

}
但是开启串口调试助手后,显示的始终是一个相同字符

沙发
martin0221|  楼主 | 2014-11-5 23:02 | 只看该作者
乱码全是倒L,求指导。












使用特权

评论回复
板凳
想做大牛的小马| | 2014-11-5 23:43 | 只看该作者
时钟对吗,这么一致的乱码很奇特

使用特权

评论回复
地板
mmuuss586| | 2014-11-6 08:23 | 只看该作者
看看BAUD特率是不否正确,那示波器看下;
数据你就一直发0X55,或0XAA;

使用特权

评论回复
5
SUNKE9| | 2014-11-6 08:28 | 只看该作者
串口调试助手设置不对吧,看是是使用的16进制接收吗?

使用特权

评论回复
6
huangfeng33| | 2014-11-6 10:43 | 只看该作者
正在学习串口通讯,关注中,楼主建议看看时钟配置部分。

使用特权

评论回复
7
NickelBack_87| | 2014-11-6 13:47 | 只看该作者
martin0221 发表于 2014-11-5 23:02
乱码全是倒L,求指导。

你是不是忘记选择hex显示了

使用特权

评论回复
8
zh113214| | 2014-11-7 12:35 | 只看该作者
是不是编码格式不对啊!!!

使用特权

评论回复
9
sdjkjsdh| | 2015-12-17 23:27 | 只看该作者
想做大牛的小马 发表于 2014-11-5 23:43
时钟对吗,这么一致的乱码很奇特

2楼说的时钟是指的什么?

使用特权

评论回复
10
狼牙0354| | 2015-12-18 08:39 | 只看该作者
你确定硬件电路没问题么(电平匹配232----TTL),这个保证了才能谈其他的
顺便查查波特率,这个计算错误接收到也是乱码

使用特权

评论回复
11
xzh556| | 2015-12-18 08:43 | 只看该作者
上位机配置对吗,A,B看看接反没

使用特权

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

本版积分规则

2

主题

25

帖子

1

粉丝