实验要求
最近学习通上老师布置串口收发作业的实验。与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配置串口稍微麻烦一些。
首先看硬件原理图:

确定串口在P0口。
把初始化都封装在void initUART0(void)函数中,主要看下其中需要初始化哪些寄存器和如何初始化。
先在芯片资料手册中找到关于CLKCONCMD的详细说明如下图:

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

被折叠的 条评论
为什么被折叠?



