【串口收发实验】从串口助手发送一个字符或者一个字符串到开发板,开发板又将收到的字符或者字符串回送到串口助手上

本文记录了一次STM2530的串口收发实验,实验内容包括从串口助手发送字符或字符串到开发板,并回送到串口助手。介绍了实验环境如IAR v10.30.1和串口调试助手v4.13.3,以及2530配置串口的初始化过程,涉及CLKCONCMD寄存器的设置。

实验要求

最近学习通上老师布置串口收发作业的实验。与51单片机不同的是,2530配置串口稍微麻烦一些。所以记录下来。

串口收发实验(从串口助手发送一个字符或者一个字符串到开发板,开发板又将收到的字符或者字符串回送到串口助手上)

实验环境

IAR v10.30.1
Win10 1903
串口调试助手 v4.13.3

实验代码

#include <ioCC2530.h>
#include <string.h>


void initUART0(void);
void Send_String(unsigned char *Data, int len);
unsigned char str1[45]="Please send a string with a '#' in the end";
unsigned char Recdata[25];
unsigned char RXTXflag=1;
unsigned char temp;
unsigned int datanumber=0;
unsigned int stringlen;

/********************************************************************
* 函数名  :initUART0(void)
* 函数功能:初始化串口0函数
* 输入    : void
* 输出    : 无
********************************************************************/
void initUART0(void)
{
    CLKCONCMD &= ~0x40;//设置系统时钟源32MHz晶振
    while(CLKCONSTA&0x40);//等待晶振稳定
    CLKCONCMD&=~0x47;//设置系统主时钟频率32MHz

    PERCFG= 0x00;//位置1P0口
    P0SEL=0x3C;//P0口是串口
    P2DIR&=~0xC0;//P0优先作为UART0
    U0CSR|=0x80;//串口设置为UART方式
    U0GCR|=9;
    U0BAUD|=59;//波特率19200
    UTX0IF=1;//UART0 TX中断标志初始为1
    U0CSR|=0x40;//允许接受
    IEN0|=0x84;//开总中断,接受中断

}

/********************************************************************
* 函数名  :Send_String(unsigned char *Data, int len)
* 函数功能:串口发送字符串函数
* 输入    : void
* 输出    : 无
********************************************************************/
void Send_String(unsigned char *Data, int len)
{
    unsigned int j;
    for(j=0;j<len;j++)
    {
        U0DBUF=*Data++;
        while (UTX0IF==0);
        UTX0IF=0;
        
    }
}

/********************************************************************
* 函数名  :MAIN
* 函数功能:主函数
* 输入    : void
* 输出    : 无
********************************************************************/
void main(void)
{
    P1DIR=0x03;//LED开
    initUART0();
    Send_String(str1,45);
    while (1)
    {
        if (RXTXflag==1)//接受状态
        {
            if (temp!=0)
            {
                if ((temp!='#')&&(datanumber<25))
                {
                    Recdata[datanumber++]=temp;
                }
                else
                {
                    RXTXflag=3;
                }
                temp=0;
                
            }
            
        }
        
        if (RXTXflag==3)//发送状态
        {
            U0CSR&=~0x40;//关闭接受
            Send_String(Recdata,datanumber);
            U0CSR|=0x40;//开接收
            RXTXflag=1;//接收状态
            datanumber=0;
        }
        
    }
    
}
/********************************************************************
* Stefan 
********************************************************************/
#pragma vector=URX0_VECTOR
__interrupt void UART0_ISR(void)
{
    URX0IF=0;//清中断标志
    temp=U0DBUF;
}

代码解析

与51单片机不同的是,2530配置串口稍微麻烦一些。
首先看硬件原理图:
stefanpic
确定串口在P0口。
把初始化都封装在void initUART0(void)函数中,主要看下其中需要初始化哪些寄存器和如何初始化。
先在芯片资料手册中找到关于CLKCONCMD的详细说明如下图:
stefanpic2
一共8位,0-2位这三位用于设置Clock speed,也就是时钟速度。3-5位用于设置定时器输出配置。这两个各占据三位,也就是各有8种配置可以选择。6bit位用于设置系统时钟频率,7bit位设置32kHZ时钟源的选择,其中xosc是指外部的晶振给系统提供clock,rcosc是指单片机内部的RC震荡电路提供系统clock。

CLKCONCMD &= ~0x40;//设置系统时钟源32MHz晶振
while(CLKCONSTA&0x40);//等待晶振稳定
CLKCONCMD&=~0x47;//设置系统主时钟频率32MHz

然后按照说明取相应的值,使用&=是为了不改变CLKCONCMD的其他位。
后面还有解析,这里就不贴了。

查看全部

查看全部内容,请访问我的个人博客:

串口收发实验

Stefan 的博客
我的邮箱:stefancharles@vip.qq.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值