打印
[其他ST产品]

STM32-串口通信(串口的接收和发送)

[复制链接]
楼主: 突然下起雨
手机看帖
扫描二维码
随时随地手机跟帖
21
突然下起雨|  楼主 | 2023-9-24 00:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
4. 串口使能

//串口使能
   USART_Cmd(USART2,ENABLE);

使用特权

评论回复
22
突然下起雨|  楼主 | 2023-9-24 00:56 | 只看该作者
5. 串口发送数据
注意哈,我们要判断TXE标志位的状态。0,数据还没有被转移到移位寄存器;1,数据已经被转移到移位寄存器。当TXE标志位为1时,就说明可以发送下一个数据了。详细过程可看上面串口发送的解释。

使用特权

评论回复
23
突然下起雨|  楼主 | 2023-9-24 00:57 | 只看该作者
void Serial_SendByte(uint16_t Byte)
{
        USART_SendData(USART2,Byte);
        //0 表示数据还未转移到移位寄存器 循环等待 1 数据已经被转移到了移位寄存器可以发送数据
        while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);  //不需要手动清零 再次写入TDR时会自动清零       
}

使用特权

评论回复
24
突然下起雨|  楼主 | 2023-9-24 00:57 | 只看该作者
经过上述五步的配置,单片机就可以通过串口发送数据了。

使用特权

评论回复
25
突然下起雨|  楼主 | 2023-9-24 00:57 | 只看该作者
下方为发送数据图例,STM32向串口发送0x16数据

使用特权

评论回复
26
突然下起雨|  楼主 | 2023-9-24 00:57 | 只看该作者
四、串口接收的两种实现方式
上方是发送数据的例子,那么串口接收又该如何配置,又要在串口发送的例子上做哪些更改呢?

这里我们可以通过查询或者中断的方式来进行接收数据的两种方式。

查询方式就是通过不断的查询RXNE标志位,通过判断RXNE位的状态来确定数据是否接收。
中断方式就是通过配置接收输出控制通道,配置NVIC,在中断服务子函数里进行数据的接收。

使用特权

评论回复
27
突然下起雨|  楼主 | 2023-9-24 00:58 | 只看该作者
1. 需要更改的地方
既然我们要实现串口的接收,那么就要配置串口RX引脚,在串口模式中添加USART_Mode_RX模式。

初始化RX引脚
//RX端
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  //上拉输入
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  //50MhZ
    GPIO_Init(GPIOA,&GPIO_InitStructure);
1
2
3
4
5
添加串口模式
USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;                           //TX 发送模式  RX 接收模式

使用特权

评论回复
28
突然下起雨|  楼主 | 2023-9-24 00:58 | 只看该作者
2. 查询RXNE标志位
这里我们还是来看一看RXNE标志位的描述



上图描述,为0时数据没有收到,为1时收到了数据,数据可以从RDR里读出

使用特权

评论回复
29
突然下起雨|  楼主 | 2023-9-24 00:58 | 只看该作者
所以在主程序里不断读取RXNE标志位,如果为1,表示数据可以读出
uint8_t RX_Data;
int main()
{
    Serial_Init();
    Serial_SendByte(0x16);
    while(1)
    {
        if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==SET)   //0 循环等待 1 可以接收数据
        {
            RX_Data=USART_ReceiveData(USART2);           
                        Serial_SendByte(RX_Data);
        }
    }
}

使用特权

评论回复
30
突然下起雨|  楼主 | 2023-9-24 00:58 | 只看该作者
下图为程序现象:pc向单片机发送数据0x15,单片机接收数据0x15,并且把接收到的数据作为数据发送到pc,在pc上显示0x15。

使用特权

评论回复
31
突然下起雨|  楼主 | 2023-9-24 00:59 | 只看该作者
3. 使用中断
通过配置串口的接收作为中断源,开启中断输出控制,配置NVIC。开启中断通道。
//开启中断输出控制
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
       
        //配置NVIC
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitTypeDef NVIC_InitStruct;
        NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn;   //选择USART2的中断通道
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;                //中断使能
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_InitStruct);

使用特权

评论回复
32
突然下起雨|  楼主 | 2023-9-24 00:59 | 只看该作者
中断服务子函数
中断服务子函数写好后,就可以在中断里读取接收到的数据了。
当接收到数据后,触发接收中断,主程序暂停执行。接收完数据后主程序回复执行。当接收到数据时,就触发中断。
void USART2_IRQHandler(void)
{
        if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)   //RXNE 标志位为1 表示可以接收数据
        {
                RX_Data=USART_ReceiveData(USART2);
                Flag=1;
                USART_ClearITPendingBit(USART2,USART_IT_RXNE);  //清除RXNE标志位
        }
}

使用特权

评论回复
33
突然下起雨|  楼主 | 2023-9-24 00:59 | 只看该作者
主程序测试
uint8_t RX_Data;
uint8_t Flag;

int main()
{
    Serial_Init();
    Serial_SendByte(0x16);


    while(1)
    {
        if(Flag==1)
        {
            Serial_SendByte(RX_Data);
        }
    }
}

void USART2_IRQHandler(void)
{
    if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)   //RXNE 标志位为1 表示可以接收数据
    {
        RX_Data=USART_ReceiveData(USART2);
        Flag=1;
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);  //清除RXNE标志位
    }
}

使用特权

评论回复
34
突然下起雨|  楼主 | 2023-9-24 00:59 | 只看该作者
下图为程序现象:可以看到,串口确实收到了数据,只是我把接收到的数据0xFE放在了while循环里,这说明数据接收是成功的,使用中断是可行的。

使用特权

评论回复
35
突然下起雨|  楼主 | 2023-9-24 01:00 | 只看该作者
总结
到这里,就大致总结了串口的发送和接收。

串口的配置,使用查询或者中断来接收数据。

串口的使用会很常用到,所以在这里对串口做一个总结,也算是对之前知识的一个回顾和总结,加强印象。

如果有什么写的不对的地方,欢迎指正!

使用特权

评论回复
36
Pulitzer| | 2024-2-17 07:30 | 只看该作者

需要靠近在外部添加一个钳位二极管

使用特权

评论回复
37
童雨竹| | 2024-2-17 09:26 | 只看该作者

ESD电压通过接地放掉

使用特权

评论回复
38
Wordsworth| | 2024-2-17 10:29 | 只看该作者

电阻消耗过电压的能量

使用特权

评论回复
39
公羊子丹| | 2024-2-17 12:25 | 只看该作者

当电路正常工作时,它处于截止状态(高阻态)

使用特权

评论回复
40
万图| | 2024-2-17 13:28 | 只看该作者

在信号线中串联小电阻其主要目的是对引脚的保护

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则