6. Connaissances de base et mise en œuvre du code de la communication série

Présentation de trois
Insérez la description de l'image ici
ports série différents Le déroulement de la configuration de la communication série:

  1. Déterminez l'horloge principale et entrez l'initialisation du port série.
    À ce stade, si l'horloge sur puce HSI est sélectionnée, il peut y avoir des erreurs et la précision du HSE peut être meilleure.
  2. Définir le nombre de bits de données envoyés
  3. Définissez le chiffre de contrôle et la méthode de contrôle des données envoyées
  4. Définir le nombre de bits d'arrêt pour l'envoi de données
  5. Définir le débit en bauds d'envoi de données
  6. Activer la fonction d'interruption d'envoi
    Cette étape peut également être interrogée directement, pas besoin d'activer l'interruption, il y a une fonction de service d'interruption en cas d'interruption
  7. Activer la fonction d'envoi
  8. L'envoi de données à un octet
    peut être redirigé, il suffit de réécrire les fonctions associées
  9. En attente d'envoi

Les principaux registres:
Insérez la description de l'image ici

  • La structure du cadre est la suivante
    Insérez la description de l'image ici

  • Comment configurer les bits de données (la deuxième partie de la structure de trame)
    Insérez la description de l'image ici

  • Comment configurer le bit de contrôle (la troisième partie de la structure de trame)
    Insérez la description de l'image ici
    bit de contrôle et description du format de trame de données
    Insérez la description de l'image ici

  UART1_CR1 = 0x00;
  //**************************************************
  //展开UART1_CR1赋值二进制数值为:0000 0000 
  //含义:R8=0;    接收数据位不存在第9位
  //      T8=0;    发送数据位不存在第9位
  //      UARTD=0; 使能UART功能
  //      M=0;     一个起始位,8个数据位,n个停止位
  //                n取决于UART1_CR3中的STOP[1:0]位
  //      WAKE=0;   UART被空闲总线唤醒
  //      PCEN=0: (UART模式)奇偶校验控制被禁止
  //      PS=0;    偶校验(校验功能未启用)
  //      PIEN=0;  校验中断被禁止
  //*************************************************
  • Comment définir le bit d'arrêt (la troisième partie de la structure de trame)
    Insérez la description de l'image ici
  UART1_CR3 = 0x00;
  //**************************************************
  //展开UART1_CR3赋值二进制数值为:0000 0000 
  //含义:保留位=0;必须保持清零
  //      LINEN=0;LIN模式被禁止
  //      STOP=00;配置为“00”,1个停止位
  //      CLKEN、CPOL、CPHA、LBCL这几位在UART3上不存在
  //*************************************************
  • Comment régler le débit en bauds
    Insérez la description de l'image ici
    Insérez la description de l'image ici
    Remarque: Les deux bits du registre BRR1 ne peuvent pas être 0 en même temps et la valeur attribuée ne peut pas être inférieure à 16 (0x000f), sinon le port série ne peut pas être utilisé et le débit en bauds devient invalide
  //配置通信波特率参数,此处配置为9600bps(16MHz频率下)
  UART1_BRR2 = 0x03;
  UART1_BRR1 = 0x68;
  • Activer le paramètre de bit
    Insérez la description de l'image ici
  //使能发送和接收功能
  UART1_CR2 = 0x0C;
  //**************************************************
  //展开UART1_CR2赋值二进制数值为:0000 1100 
  //含义:TIEN=0;发送中断被禁止
  //     TCIEN=0;发送中断完成被禁止
  //      RIEN=0;接收中断被禁止
  //      ILIEN=0;IDLE中断被禁止
  //      TEN=1;发送功能使能
  //      REN=1;接收功能使能
  //      RWU=0;(UART模式)正常工作模式
  //      SBK=0;未发送断开字符
  //*************************************************
}
  • Registre d'état (utilise principalement TXE, TC, PE trois bits)Insérez la description de l'image iciInsérez la description de l'image ici
    Insérez la description de l'image ici
    Insérez la description de l'image ici

Deux façons d'envoyer des données:

  • Le premier: utilisez le décalage du pointeur pour sortir en continu la chaîne
/****************************************************************/
//发送单字符函数UART1_SendByte(),有形参data,无返回值
/****************************************************************/
void UART1_SendByte(u8 data)
{
   UART1_SR&=0xBF;//清零发送完成标志位TC
   UART1_DR=data;//发送数据到UART1数据寄存器
   //while (!(UART1_SR & 0x80));//【旧版语句,有瑕疵】等待发送完毕
   //原来的语句是&上了0x80,其实是判断了TXE位,这种方法不严谨,因为
   //发送数据寄存器空不一定说明发送已经完成了,应该判断TC位才正确
   while (!(UART1_SR & 0x40));//【新版语句,推荐】等待发送完毕
   UART1_SR&=0xBF;//清零发送完成标志位TC
}

