stm32f407VET6 系统学习 day03 通用同步异步收发器

1.同步串行通信

同步通信发送端和接收端必须用 共同的时钟源 才能保持它们之间的准确同步。同步传输时,每个字

符没有起始位和停止位,它不是用起始位来标志字符的开始,而是用一串特定的二进制序列,称为

同步字符,去通知接收器串行数据的第一位何时到达。然后,串行数据信息以连续的形式发送,每

个时钟周期发送1位数据。接收器搜索到同步字符后,才开始接收数据位。因此,同步传输时数据成

批连续发送,信息字符间不留空隙,它严格按照约定的速率发送和接收。(I2C,SPi)

2.异步串行通信

异步串行通信是指串口的发送与接收设备使用 各自的时钟 控制数据的发送和接收过程,以字符为数

据传输单位,字符之间可以有间隔。需要开始位和停止位确定发送数据的开始和结束。为使双方的

收发协调,要求发送和接收设备的串口工作时钟频率要尽可能一致.

3.常见通信协议

stm32f407VET6 系统学习 day03 通用同步异步收发器

4. 串口电路连接

stm32f407VET6 系统学习 day03 通用同步异步收发器

stm32f407VET6 系统学习 day03 通用同步异步收发器

波特率 一般是115200

stm32f407VET6 系统学习 day03 通用同步异步收发器

stm32f407VET6 系统学习 day03 通用同步异步收发器

8.串口编程(初始化) stm32f407VET6 系统学习 day03 通用同步异步收发器

9.串口编程(收发数据) stm32f407VET6 系统学习 day03 通用同步异步收发器

代码:

#include "myusart.h"
#include "stm32f4xx_usart.h"
#include "stm32f4xx_gpio.h"
#include "stdio.h"
u8 USART_RX_BUF[USART_REC_LEN];
u16 USART_RX_STA = 0;  //接受完成的标志

#pragma import(__use_no_semihosting)
//标准库需要的支持函数

struct __FILE
{
    int handle;
};

FILE __stdout;
//定义_sys_exit()以避免使用半主机模式

void _sys_exit(int x)
{
    x=x;
}

int fputc(int ch,FILE *f)
{
    #if 0
    while( (USART1->SR&(1<<6))==0 ); 发送未完成等待 usart1->DR = (unsigned char)ch;  //&#x53D1;&#x9001;&#x5B8C;&#x6210;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x5411;DR&#x5199;&#x5165;&#x4E0B;&#x4E00;&#x4E2A;&#x5F85;&#x53D1;&#x9001;&#x7684;&#x6570;&#x636E;
    return ch;
    #else
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
    USART_SendData(USART1,(unsigned char)ch);
    return ch;
    #endif
}

int fgetc(FILE *f)
{
    #if 0
    while((USART1->SR&(1<<5)) =="0);" 数据寄存器非空(即:接收到数据),那么跳出循环,否则一直等待 return((int)(usart1->DR&0xff));      //&#x63A5;&#x6536;&#x5B8C;&#x6210;&#xFF0C;&#x8BFB;&#x53D6;&#x6570;&#x636E;&#x3002;
    #else
    while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);
    return((int)(USART_ReceiveData(USART1)));
    #endif
}

