【STM8】シリアル通信の実現(LEDオン・オフ制御)

シナリオの説明:
STM8開発ボードを見つけて、それで遊ぶことを計画しました。LEDのオンとオフの制御を実現

1.開発プラットフォームと環境

チップモデル:STM8S03F
開発ボード写真:
ここに画像の説明を挿入
開発環境:
IARソフトウェアを使用してください。環境建設、百度をお願いします。
ここに画像の説明を挿入

2.ボーレート構成

公式:

公式
の:

  • fはクロックソース周波数
    です。メインクロックはCLK_CKDIVRで分周されます。ここではHSI内部クロック16Mを使用していますが、CLK_CKDIVR = 00は周波数を分割しません。つまり、f=16Mです。
  • UATRT_DVIシリアルポート周波数分割。
    つまり、計算する値です。
    例として115200を取り上げます:UATRT_DVI = 16m / 115200=138.89。16進数の結果はおよそ:0x008Bです。
レジスタの値を計算する

UATRT_DVI [15:0]は、BRR2とBRR1で構成されます。
BRR1 [7:0]はUATRT_DVI [11:4]
に対応しますBRR2 [3:0]はUATRT_DVI [3:0]に対応しますBRR2 [7:4]はUATRT_DVI
[15:12]に対応します
BRR1、および両側はBRR1BRR2用です。以下に示すように。
ここに画像の説明を挿入

注:
1。BRR1 = 0x00は無効を意味するため、BRR1に指定する値は0より大きい必要があります
。2。最初にBRR1に値を割り当て、次にBRR2に値を割り当てます。3
。エラーに注意してください。エラーはデータの有効性に影響を与える可能性があります。

3.制御レジスタの構成

レジスタ機能テーブル
ここに画像の説明を挿入

  • TIEN:割り込みイネーブルの送信を開始します(通常は使用されません)
  • TCIEN:送信完全割り込みイネーブル
  • RIEN:受信割り込みイネーブル
  • ILIEN:IDLE割り込みイネーブル
  • TEN:送信イネーブル
  • REN:受信有効
  • RWU:ウェイクアップを受け取る
  • SBK:ブレークフレームを送信します。

送信および受信機能をオンにし、次のように受信割り込み設定を有効にします

    UART1_CR2=0x00;// 先清0
    
    UART1_CR2_TEN = 1;     //允许发送
    UART1_CR2_REN = 1;     //允许接收
    UART1_CR2_RIEN = 1;    //接收中断使能

上記のコードは、次のように記述することもできます。UART1_CR2=0x00;// 0010 1100

4.キーコード

クロックの初期化

ここでは内部クロックを使用しています、16M

#define SYS_CLOCK 16
void CLOCK_Config(unsigned char SYS_CLK)
{
    
    
   //时钟配置为内部RC,16M
   CLK_CKDIVR &=0xe7;
  
   switch(SYS_CLK)
   {
    
    
      case 2: CLK_CKDIVR|=((1<<4)|(1<<3)); break;
      case 4: CLK_CKDIVR|=(1<<4); break;
      case 8: CLK_CKDIVR|=(1<<3); break;
   }
}
シリアルポートの初期化:

ボーレート115200

void  UART1_init(void)
{
    
    
    UART1_CR1=0x00;
    UART1_CR2=0x00;
    UART1_CR3=0x00;
    UART1_BRR2 = 0x0B;     //  16m/9600 = 1666.67(0x0683有误差 ) 取中间和俩边   BRR2 = 0x03,BRR1=0x68
    UART1_BRR1 = 0x08;     //115200波特率
    UART1_CR2_TEN = 1;     //允许发送
    UART1_CR2_REN = 1;     //允许接收
    UART1_CR2_RIEN = 1;    //接收中断使能
}
バイトを送信します。
void  UART1_SendByte(unsigned char dat)
{
    
    
  	UART1_SR &= 0xBF; // 清除清除发送完成TC标志位
	UART1_DR = dat;
	while((UART1_SR & 0x40)==0x00); // SR状态寄存器,第6位为0表示完成 
	UART1_SR &= 0xBF; // 清除清除发送完成TC标志位
}

割り込みを受信する

受信1を実現するには、LED1
をオンにして受信2をオンにし、LED2を
オンにしてLEDをオフにします。

#pragma   vector = UART1_R_RXNE_vector   //接受中断向量

//接受中断函数
__interrupt void UART1_RX_IRQHandler(void)
  {
    
    
    unsigned char rx_data;
    
    if(UART1_SR & 0x20) // 是否接收完成
    {
    
    
	     UART1_SR_RXNE = 0;// 清除接收标识
         rx_data = UART1_DR; // 读取数据
         
         // 用户处理
         if(rx_data == '1')
         {
    
    
           LED1_ON();
           LED2_OFF();
         }
         else if(rx_data == '2')
         {
    
    
           LED2_ON();
           LED1_OFF();
         }
         else
         {
    
    
           LED1_OFF();
           LED2_OFF();
         }
    }
        
  }
主な機能
void main(  )
{
    
    

  asm("sim");//全局中断
  CLOCK_Config(SYS_CLOCK);
  UART1_init();   
  timer_Init();
  LED_init();
 asm("rim");//开全局中断 
 
  while(1);     
   
}

おすすめ

転載: blog.csdn.net/qq_44078824/article/details/123689074