/****************************************************************/
//发送字符串函数UART1_SendString(),有1个形参Data,无返回值
/****************************************************************/
void UART1_SendString(u8* Data)
{
  while(*Data!='\0')//判断字符串结束标志
  {
    UART1_SendByte(*Data);//把字符串拆分为多个单字节发送动作
    Data++;//指针后移,不断指向新的字符
  }
}

u8 table1[]="************************************************************\r\n";

  UART1_SendString(table1);//发送字符串1
  //UART1_SendByte(0x0D);//回车符号
  //UART1_SendByte(0x0A);//换行符号
  • La seconde: redéfinir la fonction putchar, afin que les données puissent être directement sorties sur le port série dans printf
/****************************************************************/
//发送单字符函数UART1_SendByte(),有形参data,无返回值
/****************************************************************/
void UART1_SendByte(u8 data)
{
   UART1_SR&=0xBF;//清零发送完成标志位TC
   UART1_DR=data;//发送数据到UART1数据寄存器
   //while (!(UART1_SR & 0x80));//【旧版语句,有瑕疵】等待发送完毕
   //原来的语句是&上了0x80,其实是判断了TXE位,这种方法不严谨,因为
   //发送数据寄存器空不一定说明发送已经完成了,应该判断TC位才正确
   while (!(UART1_SR & 0x40));//【新版语句,推荐】等待发送完毕
   UART1_SR&=0xBF;//清零发送完成标志位TC
}

/****************************************************************/
//发送字符重定向函数putchar(),有形参ch,有返回值
/****************************************************************/
int putchar(int ch) 
{ 
  UART1_SendByte((u8)ch);//将Printf内容发往串口
  return (ch); 
}

  printf("************************************************************\r\n");

On peut voir que la deuxième méthode est plus pratique et que les deux méthodes peuvent produire des informations.
Insérez la description de l'image ici

  • Comment recevoir des données
/****************************************************************/
//接收单字符函数UART1_ReceiveByte(),无形参data,有返回值,返回接收到的数据
//采用查询的方法实现
/****************************************************************/
u8 UART1_ReceiveByte(void)
{
 // printf("进入UART1_ReceiveByte函数...\r\n");
  
  u8 UART1_RX_BUF;                //定义接收数据暂存变量
  while (!(UART1_SR & 0x20));    //等待接收标志
  UART1_SR&=0xDF;                //清零接收标志位RXNE
  UART1_RX_BUF=UART1_DR;         //取回接收到的数据
 // printf("取回接收到的数据\r\n");
  
  return  UART1_RX_BUF;         //返回暂存变量中的数据给调用者
}

code montrer comme ci-dessous:


/****************************************************************/
//初始化函数UART1_Init(),无形参和返回值
/****************************************************************/
void UART1_Init(void)
{
  //1.设定通信数据位数,此处设定为8位数据位,无校验位
  UART1_CR1 = 0x00;
  //**************************************************
  //展开UART1_CR1赋值二进制数值为:0000 0000 
  //含义:R8=0;    接收数据位不存在第9位
  //      T8=0;    发送数据位不存在第9位
  //      UARTD=0; 使能UART功能
  //      M=0;     一个起始位,8个数据位,n个停止位
  //                n取决于UART1_CR3中的STOP[1:0]位
  //      WAKE=0;   UART被空闲总线唤醒
  //      PCEN=0: (UART模式)奇偶校验控制被禁止
  //      PS=0;    偶校验(校验功能未启用)
  //      PIEN=0;  校验中断被禁止
  //*************************************************
  //2.设定通信停止位位数,此处设定为1位停止位
  UART1_CR3 = 0x00;
  //**************************************************
  //展开UART1_CR3赋值二进制数值为:0000 0000 
  //含义:保留位=0;必须保持清零
  //      LINEN=0;LIN模式被禁止
  //      STOP=00;配置为“00”,1个停止位
  //      CLKEN、CPOL、CPHA、LBCL这几位在UART3上不存在
  //*************************************************
  //3.配置通信波特率参数,此处配置为9600bps(16MHz频率下)
  UART1_BRR2 = 0x03;
  UART1_BRR1 = 0x68;
  //4.使能发送和接收功能
//  UART1_CR2 = 0x0C;
  UART1_CR2 = 0x2C;
  //**************************************************
  //展开UART1_CR2赋值二进制数值为:0010 1100 
  //含义:TIEN=0;发送中断被禁止
  //     TCIEN=0;发送中断完成被禁止
  //      RIEN=1;接收中断开启
  //      ILIEN=0;IDLE中断被禁止
  //      TEN=1;发送功能使能
  //      REN=1;接收功能使能
  //      RWU=0;(UART模式)正常工作模式
  //      PIEN=0;未发送断开字符
  //*************************************************
}

//测试代码
void UART1_Module(void)
{
   u8 databuf[] = "****************************************\n";
   UART1_SendString(databuf);
   printf("Clichong\n");
   UART1_SendString(databuf);
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44751294/article/details/110677083
conseillé
Classement