void myusart_init(int  usart_btl)
{
    //&#x7B2C;&#x4E00;&#x6B65;&#xFF1A;&#x51C6;&#x5907;&#x4E09;&#x4E2A;&#x7ED3;&#x6784;&#x4F53;
    USART_InitTypeDef USART_InitStruct;  // &#x4E32;&#x53E3;&#x901A;&#x4FE1;
    NVIC_InitTypeDef NVIC_InitStruct ;   // &#x4E2D;&#x65AD;&#x5BC4;&#x5B58;&#x5668;NVIC
    GPIO_InitTypeDef GPIO_InitStruct;   //GPIO&#x8BBE;&#x7F6E;&#x7ED3;&#x6784;&#x4F53;

    //&#x7B2C;&#x4E8C;&#x6B65;&#xFF1A; &#x65F6;&#x949F;&#x4F7F;&#x80FD;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //&#x4E32;&#x53E3;&#x65F6;&#x949F;&#x4F7F;&#x80FD;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //GPIO&#x53E3;&#x65F6;&#x949F;&#x4F7F;&#x80FD;

    //&#x7B2C;&#x4E09;&#x6B65;&#xFF1A; &#x8BBE;&#x7F6E;&#x7AEF;&#x53E3;&#x590D;&#x7528;
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_USART1);
    //&#x628A;A&#x7EC4;&#x4E2D;&#x7684;10&#x5F15;&#x811A;&#x8BBE;&#x7F6E;&#x6210;&#x4E32;&#x53E3;1&#x6A21;&#x5F0F;&#xFF08;&#x590D;&#x7528;&#xFF09;
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_USART1);
    //
    //&#x7B2C;&#x56DB;&#x6B65;&#xFF1A; &#x8BBE;&#x7F6E;GPIO&#x53E3;&#x7684;&#x6A21;&#x5F0F;  &#xFF08;PA9 --TXD   PA10 ---RXD&#xFF09;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF ; //&#x590D;&#x7528;&#x529F;&#x80FD;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOA ,&GPIO_InitStruct);
    GPIO_SetBits(GPIOA,GPIO_Pin_9);

    /*GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init( GPIOA ,&GPIO_InitStruct);*/

    // &#x7B2C;&#x4E94;&#x6B65;&#xFF1A; &#x8BBE;&#x7F6E;usart&#x5BC4;&#x5B58;&#x5668;
    USART_InitStruct.USART_BaudRate = usart_btl;  // &#x6CE2;&#x7279;&#x7387;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // &#x786C;&#x4EF6;&#x6D41;
    USART_InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;  //&#x5141;&#x8BB8;&#x63A5;&#x53D7;&#x548C;&#x53D1;&#x9001;
    USART_InitStruct.USART_Parity = USART_Parity_No; // &#x5947;&#x5076;&#x6821;&#x9A8C;&#x4F4D;&#xFF08;&#x65E0;&#xFF09;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;  //&#x505C;&#x6B62;&#x4F4D; &#xFF08;1&#x4F4D;&#xFF09;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b; // &#x5B57;&#x957F; &#xFF08;8&#x4F4D;&#xFF09;
    USART_Init(USART1,&USART_InitStruct);

    //&#x7B2C;&#x516D;&#x6B65;&#xFF1A; &#x8BBE;&#x7F6E;&#x4E2D;&#x65AD;&#x5BC4;&#x5B58;&#x5668;
    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;   // &#x4E2D;&#x65AD;&#x53F7;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;    //&#x7EC8;&#x7AEF;&#x53F7;&#x4F7F;&#x80FD;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //&#x62A2;&#x5360;&#x4F18;&#x5148;&#x7EA7;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; // &#x54CD;&#x5E94;&#x4F18;&#x5148;&#x7EA7;
    NVIC_Init(&NVIC_InitStruct);

    //&#x7B2C;&#x4E03;&#x6B65;&#xFF1A; &#x8BBE;&#x7F6E;&#x63A5;&#x6536;&#x4E2D;&#x65AD;&#x4F7F;&#x80FD;   &#x8BBE;&#x7F6E;&#x4E32;&#x53E3;&#x4F7F;&#x80FD;
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //&#x63A5;&#x6536;&#x6570;&#x636E;&#x4E2D;&#x65AD;
    USART_Cmd(USART1,ENABLE);

}

