社区首页
技术讨论创新帖
全部新帖
资料区
社区活动
联系管理员
★ 社区积分制度
★ 新手必读
★ 申请版主★
请
登录
后使用快捷导航
没有帐号?
注册
首页
|
电子技术
|
嵌入式
模拟电子
单片机
电源管理
传感器
半导体
电子应用
|
工业控制
物联网
汽车电子
网络通信
医疗电子
手机便携
测试测量
安防电子
家用电子
机器人
新能源
电子头条
|
社区
|
论坛
测评
博客
大学堂
|
下载
|
下载中心
电路图
精品文集
电路图
|
参考设计
|
Datasheet
|
活动
|
直播
datasheet
datasheet
文章
搜索
登录
注册
论坛
切换旧版
电子工程世界-论坛
»
论坛
›
专业技术中心
›
TI技术论坛
›
微控制器 MCU
›
分享编程例程:MSP430单片机UART_FIFO 发送 接受
返回列表
发新帖
回复
阅
1300
|
回
0
Jacktang
当前离线
五彩晶圆(高级)
最后登录
2024-12-3
在线时间
619 小时
威望
7024分
芯积分
6376分
(兑换)
E金币
0枚
(兑换)
(兑换)
好友
1
Jacktang
6628
帖子
0
TA的资源
五彩晶圆(高级)
+ 好友
私信
楼主
发表于2017-4-25 20:37
只看该作者
分享编程例程:MSP430单片机UART_FIFO 发送 接受
[复制链接]
MSP430单片机UART_FIFO 发送 接受
关于本程序的详细解说大家可以下载电子书点击上图即可
原书一共有2个程序
程序1发送:
#include
#define TXBUF_SIZE 32 /*发送FIFO的最大容量*/
unsigned char TX_BUFF[TXBUF_SIZE]; /*发送FIFO缓冲区数组*/
unsigned int UART_OutLen=0; /*发送FIFO内待发出的字节数*/
unsigned int TX_IndexR=0; /*发送FIFO内的读指针*/
unsigned int TX_IndexW=0; /*发送FIFO内的写指针*/
/*****************************************************************
* 名 称:UART0_PutChar()
* 功 能:从串口发送1字节数据(向缓冲队列内填入1字节待发送数据)
* 入口参数:Chr:待发送的字节
* 出口参数:返回1表示发送成功,
返回0表示发送失败。
* 说 明: 发送过程中,不阻塞CPU运行
*****************************************************************/
char UART0_PutChar(unsigned char Chr)
{
if(UART_OutLen == TXBUF_SIZE) //如果FIFO已满
{
return (0); // 不发送数据,返回发送失败标志
}
if(UART_OutLen==0) // 如果是第一个字节
{
IFG1|=UTXIFG0; // 人为制造第一次中断条件
}
_DINT(); // 涉及FIFO操作时不允许中断,以免数据错乱
UART_OutLen++; // 待发送字节数加1
TX_BUFF[TX_IndexW] = Chr; // 待发送数据通过写指针写入FIFO
if (++TX_IndexW >= TXBUF_SIZE)// 写指针递增,且判断是否下标越界
{
TX_IndexW = 0; // 如果越界则写指针归零(循环队列)
}
IE1 |= UTXIE0; // 允许UART0的发送中断,在中断内依次发送数据
_EINT(); // FIFO操作完毕,恢复中断允许
return (1); // 返回发送成功标志
}
#pragma vector=UART0TX_VECTOR
__interrupt void UART_TX (void) // 串口发送中断
{
if(UART_OutLen>0) // FIFO内是否有待发送的数据?
{
UART_OutLen--; // 待发送数据字节数减1
U0TXBUF=TX_BUFF[TX_IndexR]; // 从尾指针读取一个字节并发送
if (++TX_IndexR >= TXBUF_SIZE)// 读指针递增,且判断是否下标越界
{
TX_IndexR = 0; // 如果越界则写指针归零(循环队列)
}
}
else IE1 &=~ UTXIE0; // 如果数据已发完,则关闭UART0的发送中断,停止发送
}
/*****************************************************************
* 名 称:UART0_PutChar_Legacy()
* 功 能:传统的从串口发送1字节数据程序,供对比用
* 入口参数:Chr:待发送的字节
* 说 明: 发送过程中,会阻塞CPU运行
*****************************************************************/
void UART0_PutChar_Legacy(char Chr)
{
TXBUF0=Chr;
while ((IFG1 & UTXIFG0)==0); // 等待该字节发完
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
U0CTL = CHAR; // 异步通讯模式,8位数据,无校验,1位停止位。
ME1 |= UTXE0 + URXE0; // 开启串口0收发模块
U0TCTL |= SSEL0; // 选择ACLK作为串口波特率时钟源。
U0BR1 = 0; //
U0BR0 = 13; // 分频系数整数部分=13
U0MCTL = 0x6B; // 分频系数小数部分调制=5/8。(2400bps)
P2SEL |= BIT4 + BIT5; // P2.4,5 开启第二功能,作为串口收发引脚(不同单片机有差别)
_EINT(); // 总中断允许
while(1)
{
TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // 用TA测量传统发送程序所需时间
UART0_PutChar_Legacy(0x01);
UART0_PutChar_Legacy(0x02);
UART0_PutChar_Legacy(0x03);
UART0_PutChar_Legacy(0x04);
UART0_PutChar_Legacy(0x05); //测试,发送8字节数据
UART0_PutChar_Legacy(0x06);
UART0_PutChar_Legacy(0x07);
UART0_PutChar_Legacy(0x08);
TACTL = TASSEL_2 + MC_0; // TA停止计时
_NOP(); // 在这一句设断点查看TAR值(29652个周期)
__delay_cycles(1000000);
TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // 用TA测量带FIFO的发送程序所需时间
UART0_PutChar(0x01);
UART0_PutChar(0x02);
UART0_PutChar(0x03);
UART0_PutChar(0x04);
UART0_PutChar(0x05); //测试,发送8字节数据
UART0_PutChar(0x06);
UART0_PutChar(0x07);
UART0_PutChar(0x08);
TACTL = TASSEL_2 + MC_0; // TA停止计时
_NOP(); // 在这一句设断点查看TAR值 (440个周期)
__delay_cycles(1000000); //约一秒发送一次
}
}
[color=rgb(51, 102, 153) !important]
复制代码
程序2接受:
#include
#define RXBUF_SIZE 32 /*接收FIFO的最大容量*/
unsigned char RX_BUFF[RXBUF_SIZE]; /*接收FIFO缓冲区数组*/
unsigned int UART_InpLen=0; /*接收FIFO内待读取的字节数*/
unsigned int RX_IndexR=0; /*接收FIFO的读指针*/
unsigned int RX_IndexW=0; /*接收FIFO的写指针*/
/*****************************************************************
* 名 称:UART0_GetChar()
* 功 能:从串口读取1字节数据(从缓冲队列内读取1字节已接收的数据)
* 入口参数:*Chr:读取数据所存放的地址指针
* 出口参数:返回1表示读取成功,返回0表示读取失败。
* 说 明: 读取过程中,不阻塞CPU运行
*****************************************************************/
char UART0_GetChar(unsigned char *Chr)
{
if(UART_InpLen==0) return(0); // 如果FIFO内无数据,返回0
_DINT(); // 涉及FIFO操作时不允许中断,以免指针错乱
UART_InpLen--; // 待读取数据字节数减1
*Chr=RX_BUFF[RX_IndexR]; // 从尾指针读取一个字节作为返回值
if (++RX_IndexR >= RXBUF_SIZE) // 读指针递增,且判断是否下标越界
{
RX_IndexR = 0; // 如果越界则写指针归零(循环队列)
}
_EINT(); // FIFO操作完毕,恢复中断允许
return (1); // 返回发送成功标志
}
/*****************************************************************
* 名 称:UART0_GetCharsInRxBuf()
* 功 能:获取FIFO内已接收的数据字节数
* 入口参数:无
* 出口参数:待读取的字节数
*****************************************************************/
unsigned int UART0_GetCharsInRxBuf()
{
return (UART_InpLen); // 返回FIFO内数据的字节数
}
/*****************************************************************
* 名 称:UART0_ClrRxBuf()
* 功 能:清除接收FIFO区
* 入口参数:无
* 出口参数:无
*****************************************************************/
void UART0_ClrRxBuf()
{
_DINT(); // 涉及FIFO操作时不允许中断,以免指针错乱
UART_InpLen=0; // 接收的数据清空
RX_IndexR=0;
RX_IndexW=0; // 头尾指针复位
_EINT();
}
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX (void) // 串口接收中断
{
UART_InpLen++; // 接收字节计数加1
RX_BUFF[RX_IndexW] =U0RXBUF; // 串口接收数据通过写指针写入FIFO
if (++RX_IndexW >= RXBUF_SIZE) // 写指针递增,且判断是否下标越界
{
RX_IndexW = 0; // 如果越界则写指针归零(循环队列)
}
}
void main( void )
{
unsigned char RxDataBuff[8];
unsigned char Addr;
unsigned char Func;
int i;
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
U0CTL = CHAR; // 异步通讯模式,8位数据,无校验,1位停止位。
ME1 |= UTXE0 + URXE0; // 开启串口0收发模块
U0TCTL |= SSEL0; // 选择ACLK作为串口波特率时钟源。
U0BR1 = 0; //
U0BR0 = 13; // 分频系数整数部分=13
U0MCTL = 0x6B; // 分频系数小数部分调制=5/8。(2400bps)
P2SEL |= BIT4 + BIT5; // P2.4,5 开启第二功能,作为串口收发引脚(不同单片机有差别)
IE1 |= URXIE0; // 开启UART0的接收中断,在中断内接收数据
_EINT(); // 总中断允许
while(1)
{
__delay_cycles(1000000);//模拟一个长耗时的程序,使CPU暂时不能读取串口
if(UART0_GetCharsInRxBuf()>=10) //每收到10字节数据
{
UART0_GetChar(&Addr); //读取第1字节
UART0_GetChar(&Func); //读取第2字节
for(i=0;i<8;i++) UART0_GetChar(RxDataBuff+i); //依次读取后8字节
}
}
}
[color=rgb(51, 102, 153) !important]
复制代码
单片机
此帖出自
微控制器 MCU论坛
点赞
关注
(0)
TI培训
回复
分享
扫一扫,分享给好友
复制链接分享
链接复制成功,分享给好友
举报
提升卡
变色卡
千斤顶
返回列表
发新帖
回复
您需要登录后才可以回帖
登录
|
注册
发表回复
回帖后跳转到最后一页
活动
更多>>
免费申请测评 | RDK X3机器人开发套件
中星联华直播 | 高速信号完整性分析与测试 — “码”上行动系列线上讲堂
新栏目器件口碑专辑上线~快来点评吧!
2024 DigiKey 应用说:大模型时代的智能汽车
有奖直播报名中!抢占工业4.1先机 文晔科技日等你来!
罗姆有奖直播 | 重点解析双极型晶体管的实用选型方法和使用方法
STM32N6终于要发布了,ST首款带有NPU的MCU到底怎么样,欢迎小伙们来STM32全球线上峰会寻找答案!
免费下载 | 安森美电动汽车充电白皮书,看碳化硅如何缓解“里程焦虑”!
开源项目
更多>>
使用 MaxLinear, Inc 的 SP828EK 的参考设计
TCA62723FMG CMOS集成电路的典型应用Silicon Monolithic
AXM0F343-256-868-1-GEVK:AXM0F343-256-1 评估套件 - 868MHz
XRT83SL38EVAL,基于 XRT83SL38 线路接口单元的评估系统
C8051F360DK,用于 C8051F364 8051 微控制器的开发套件
使用 NXP Semiconductors 的 MC56F8006 的参考设计
LTC6262HTS8 SAR ADC 驱动器、运算放大器的典型应用
非隔离稳压器(48V 至 5V)
Eizz Factory 电吉他法滋效果器
【征集令】电子猫眼
随便看看
如下电路该如何分析?
[i=s]本帖最后由乱世煮酒论天下于2024-12-322:31编辑[/i]直流电压源幅值100V,正弦电流源幅值电压105V,以直流源负极为绝对零点针对这种交直流混有,而且含有非线性器件的电路该怎么分析?叠加定理只适用于线性电路[attach]867053[/attach][attach]867062[/at ...
建议谨慎采购美国芯片~~~
ADS7828,IIC信号线初始存在一定电平0.45,再正常升高至3.3V,会导致芯片初始状异常么
新开嵌入式开发讨论群
TI 430学堂 出问题了
C#连接sqlce 也就是*.sdf时,如何用同步的方式在PC上连接到它
电源、电机等设备的软启动电路通常如何实现?
iPod 新法宝:可弯曲汽车充电底座
查找数据手册?
搜索
EEWorld Datasheet 技术支持
热门标签
源代码
单片机
放大器
TI
ST
电源
分立器件
传感器
测试测量
模拟
恒定电流充放电法
两线制传感器
正交相移键控
单面PCB电路板
光敏三极管
检波二极管
OpenMotics
蓝牙4.0
mpeg-4
PN结
相关文章
更多>>
首款NPU和首款64位,德州仪器C2000推出诚意满满的升级路线图
在刚刚过去的德国慕尼黑电子展上,德州仪器(TI)展示了最新的C2000 MCU新品, 包括支持NPU的F28P55X以及业界首款64位MCU F29H85X ,同时在慕展嵌入式论坛上,TI还发表了两
AMD Zen4处理器循环缓冲区功能被悄然禁用
12月3日消息,据媒体报道,近日在BIOS更新后,AMD在Zen 4架构的处理器中悄然禁用了循环缓冲区(Loop Buffer)功能,具体原因尚未公开。 循环缓冲区是CPU前端的一部分,用于存储少量
美国发布新半导体出口管制措施 光刻机巨头ASML:正在评估潜在影响
12月3日消息,日前,光刻机巨头ASML(阿斯麦)发布声明,称美国发布最新版先进计算和半导体制造设备规则,对出口芯片制造技术的供应商施加了更多限制。 这些规定将立即生效,其中一些变更的合规日期将延迟
消息称苹果有望2026下半年推出折叠iPhone,并重振折叠屏手机市场
美国升级对华半导体管制,140家中国半导体公司被列入“实体清单”
安森美二十五周年:唯有创新,才可持续
华为麒麟9020/9030/9040处理器曝光:小步快跑 四大方面升级
特斯拉FSD V13.2用户实测:表现惊艳,可实现“点对点”自动驾驶
AI助力探索癌症最佳诊疗方法
新型催化剂将水解制氢效率提高200倍
新帖速递
STM32和无源蜂鸣器播放声音的问题
车规级AECQ200介绍,混合铝电解电容器的选择
嵌入式教程_DSP技术_DSP实验箱操作教程:2-28 搭建轻量级WEB服务器实验
OPA847IDBVR运放器国产替代
AG32VF407测试UART
【得捷电子Follow Me第二期】第一章 收到货物的分享
请问这个红外接收头是什么型号?能用哪个型号代替?谢谢
出售全新未拆封ZYNQ 7Z020 FPGA核心板
用在锂电池供电的水表设置上的LORA模块,当有100块水表集中安装在一个楼道内时,节能
请问一下,当某个端口被设置为 RX0后,这个端口的输入输出方向还有必要设置吗
今年怎么这么难,比疫情时还难,三十了面临失业好迷茫
请教稳压管测试问题
【小华HC32F448测评】关于小华半导体的UART中断发送和PRINTF构造和重定向
【BIGTREETECH PI开发板】 HDMI输出测试
【BIGTREETECH PI开发板】+08.音频测试(zmj)
免费申请测评:RDK X3机器人开发套件
RDK X3是一款面向生态开发者的嵌入式AI开发板,具备5Tops的端侧推理能力,40pin接口兼容树莓派。搭载了伯努利2.0BPU和4核ARM A53处理器。拥有先进的ISP处理算法,使得在宽动态、低照度场景下,也能得到高质量的图像;同时具备强大的视频处理能力,可同时处理多路Camera Sensor的输入并支持H.264/H.265编解码。
查看 »
等待很久的STM32N6终于要发布了!
ST首款带有NPU的MCU到底怎么样,欢迎小伙们来STM32全球线上峰会寻找答案!报名峰会,还能赢【开发板、京东卡】呦~12月12日14:00不见不散!
查看 »
有奖直播报名| 高可靠性IGBT新选择 —— 安世半导体650V IGBT
【直播时间】12月19日(周四)下午15:00-16:30
【直播好礼】定制双肩商务包、30元京东卡、吸管玻璃杯
查看 »
安世半导体直播报名中
直播主题:安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
直播时间:12月17日(周二)下午14:00
报名就有机会获得:定制双肩商务包、30元京东卡、吸管玻璃杯
查看 »
PI 电源小课堂 | 无 DC-DC 变换实现多路高精度输出反激电源
时间:即日起-12月15日
看视频学习电源干货,答题赢取京东卡!
查看 »
Littelfuse 新品赋能电子产品安全可靠并高效, 10+挑战等你探索!
Littelfuse 应用赋能星球,覆盖了诸多应用痛点及解决办法,邀请工程师一起探索,解锁更多设计力!
查看 »
下载资料赢好礼!看Vicor模块化电源解决方案如何推动创新
活动时间:即日起-2024年12月31日
如何参与:点击活动页内您想了解的模块,找到资料下载即可参与抽奖,活动结束后统一发奖!
查看 »
有奖活动|英飞凌高密度双相电源模块为高性能运算平台而生
活动时间:即日起-12月15日
活动奖励:蓝牙音箱、氮化镓充电器套装、黑色小背包
查看 »
本月精选下载推荐:
Vishay——选型-汽车级表面贴装和通孔超快整流器
查看 »
本周精选下载推荐:电源管理基础Dummies
本周小编给大家带来一本超简单、超干货的电子书——《电源管理基础Dummies》!内容深入浅出,排版舒服简洁,分分钟能get到电源管理最核心的知识内容。
查看 »
关闭
站长推荐
1
/10
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
电信业务审批[2006]字第258号函
京公网安备 11010802033920号
Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复
返回顶部
返回列表
论坛首页
版块列表
专业技术中心
TI技术论坛
ST传感器与低功耗无线技术论坛
ADI参考电路
DigiKey得捷技术专区
ADI · 世健工业技术
电子技术交流
嵌入式系统
单片机
国产芯片交流
电机驱动控制
FPGA/CPLD
模拟电子
电源技术
PCB技术
RF/无线
传感器
综合技术交流
下载中心专版
大学堂专版
测评中心专版
创意与实践
电子竞赛
DIY/开源硬件专区
淘e淘
创意市集
行业应用
汽车电子
移动便携
医疗电子
工控电子
安防电子
休息一下
聊聊、笑笑、闹闹
工作这点儿事
为我们提意见&公告
EEWorld颁奖专区
信息发布
最新帖子
最新帖子
最新回复
精华
消灭零回复
测评中心
活动中心
积分兑换
E金币兑换
芯积分
厂商专区
TI技术论坛
ST传感器与低功耗无线技术论坛