「STM32入门」USART串口通信

通信

通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统

通信协议:制定通信的规则,通信双方按照协议规则进行数据收发

STM32常见的通信协议 

本文将介绍USART 

概念解释

  1. TX、RX分别是Transmit和Receive的缩写,代表发送、接受数据
  2. 全双工的含义是发送线路和接受线路互不影响,可以同时进行
  3. 异步指的是没有时钟线的通信,需要通信双方制定帧头帧尾,通信频率等参数
  4. 单端电平指的是通信双方的电压都是以GND为参考电压的,因此这两个设备需要共地
  5. 点对点指的是这个通信只支持两个设备间进行通信

硬件电路连接抽象图 

 

串口参数及时序 

⚠️  几个需要注意的点

  1. 第二张图D7的后一位是奇偶校验位
  2. 波特率决定了串口通信的速度,举个例子,如果波特率为1000bps,那么一秒就会传输1000个数据,每传输一个数据耗时1毫秒。
  3. 高电平作为空闲位,因此每当传输开始,发送方要先传送一个起始位,也就是低电平,告诉接受方我即将要传输数据了。传输结束后,要传输一个停止位恢复高电平。总结来说,就是TX引脚定时翻转电平,RX引脚定时读取电平,即可完成数据的传输。
  4. 数据位是低位先行,举个例子,比方说要传输一个0x0F的数据,将它转化为二进制就是00001111,那么传输的顺序应该是 1 1 1 1 0 0 0 0。

 USART外设简介

 USART基本结构图

当数据由数据寄存器TDR转到移位寄存器时,会置一个标志位TXE,我们判断这个标志位,就可以知道是不是可以开始写入下一个数据了。

接收部分也是类似的,在接受控制器的控制下,一位一位地移入接收移位寄存器,移完一帧数据后,数据就会统一转运到接收数据寄存器,并置一个RXNE的标志位,我们检查这个标志位,就可以知道是不是接收到数据了。同时这个标志位也可以申请中断,这样就可以在接收到数据时,直接进入中断函数,然后快速地读取和保存数据。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F103C8T6是一款由意法半导体(STMicroelectronics)生产的32位ARM Cortex-M3内核的微控制器。它是STM32F1系列中的一员,具有丰富的外设和强大的性能。以下是对STM32F103C8T6的介绍: 1. STM32F103C8T6的主要特性包括: - 32位ARM Cortex-M3内核,最高工作频率为72MHz。 - 64KB闪存和20KB SRAM。 - 多种外设,如GPIO、USART、SPI、I2C、ADC、定时器等。 - 支持多种通信接口,如UART、SPI、I2C等。 - 支持多种中断模式和低功耗模式。 2. 使用STM32F103C8T6进行串口通信的示例代码如下: ```c #include "stm32f10x.h" #include <stdio.h> void USART1_Init(void) { // 初始化GPIO和USART1 // ... // 配置波特率 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); // 使能USART1 USART_Cmd(USART1, ENABLE); } void USART1_SendChar(char ch) { // 发送一个字符 USART_SendData(USART1, (uint16_t)ch); // 等待发送完成 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); } int main(void) { // 初始化USART1 USART1_Init(); // 连续发送字符串 char *str = "hello windows!"; while (*str) { USART1_SendChar(*str++); } while (1) { // 循环执行其他任务 } } ``` 该代码通过USART1向上位机连续发送字符串"hello windows!"。 3. 使用STM32F103C8T6进行中断方式的开关点灯示例代码如下: ```c #include "stm32f10x.h" void GPIO_Init(void) { // 初始化GPIO // ... } void EXTI_Init(void) { // 初始化外部中断 // ... } void EXTI_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_LineX) != RESET) { // 处理中断事件 // ... // 清除中断标志位 EXTI_ClearITPendingBit(EXTI_LineX); } } int main(void) { // 初始化GPIO和外部中断 GPIO_Init(); EXTI_Init(); while (1) { // 循环执行其他任务 } } ``` 该代码通过外部中断实现了开关点灯的功能,具体的GPIO和中断配置需要根据实际情况进行设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UESTC_KS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值