//&#x53D1;&#x9001;&#x6570;&#x636E; aabcdef\r\n
//&#x4E32;&#x53E3;1&#x4E2D;&#x65AD;&#x670D;&#x52A1;&#x7A0B;&#x5E8F;
u8 count = 0;
void USART1_IRQHandler(void)    /&#x4E32;&#x53E3;&#x63A5;&#x6536;&#x6570;&#x636E;&#x7684;&#x4E2D;&#x65AD;
{

    u8 Res;
     //&#x63A5;&#x6536;&#x4E2D;&#x65AD;(&#x63A5;&#x6536;&#x5230;&#x7684;&#x6570;&#x636E;&#x5FC5;&#x987B;&#x662F;0x0d 0x0a&#x7ED3;&#x5C3E;)
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        Res =USART_ReceiveData(USART1);//(USART1->DR);  //&#x8BFB;&#x53D6;&#x63A5;&#x6536;&#x5230;&#x7684;&#x6570;&#x636E;

        if((USART_RX_STA&0x8000)==0)//&#x63A5;&#x6536;&#x672A;&#x5B8C;&#x6210;
        {
            if(USART_RX_STA&0x4000)//&#x63A5;&#x6536;&#x5230;&#x4E86;0x0d   0100 0000 0000 0000
            {
                if(Res!='\n')USART_RX_STA=0;//&#x63A5;&#x6536;&#x9519;&#x8BEF;,&#x91CD;&#x65B0;&#x5F00;&#x59CB;
                else USART_RX_STA|=0x8000;  //&#x63A5;&#x6536;&#x5B8C;&#x6210;&#x4E86;
            }
            else //&#x8FD8;&#x6CA1;&#x6536;&#x5230;&#x2018;\r&#x2019;
            {
                if(Res=='\r')USART_RX_STA|=0x4000;   //USART_RX_STA = 1100 0000 0000 0000
                else            //USART_RX_BUF[0] = 'd';  USART_RX_BUF[1] = 'a';..  USART_RX_BUF[4] = 'y'
                {
                    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;        // danny\r\n
                    USART_RX_STA++;
                    //&#x63A5;&#x6536;&#x6570;&#x636E;&#x9519;&#x8BEF;,&#x91CD;&#x65B0;&#x5F00;&#x59CB;&#x63A5;&#x6536;
                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
                }
            }
        }
  }
}

//&#x8FDB;&#x884C;&#x4E32;&#x53E3;&#x901A;&#x4FE1;&#xFF0C;&#x5F53;&#x7528;&#x6237;&#x53D1;&#x9001;01+02  &#x4E32;&#x53E3;&#x63A5;&#x53D7;&#x5230;&#x540E; &#x53D1;&#x9001;03 &#x7ED9;&#x5230;pc

/*
//main.c

SysTick_init(168);

    //&#x4E2D;&#x65AD;&#x5206;&#x7EC4;
    u16 len = 0;
    int i = 0;
    SysTick_init(168);//&#x521D;&#x59CB;&#x5316;&#x5EF6;&#x65F6;&#x51FD;&#x6570;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    myusart_init(115200);

   while(1)
    {
        //&#x6570;&#x636E;&#x63A5;&#x6536;&#x5B8C;&#x6210;
        if(USART_RX_STA&0x8000)
        {
            len=USART_RX_STA&0x3fff;//&#x5F97;&#x5230;&#x6B64;&#x6B21;&#x63A5;&#x6536;&#x5230;&#x7684;&#x6570;&#x636E;&#x957F;&#x5EA6;
            for(i=0;i<len;i++) { usart_senddata(usart1, usart_rx_buf[i]); 等待发送结束 while(usart_getflagstatus(usart1,usart_flag_tc)!="SET);" } if(len="=" 5) if(usart_rx_buf[2]="=43)" int a1="((int)(USART_RX_BUF[0]" -48)*10 )+ (int)(usart_rx_buf[1] -48); a2="((int)(USART_RX_BUF[3]" (int)(usart_rx_buf[4] a3="a1+a2;" if(a3<10) printf("="0%d" \r\n",a3); else usart_rx_sta="0;" * < code></len;i++)></5))></6))==0>

Original: https://blog.csdn.net/she666666/article/details/128431268
Author: _She001
Title: stm32f407VET6 系统学习 day03 通用同步异步收发器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/788318/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球