ヘタイカップ-ヘタイMCUプロジェクト5のシリアル通信

ヘタイカップ-ヘタイMCUプロジェクト5のシリアル通信


序文

この章で更新されているのは、Hetai MCUのシリアル通信に関するものです。HT66F2390のチップとボードを使用し、デバッグにはe-linkダウンロードプログラムを使用します。プログラムは、Hetaiの公式usatルーチンの助けを借りて変更およびデバッグされます。プログラムの効果は、「広東工業大学MFTマイクロ流体制御チームHetai MCU HT66F2390シリアル通信実験デバッグ」を1秒の固定時間でシリアルデバッグアシスタントに送信する予定です。シリアルデバッグアシスタントは、対応する文字を送信し、マイクロプロセッサは、対応する文字をデバッグアシスタントに返します。プラス1はLED1を点灯するために0x01を送信します。


ヒント:以下はこの記事の内容です。以下のケースは参照用です。

1. Usatルーチン分析?

最初にプログラムを見てみましょう。これまでに言うことはありません。つまり、データカウント、データ長などの定義と宣言は、以下の条件付きコンパイルの部分に焦点を当てています。これは、私がマークした部分でもあります。
ここに画像の説明を挿入します
ここでは条件付きコンパイルが使用され、関数は次のとおりです。
#定数式プログラムセグメント1の場合
#elseプログラムセグメント2
#endif
その関数は、定数式の値がtrue(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();   //清除看门狗
	}

}

総括する

このシリアル通信の記事は、デバッグ用にダウンロードされていないため、当面はここにあります。エラーが発生する可能性があり、時間の経過とともに変更される可能性があります。次の記事はタイマーセクションです。
プロジェクトファイルは、ダウンロードしてデバッグした後、ここにアップロードされます。

おすすめ

転載: blog.csdn.net/newpeopie/article/details/114382794