《单片机技术与应用》课件-43.实现PC机与CC2530的串口通信代码分析_第1页
《单片机技术与应用》课件-43.实现PC机与CC2530的串口通信代码分析_第2页
《单片机技术与应用》课件-43.实现PC机与CC2530的串口通信代码分析_第3页
《单片机技术与应用》课件-43.实现PC机与CC2530的串口通信代码分析_第4页
《单片机技术与应用》课件-43.实现PC机与CC2530的串口通信代码分析_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机技术与应用实现PC机与CC2530的串口通信代码分析数据类型编写“实现PC机与CC2530串口通信”任务代码的逻辑思路串口的基本配置方式数据类型#include<ioCC2530.h>charname_string[20];unsignedchartemp,RX_flag,count=0;//*****************************时钟初始化函数********************************voidSysClock_Init(){CLKCONCMD&=~0x40;//选择32MHz晶振

while(CLKCONSTA&0x40);//等待时钟稳定CLKCONCMD&=~0x07;//32MHz主时钟}//*******************************延时函数*************************************voiddelay(unsignedinti){unsignedintj,k;for(k=0;k<i;k++){for(j=0;j<500;j++);}}//*****************************串口初始化函数********************************voidinitial_usart(){PERCFG=0X00;//usart0使用备用位置1TX-P0.3RX-P0.2P0SEL|=0X3C;//P0.2P0.3P0.4P0.5用于外设功能

P2DIR&=~0xC0;//P0优先作为UART方式

U0CSR|=0XC0;//uart模式

允许接收

U0GCR=11;U0BAUD=216;//波特率设为115200URX0IF=0;//uart0RX中断标志位清零

IEN0=0X84;//接收中断使能

总中断使能

}//******************************串口发送函数********************************voiduart_tx_string(char*data_tx,intlen){unsignedintj;for(j=0;j<len;j++){U0DBUF=*data_tx++;while(UTX0IF==0);UTX0IF=0;}}//*************************串口接收中断服务函数*****************************#pragmavector=URX0_VECTOR__interruptvoidUART0_RX_ISR(void){URX0IF=0;temp=U0DBUF;RX_flag=1;}//**********************************主函数************************************voidmain(void){SysClock_Init();//调用时钟初始化函数initial_usart();//调用UART初始化函数

while(1){if(RX_flag==1){RX_flag=0;if(temp!='#'){name_string[count++]=temp;//存储接收数据:名字+#

}else{U0CSR&=~0X40;//禁止接收

//名字接收结束,发送Hi+空格

uart_tx_string("Hi,",sizeof("Hi,"));delay(1000);//发送名字字符串uart_tx_string(name_string,sizeof(name_string));count=0;U0CSR|=0X40;//允许接收

}}}}包含头文件ioCC2530.hCC2530开发的专用头文件硬件抽象层的核心组成部分#include"ioCC2530.h"包含头文件寄存器映射位定义中断向量表为开发者定义全局变量charname_string[20];unsignedchartemp,RX_flag,count=0;charname_string[20];定义字符型数组:name_string用于存储通过串口接收到的从PC发送的用户名字符序列,直到遇到结束符

#(即保存发送来的“TOM#”中的T、O、M),以便后续处理回传。数组大小:20实际有效存储长度为19字符定义全局变量定义三个无符号的字符型变量:tempRX_flagcountcharname_string[20];unsignedchartemp,RX_flag,count=0;定义全局变量定义三个无符号的字符型变量:tempCC2530每次接收到新字符时,硬件触发中断,进入串口接收中断服务函数(UART0_RX_ISR)中,会读取U0DBUF中接收的单个字符,存入temp。再将temp传递给主循环处理,根据temp值是否为“#”决定存储或结束接收。temp是中断与主循环间的数据传递桥梁。RX_flagcountcharname_string[20];unsignedchartemp,RX_flag,count=0;定义全局变量定义三个无符号的字符型变量:temp接收完成标志,用于通知主循环有新的字符需要处理。在接收中断服务函数(UART0_RX_ISR)中会被置1(即接收到字符)。在主循环中通过

if(RX_flag==1)

进入处理逻辑后清0,实现中断与主程序间的通信,是同步中断和主程序的关键标志。RX_flagcountcharname_string[20];unsignedchartemp,RX_flag,count=0;定义全局变量定义三个无符号的字符型变量:temp数据name_string的索引,初始化为0,每接收一个字符,count递增,直到遇到“#”时复位为0。RX_flagcountcharname_string[20];unsignedchartemp,RX_flag,count=0;系统时钟初始化函数SysClock_Init()voidSysClock_Init(){CLKCONCMD&=~0x40;while(CLKCONSTA&0x40);CLKCONCMD&=~0x07;}CLKCONCMD&=~0x40;:清零CLKCONCMD.OSC位系统时钟从所选的主系统时钟源获的选择32MHz外部晶振时钟源系统时钟初始化函数SysClock_Init()voidSysClock_Init(){CLKCONCMD&=~0x40;while(CLKCONSTA&0x40);CLKCONCMD&=~0x07;}while(CLKCONSTA&0x40);:

