(背景:刚毕业,初涉这行,几乎零基础,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);
}
}
|