[STM8] Réalisation de la communication série (contrôle de l'allumage et de l'extinction des LED)

Description du scénario :
J'ai trouvé une carte de développement STM8 et j'ai prévu de jouer avec. Réaliser le contrôle d'activation et de désactivation des LED

1. Plate-forme et environnement de développement

Modèle de puce : carte de développement STM8S03F
Image :
insérez la description de l'image ici
environnement de développement :
utilisez le logiciel IAR. Construction de l'environnement, s'il vous plaît Baidu.
insérez la description de l'image ici

2. Configuration du débit en bauds

officiel:

officiel
dans:

  • f est la fréquence de la source d'horloge
    L'horloge principale est divisée par CLK_CKD IVR. J'utilise ici l'horloge interne HSI 16M, et CLK_CKDIVR=00 ne divise pas la fréquence, c'est-à-dire f=16M.
  • Division de fréquence du port série UATRT_DVI.
    C'est-à-dire la valeur que nous voulons calculer.
    Prenons 115200 comme exemple : UATRT_DVI = 16m/115200 = 138,89. Le résultat hexadécimal est approximativement : 0x008B
Calculer la valeur d'un registre

UATRT_DVI[15:0] se compose de BRR2 et BRR1.
BRR1[7:0] correspond à UATRT_DVI [11:4]
BRR2[3:0] correspond à UATRT_DVI [3:0]
BRR2[7:4] correspond à UATRT_DVI [15:12]
Par conséquent, le milieu de 0x008B est pour BRR1, et les deux côtés sont pour BRR1 BRR2. Comme indiqué ci-dessous.
insérez la description de l'image ici

Remarque :
1. BRR1 = 0x00 signifie désactivé, donc la valeur donnée à BRR1 doit être supérieure à 0.
2. Attribuez d'abord une valeur à BRR1, puis attribuez une valeur à BRR2
3. Faites attention à l'erreur. Les erreurs peuvent affecter la validité des données.

3. Configuration du registre de contrôle

Tableau des fonctions de registre
insérez la description de l'image ici

  • TIEN : commencer à envoyer l'autorisation d'interruption (généralement non utilisé)
  • TCIEN : activation de l'interruption complète de transmission
  • RIEN : activer l'interruption de réception
  • ILIEN:Activation d'interruption IDLE
  • TEN : activation de l'envoi
  • REN : réception activée
  • RWU : Recevoir le réveil
  • SBK : envoyer une trame de pause.

Activez les fonctions d'envoi et de réception et activez la configuration d'interruption de réception comme suit

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

Le code ci-dessus peut aussi s'écrire :UART1_CR2=0x00;// 0010 1100

4. Code clé

Initialisation de l'horloge

L'horloge interne est utilisée ici, 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;
   }
}
Initialisation du port série :

débit en bauds 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;    //接收中断使能
}
Envoyer un octet :
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标志位
}

recevoir une interruption

Pour obtenir la réception 1, allumez la LED1
pour recevoir 2, allumez la LED2 et
éteignez les 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();
         }
    }
        
  }
fonction principale
void main(  )
{
    
    

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

Je suppose que tu aimes

Origine blog.csdn.net/qq_44078824/article/details/123689074
conseillé
Classement