等待时钟状态稳定(直到OSC位变为0)时钟源的改变在CLKCONSTA.OSC=CLKCONCMD.OSC的时候生效系统时钟初始化函数SysClock_Init()voidSysClock_Init(){CLKCONCMD&=~0x40;while(CLKCONSTA&0x40);CLKCONCMD&=~0x07;}CLKCONCMD&=~0x07;:设置CLKCONCMD.CLKSPD为000系统主时钟频率=32MHz系统时钟初始化函数SysClock_Init()选择晶振等待稳定设置主频时钟配置顺序必须遵循系统时钟初始化函数SysClock_Init()CLKCONCMD配置CLKCONSTA状态读取延时函数delay()voiddelay(unsignedinti){unsignedintj,k;for(k=0;k<i;k++){for(j=0;j<500;j++);}}延时函数:内层循环约消耗1ms(在32MHz下)而外层循环控制总延时次数延时函数delay()voiddelay(unsignedinti){unsignedintj,k;for(k=0;k<i;k++){for(j=0;j<500;j++);}}延时函数:延时函数精度低,受编译器优化影响。建议改用定时器精确延时。串口初始化函数initial_usart()voidinitial_usart(){PERCFG=0X00;P0SEL|=0X3C;P2DIR&=\~0xC0;U0CSR|=0XC0;U0GCR=11;U0BAUD=216;URX0IF=0;IEN0=0X84;}PERCFG=0X00;:外设控制,设置UART0映射到P0口,选择默认位置1。P0SEL|=0X3C;:将P0端口对应位引脚配置为外设I/O功能,P0_2、P0_3分别对应串口RX、TX。P2DIR&=\~0xC0;:确保UART0优先使用P0口。串口初始化函数initial_usart()voidinitial_usart(){PERCFG=0X00;P0SEL|=0X3C;P2DIR&=\~0xC0;U0CSR|=0XC0;U0GCR=11;U0BAUD=216;URX0IF=0;IEN0=0X84;}U0CSR|=0XC0;:使能UART模式(0x80)且使能接收(0x40)。U0GCR=11;与U0BAUD=216;:合作设置波特率参数115200bps。URX0IF=0;:清零接收中断标志。IEN0=0X84;:使能总中断(0x80)和UART0接收中断(0x04)。串口发送函数uart_tx_string()voiduart_tx_string(char*data_tx,intlen){unsignedintj;for(j=0;j<len;j++){U0DBUF=*data_tx++;//写入发送缓冲区while(UTX0IF==0);//等待发送完成(UTX0IF置1)UTX0IF=0;}}unsignedintj;:定义无符号整形变量j,用于控制循环次数。串口发送函数uart_tx_string()voiduart_tx_string(char*data_tx,intlen){unsignedintj;for(j=0;j<len;j++){U0DBUF=*data_tx++;//写入发送缓冲区while(UTX0IF==0);//等待发送完成(UTX0IF置1)UTX0IF=0;}}for循环:通过循环,完成陆续将按单字符传发送缓冲区U0DBUF,并发送出去。串口发送函数uart_tx_string()voiduart_tx_string(char*data_tx,intlen){unsignedintj;for(j=0;j<len;j++){U0DBUF=*data_tx++;//写入发送缓冲区while(UTX0IF==0);//等待发送完成(UTX0IF置1)UTX0IF=0;}}U0DBUF=*data_tx++;:将单字节数据(字符)写入发送缓冲区U0DBUF。串口发送函数uart_tx_string()voiduart_tx_string(char*data_tx,intlen){unsignedintj;for(j=0;j<len;j++){U0DBUF=*data_tx++;//写入发送缓冲区while(UTX0IF==0);//等待发送完成(UTX0IF置1)UTX0IF=0;}}while(UTX0IF==0):等待U0DBUF中的单字符发送完成,UTX0IF会自动置1。串口发送函数uart_tx_string()voiduart_tx_string(char*data_tx,intlen){unsignedintj;for(j=0;j<len;j++){U0DBUF=*data_tx++;//写入发送缓冲区while(UTX0IF==0);//等待发送完成(UTX0IF置1)UTX0IF=0;}}UTX0IF=0;:在发送函数中显式清零UTX0IF,可避免运行机制差异的不确定性,以适配所有硬件状态。串口接收中断服务函数UART0_RX_ISR()#pragmavector=URX0_VECTOR__interruptvoidUART0_RX_ISR(void){URX0IF=0;temp=U0DBUF;RX_flag=1;}#pragmavector=URX0_VECTOR:#pragmavector:IAR编译器特有的预处理指令,用于指定中断服务函数(ISR)与中断向量地址的绑定关系。#pragmavector=URX0_VECTOR:URX0_VECTOR:预定义的宏,表示UART0接收中断的向量地址(在ioCC2530.h中定义为0x13)。__interruptvoidUART0_RX_ISR(void){}:__interrupt关键字:告知编译器该函数UART0_RX_ISR()是中断服务程序。串口接收中断服务函数UART0_RX_ISR()#pragmavector=URX0_VECTOR__interruptvoidUART0_RX_ISR(void){URX0IF=0;temp=U0DBUF;RX_flag=1;}URX0IF=0;:清零RX接收中断标志:中断触发后立即清除标志,可避免重复中断。temp=U0DBUF;:清零RX接收中断标志:读取接收缓冲区U0DBUF的单字节数据到临时变量tempRX_flag=1;:置位接收完成标志:以便通知主程序(见主循环代码)主函数main()voidmain(void){SysClock_Init();initial_usart();while(1){if(RX_flag==1){RX_flag=0;if(temp!='#'){name_string[count++]=temp;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论