合泰杯——合泰單片機工程5之串口通信
- 前言
- 一、usat例程分析?
- 二、撰寫程式
- 總結
前言
這一章更新的是關于合泰單片機串口通信的內容,用的是HT66F2390的芯片和板子,使用e-link下載程式來除錯,程式是借助合泰官方usat的例程來更改除錯,程式實作的效果預計為定時1秒向串口除錯助手發送“廣東工業大學MFT微流控團隊合泰單片機HT66F2390串口通信實驗除錯”,串口除錯助手發送字符相應,單片機并回傳相應的字符給除錯助手,再加上一個發送0x01點亮LED1.
提示:以下是本篇文章正文內容,下面案例可供參考
一、usat例程分析?
我們先來看一下程式,前面沒什么好說,就是定義和宣告資料計數、資料的長度等,重點看下面條件編譯的那部分,也是我標注的那一部分,

這里使用了條件編譯,功能如下
#if 常量運算式 程式段1
#else程式段2
#endif
它的功能是,如常量運算式的值為真(非0),則對程式段1 進行編譯,否則對程式段2進行編譯,因此可以使程式在不同條件下,完成不同的功能,
例程中的BRGH_0在uart.h中有進行了宏定義為1了,所以這里編譯的是程式_u0cr2=0b11101100;

再來看U0CR2暫存器,它的主要功能是控制發送器、接收器以及各種 UART0中斷源的使能或除能,這里就仔細解釋了,感興趣的可以在技術手冊上看看他們選擇的相應功能,以便讓自己有一個更深的理解,

發送一個位元組的函式,如果想發送一個陣列可以定義一個字串型陣列,然后用for回圈發送即可,
void UART_Send_Byte(unsigned char Data_byte)
{
_ur0e=0;
while(_txif0==0);
_txr_rxr0=Data_byte;
_ur0e=1;
}
接收資料函式
// Receive serial data 接收一系列資料
// 這里是一個中斷函式
void __attribute((interrupt(0x3c))) UART_Receive(void)
{
GCC_NOP();
if(_ur0f==1)
{
if(_perr0==1||_oerr0==1||_nf0==1||_ferr0==1)
{
asm("lmov a,___txr_rxr0"); //read RXR0 register to clear RXIF0 bit
}else
{
Rcv_Time_Counter=0;
while(_rxif0==0);
if(Data_Counter<16)
{
Rcv_Data[Data_Counter] = _txr_rxr0;
Data_Counter++;
}else
{
Data_Counter=0;
Rcv_Data[Data_Counter] = _txr_rxr0;
}
}
_ur0f=0;
}
}
二、撰寫程式
主函式
#include "HT66F2390.h"
#include "delay.h"
#include "uart.h"
#include "LED.h"
#include "string.h" //呼叫strlen函式要引入字串的頭檔案
void main()
{
int t=0,i=0; //用于計時
char date[]="廣東工業大學MFT團隊合泰單片機串口實驗";
LED_Init(); //LED初始化
UART_SET(); //串口函式初始化
while(1)
{
GCC_CLRWDT(); //清除看門狗
delay_ms(10);
t++;
if(RECEIVE_Finish_Flag==1)
{
if(Rcv_Data[0]==0x01)
{
LED1 =!LED1;
}
for(i=0;i<RCV_Data_Length;i++)UART_Send_Byte(Rcv_Data[i]);
RECEIVE_Finish_Flag=0; //清除接收標志位
}
if(t==100)
{
for(i=0;i<strlen(date);i++)
{
UART_Send_Byte(date[i]);
}
LED2 =!LED2; //LED2取反用來顯示作業是否正常
t=0;
}
GCC_CLRWDT(); //清除看門狗
}
}
總結
串口通信的這一篇暫時到這里,因為還沒有下載進去除錯,所以可能會有出錯的地方,之后會及時更改,下一篇是定時器部分,
工程檔案等下載進去除錯好之后再上傳到這里,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/267113.html
標籤:其他
上一篇:樹莓派(Raspberry Pi) Pico VSCode C/C++開發環境配置(無需Visual Studio)
