USART简介

USART前置:

  • 发送接送 双工:可发送,可接送 单工:仅支持发送与接送的一种 全双工:同时进行发送与接收 半双工:同一时刻进行发送或者接收

  • 同步异步 同步:时钟 异步:波特率

  • 电平特性 单端信号:引脚高低电平相对于GND 差分信号:俩引脚电压差

  • 电平标准 定义:数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系 标准: TTL电平:+3.3V或+5V表示1,0V表示0 RS232电平:-3~-15V表示1,+3~+15表示0 RS485电平:俩线压差+2~+6V表示1,-2~-6V表示0 注意 RS485电平标准是差分信号,抗干扰能力强,信号传输距离远,可达上千米 TTL电平,RS232电平标准,信号最远只能几十米

  • 串口助手 HEX发送与显示 字符发送与显示 GBK UTF-8发送与显示(--no-multibyte-chars) 注意 字符 通过ASCII码表 对应16进制数 字 通过GBK UTF-8表 对应16进制数 GBK发送还是UTF-8发送,取决于IDE的编码格式

USART定义: 根据发送数据寄存器的一个字节的数据自动生成数据帧格式,通过发送移位寄存器从TX引脚发送出去;自动接收移位寄存器内的数据帧时序,拼接成一个字节数据,存放在接送数据寄存器中 注意 接收数据寄存器只能保存一个字节的数据,生产者产生数据太快,消费者来不及消费,就会导致中断阻塞,并且丢数据的情况

USART:

  • 波特率 决定传输一位的时间

  • 单字节协议帧格式: 起始 单字节数据 停止

  • 时序 TX/RX:起始:产生一个下降沿 数据传输:高低电平翻转 停止:产生一个上升沿 注意 TX时序单片机控制 RX时序外挂模块控制

  • stm32f103c8t6资源 USART1 USART2 USART3

  • 数据的传输 低位先行

  • 通信速率 USART1:4.5Mbps APB2=72M,波特率分频得到

USART函数

USART初始化函数:

  • 函数使用: 函数:USART_Init 入参:USART 结构体指针 返回值:无

  • USART_InitTypedef结构体成员变量

  • 函数调用示例

USART使能函数:

  • 函数使用: 函数:USART_Cmd 入参: USART ENABLE / DISABLE 返回值:无

  • 函数调用示例

USART_Cmd(USART1, ENABLE);

USART发送单字节数据函数:

  • 函数使用: 函数:USART_SendData 入参:USART 单字节数据 返回值:无

  • 函数调用示例

uint8_t a = 0x88;
USART_SendData(USART1, a);

注意 写入DR,硬件自动清除TXE标志位

USART接收单字节数据函数:

  • 函数使用: 函数:USART_ReceiveData 入参:USART 返回值:单字节数据

  • 函数调用示例

uint8_t data = USART_ReceiveData(USART1);

注意 读出DR,硬件自动清除RXNE标志位

USART中断配置函数:

  • 函数使用: 函数:USART_ITConfig 入参:USART 中断标志位 ENABLE/DISABLE 返回值:

  • 函数调用示例

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);          //开启串口接收数据的中断

USART标志位:

USART发送模块函数

Serial_Init:

RCC_APB2PeriphClockCmd
RCC_APB2PeriphClockCmd
    
GPIO_Init
    
USART_Init  
USART_Cmd

void Serial_SendArray(uint8_t *arr, uint16_t length)

//串口发送数组
void Serial_SendArray(uint8_t *arr, uint16_t length)
{
    for(uint16_t i = 0; i < length; i++)
    {
        USART_SendData(USART1, arr[i]);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE));
    }
}

void Serial_SendString(char *str)

//串口发送字符串
void Serial_SendString(char *str)
{
    while(*str != '\0')
    {
        USART_SendData(USART1, *str);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE));
        str++;
    }
}

printf重定向:

int fputc(int ch, FILE *f)
{
    USART_SendData(USART1, ch);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE));
    return ch;
}

USART接收模块函数

void Serial_Init(void)

RCC_APB2PeriphClockCmd
RCC_APB2PeriphClockCmd

GPIO_Init				//将PA9引脚初始化为复用推挽输出
GPIO_Init				//将PA10引脚初始化为上拉输入

USART_Init
USART_ITConfig

NVIC_PriorityGroupConfig
NVIC_Init

USART_Cmd

串口接收中断服务函数:

void USART1_IRQHandler(void)
{
    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)        
    {
        //操作
    }   USART_ClearITPendingBit(USART1, USART_IT_RXNE);         
}
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