[合泰杯HT32讨论区] 合泰单片机工程5之串口通信

[复制链接]
 楼主| kzlzqi 发表于 2023-2-26 16:32 | 显示全部楼层 |阅读模式
前言
这一章更新的是关于合泰单片机串口通信的内容,用的是HT66F2390的芯片和板子,使用e-link下载程序来调试。程序是借助合泰官方usat的例程来更改调试。程序实现的效果预计为定时1秒向串口调试助手发送“广东工业大学MFT微流控团队合泰单片机HT66F2390串口通信实验调试”,串口调试助手发送字符相应,单片机并返回相应的字符给调试助手。再加上一个发送0x01点亮LED1.

提示:以下是本篇文章正文内容,下面案例可供参考

一、usat例程分析?
我们先来看一下程序,前面没什么好说,就是定义和声明数据计数、数据的长度等,重点看下面条件编译的那部分,也是我标注的那一部分。

评论

———————————————— 版权声明:本文为CSDN博主「yijianpeng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/newpeopie/article/details/114382794  发表于 2023-2-26 16:32
 楼主| kzlzqi 发表于 2023-2-26 16:32 | 显示全部楼层
这里使用了条件编译,功能如下
#if 常量表达式 程序段1
#else程序段2
#endif
它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能。
 楼主| kzlzqi 发表于 2023-2-26 16:35 | 显示全部楼层
例程中的BRGH_0在uart.h中有进行了宏定义为1了。所以这里编译的是程序_u0cr2=0b11101100;

 楼主| kzlzqi 发表于 2023-2-26 16:36 | 显示全部楼层
再来看U0CR2寄存器,它的主要功能是控制发送器、接收器以及各种 UART0中断源的使能或除能。这里就仔细解释了,感兴趣的可以在技术手册上看看他们选择的相应功能,以便让自己有一个更深的理解。

 楼主| kzlzqi 发表于 2023-2-26 16:37 | 显示全部楼层
再来看U0CR2寄存器,它的主要功能是控制发送器、接收器以及各种 UART0中断源的使能或除能。这里就仔细解释了,感兴趣的可以在技术手册上看看他们选择的相应功能,以便让自己有一个更深的理解。


 楼主| kzlzqi 发表于 2023-2-26 16:37 | 显示全部楼层
发送一个字节的函数,如果想发送一个数组可以定义一个字符串型数组,然后用for循环发送即可。


  1. void UART_Send_Byte(unsigned char Data_byte)
  2. {       
  3.         _ur0e=0;
  4.         while(_txif0==0);
  5.         _txr_rxr0=Data_byte;
  6.         _ur0e=1;
  7. }


 楼主| kzlzqi 发表于 2023-2-26 16:37 | 显示全部楼层
接收数据函数
  1. //        Receive serial data   接收一系列数据   
  2. //  这里是一个中断函数
  3. void __attribute((interrupt(0x3c))) UART_Receive(void)
  4. {
  5.         GCC_NOP();
  6.         if(_ur0f==1)
  7.         {
  8.                 if(_perr0==1||_oerr0==1||_nf0==1||_ferr0==1)
  9.                 {
  10.                         asm("lmov a,___txr_rxr0");        //read RXR0 register to clear RXIF0 bit
  11.                 }else
  12.                 {
  13.                         Rcv_Time_Counter=0;
  14.                         while(_rxif0==0);
  15.                         if(Data_Counter<16)
  16.                         {
  17.                                 Rcv_Data[Data_Counter] = _txr_rxr0;       
  18.                                 Data_Counter++;
  19.                         }else
  20.                         {
  21.                                 Data_Counter=0;
  22.                                 Rcv_Data[Data_Counter] = _txr_rxr0;       
  23.                         }
  24.                        
  25.                 }
  26.                 _ur0f=0;
  27.         }
  28. }
 楼主| kzlzqi 发表于 2023-2-26 16:39 | 显示全部楼层
编写程序
主函数
  1. #include "HT66F2390.h"
  2. #include "delay.h"
  3. #include "uart.h"
  4. #include "LED.h"
  5. #include "string.h"   //调用strlen函数要引入字符串的头文件

  6. void main()
  7. {
  8.         int t=0,i=0;    //用于计时
  9.         char date[]="广东工业大学MFT团队合泰单片机串口实验";
  10.         LED_Init();  //LED初始化
  11.         UART_SET();   //串口函数初始化
  12.         while(1)
  13.         {
  14.                 GCC_CLRWDT();   //清除看门狗
  15.                 delay_ms(10);
  16.                 t++;
  17.                 if(RECEIVE_Finish_Flag==1)
  18.                 {
  19.                         if(Rcv_Data[0]==0x01)
  20.                         {
  21.                                 LED1 =!LED1;
  22.                         }
  23.                         for(i=0;i<RCV_Data_Length;i++)UART_Send_Byte(Rcv_Data[i]);
  24.                         RECEIVE_Finish_Flag=0;   //清除接收标志位               
  25.                 }
  26.                 if(t==100)
  27.                 {
  28.                         for(i=0;i<strlen(date);i++)
  29.                         {
  30.                                 UART_Send_Byte(date[i]);
  31.                         }
  32.                         LED2 =!LED2;    //LED2取反用来显示工作是否正常
  33.                         t=0;
  34.                 }
  35.                 GCC_CLRWDT();   //清除看门狗
  36.         }

  37. }


 楼主| kzlzqi 发表于 2023-2-26 16:41 | 显示全部楼层
总结
串口通信的这一篇暂时到这里,因为还没有下载进去调试,所以可能会有出错的地方,之后会及时更改。下一篇是定时器部分。
工程文件等下载进去调试好之后再上传到这里。
qiufengsd 发表于 2023-3-7 13:57 | 显示全部楼层
单片机串行通信有何应用?               
loutin 发表于 2023-3-7 19:34 | 显示全部楼层
合泰单片机可以做波特率自动识别吗?
tifmill 发表于 2023-3-7 19:40 | 显示全部楼层
串口通信需要用哪些寄存器               
febgxu 发表于 2023-3-7 19:57 | 显示全部楼层
多个单片机串口通信如何进行电路的设计?
wengh2016 发表于 2023-3-7 20:16 | 显示全部楼层
串口通信的带宽是多少               
qiufengsd 发表于 2023-3-7 20:32 | 显示全部楼层
串口如何实现时时波特率自适应方案
sdCAD 发表于 2023-3-7 20:37 | 显示全部楼层
单片机最大的波特率是多少?              
burgessmaggie 发表于 2023-3-7 20:46 | 显示全部楼层
单片机与单片机之间如何进行串行通信?
updownq 发表于 2023-3-7 21:00 | 显示全部楼层
单片机波特率如何设置              
pmp 发表于 2023-3-7 21:06 | 显示全部楼层
双串口单片机如何两串口相互通信
maudlu 发表于 2023-3-7 21:12 | 显示全部楼层
串口通信波特率若可变,由谁确定?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

124

主题

992

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

124

主题

992

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部