打印
[STM8]

UART串口通过串口助手在PC端打印字符

[复制链接]
3108|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
(背景:刚毕业,初涉这行,几乎零基础,C基础也不是很好,数模电知识算是基本过关。)
我查阅了很多资料。有关于UART串口打印字符及字符串的程序。然而到现在为止,我都没有成功在PC端助手处获得任何接收数据。
使用的是STM8S105K4芯片。使用USB转串口进行笔记本与单片机间的数据交互。
现在已经实现了数据由PC端发送至单片机,由单片机处理数据。
然而,无论如何单片机的数据无法反馈到PC端串口助手。昨晚,通过示波器检阅波形,没有检测到MCU数据发送信号。
由于是新人,希望大家能对我一些很白痴的行为予以理解。并且,我只会寄存器操作。对于库函数看得懂一些,写不出(没时间学那个,目前)。
最开始,我没有进行GPIO的初始化。因此,在自习研读UART数据流向框图之后,我揣测:
1.UART_Tx(发送数据端)与UART_Rx(数据接收端)的端口配置问题。对于Rx由于之前串口助手发送的数据接收成功,因此,MCU配置该IO口为悬浮输入(接收串口助手的数据)。Tx设置为推挽输出(数据发送给PC)。配置完之后,使用示波器检测UART_Tx端口,发现没有数据变化。
2.由于一直发送不出数据,我深深的怀疑就是因为我UART_Tx端口配置不正确。因此我在网上寻找相关的信息。其中,我看到一个帖子说他完成了UART传输数据,并贴上了代码。
其中关于GPIO配置这一段:
UART_Rx的:GPIO_Init(....,GPIO_MODE_IN_FL_NO_IT);悬浮输入;
UART_Tx的:GPIO_Init(....,GPIO_MODE_IN_PU_NO_IT);上拉输入;
我很怀疑这真的能实现吗?我也设置成这个模式。但是失败了。

其次:关于在串口助手打印字符及字符串。关于printf函数的使用:
1.使用了stido.h文件。并且对putchar函数重定向:
char putchar(char ch)
{
    UART2_DR = ch;
    while((UART2_SR&0x80)==0);
    //return ch;//这个return我确实不知道该去还是该留。由于Tx端,数据进入TDR内直接FIFO的传输了。我也理不清到底这个return是跳出函数还是返回一个值的意思了。
}

最后,我将我所写的调试UART发送数据这个程序贴上来。求各位师傅指导我,批评我。
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
/********************发送调试**********************/
# include"stm8s105k.h"
/*****************数据类型定义**********************/
typedef unsigned char UI08;
typedef unsigned short UI16;
/***************printf重定向***********************/
//# include"stdio.h"
/*****************主时钟***************************/
void CLK_Init(void)
{
        CLK_CKDIVR = 0x00;//HSI 16MHz
}
/*******************简单延时函数********************/
void delay(UI08 i)
{
        while(i--);
}
/*********************GPIO初始化************************/
void GPIO_Init(void)
{
        PD_ODR |= 0x20;//初始输出为高电平
        PD_DDR |= 0x20;//数据传输方向为输出
        PD_CR1 |= 0x20;//推挽式输出
}
/***************UART2初始化***************************/
void UART2_Init(void)
{
        UART2_CR1 = 0x00;//一位数据,无奇偶校验
        UART2_CR3 = 0x00;//一位停止位
        UART2_BRR2 = 0x0B;//16MHz下
        UART2_BRR1 = 0x08;//baudrate = 115200bps
        UART2_CR2 = 0x0c;//启用UART2(收、发)
}
//发送1byte的数据
void UART2_SendByte(UI08 dat)
{//参考Page.199《STM8自学笔记》发送数据
  while((UART2_SR&0x80)==0);//判断TDR是否为空
        UART2_DR = dat;//把要发送的数据写入DR内,数据就被发送出去
}
//打印一个字符
void putchar(char c)
{
        if(c=='\n')
        {
                UART2_SendByte('\n');
        }
        else
        {
                UART2_SendByte(c);
        }
}
//打印字符串
void printf_str(unsigned char *buffer)
{
        while (*buffer!='\0')
        {
                putchar(*buffer++);
        }
}

main()
{
        CLK_Init();
        GPIO_Init();
        UART2_Init();//已开启UART(接收、发送)
        while (1)
        {
                printf_str("this is a Uart test!");//一直发送
                delay(5000);
        }
}
沙发
ycy1988| | 2015-7-9 10:42 | 只看该作者
欢迎关注晟矽微芯片  QQ:642364149   

使用特权

评论回复
板凳
酒香尝在深巷酿|  楼主 | 2015-7-9 14:46 | 只看该作者
就没有人肯帮帮忙看一下么?

使用特权

评论回复
地板
amanda_s| | 2015-7-9 17:50 | 只看该作者
其实楼主为什么不参考官方的标准外设库呢,里面就有这方面的例程。
对于初学者是一个很好的方法,节省走弯路的时间。

使用特权

评论回复
5
amanda_s| | 2015-7-9 18:00 | 只看该作者
其实楼主为什么不参考官方的标准外设库呢,里面就有这方面的例程。
对于初学者是一个很好的方法,节省走弯路的时间。

使用特权

评论回复
6
昊美凌云| | 2015-7-9 20:39 | 只看该作者
在UART2_DR = dat;之后还需要加延时,数据是先进TDR,再到DR。

使用特权

评论回复
7
酒香尝在深巷酿|  楼主 | 2015-7-10 09:48 | 只看该作者
amanda_s 发表于 2015-7-9 18:00
其实楼主为什么不参考官方的标准外设库呢,里面就有这方面的例程。
对于初学者是一个很好的方法,节省走弯 ...

事情解决啦。参考了下。是挺有用的。问题已经解决。是硬件问题Tx脚焊接有问题。导致一直输出高电平。谢谢~

使用特权

评论回复
8
酒香尝在深巷酿|  楼主 | 2015-7-10 09:52 | 只看该作者
昊美凌云 发表于 2015-7-9 20:39
在UART2_DR = dat;之后还需要加延时,数据是先进TDR,再到DR。

我看了数据手册,数据手册里说的是有两个DR寄存器,一个是TDR,一个是RDR。两者不共用,这点看UART框图就很明白了的。数据到TDR之后,它就直接传输出去了。但它是作为一个相对整体传输的。而RDR的话需要被MCU读才能清空吧。不过还是谢谢捧场。昨天已经用示波器解决问题了。

使用特权

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

本版积分规则

2

主题

17

帖子

0

粉丝