UART串口通讯

1.需求

在实现生活中,往往不是单独工作的,需要与别人进行合作,这就需要交流,以传达信息。在FPGA中,个个芯片之间也是相对独立的,要想协同一起工作,双方之间的通讯是必不可少的。

2.问题

  1. 何时发送数据: 什么时候开始,我知道你开始发送数据
  2. 何时结束发送: 什么时候开始,我知道你已经结束数据的发送了
  3. 该怎样接受数据: 接受到的数据我该怎样进行存储

3. 协议

UART一共用4根线,分别是数据发送线,数据接收线,VCC,GND,从这4根线上来看,没有时钟线,所以需要规定数据发送结束的速率,即波特率要一致,同时可以看到发送数据线和接收数据线是分开的,所以发送和接收是可以同时进行的。

  1. 空闲态:当两段都没有数据发送的时候,为空闲态,此时规定数据发送线和数据接收线上的电平均为高电平
  2. 开始发送数据态:拉低数据发送线一个周期,表示数据准备开始发送了,这时注意并没有发生数据,只是表示我要发送数据了,你要准备开始接收了
  3. 数据发送态:在开始发送数据态结束后,后面的八个时钟周期每一个时钟发送一个数据位,先发送数据的低位,然后发送数据的高位
  4. 结束数据发送:在数据发送态完成后,接下来的1、1.5、2个时钟周期为停止位,此时拉高数据发送线
  5. 校验位暂不考虑
    ps: 上面所说的时钟周期,不是系统的时钟周期,而且两边规定好的波特率的时钟周期,这个要注意下;上面主要说明了一下数据发送的过程,由数据发送的过程来推数据接收的过程并不困难。
    串口时序图

然后这个是8位的,然后想变成16位的,可以在此模块上面在加一个top模块,接收了两个数据给一个应答。

最后给一个下载链接,(*^▽^*)UART发送接收 verilog实现

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您提供基于Arduino的ESP32CAM和基于Keil5的STM32之间进行UART串口通讯的代码。 ESP32CAM代码: ``` #include <HardwareSerial.h> HardwareSerial Serial2(2); void setup() { Serial.begin(115200); Serial2.begin(115200, SERIAL_8N1, 16, 17); } void loop() { String message = "Hello STM32!"; Serial.print("Sending message: "); Serial.println(message); Serial2.println(message); if (Serial2.available() > 0) { String receivedMessage = Serial2.readString(); Serial.print("Received message: "); Serial.println(receivedMessage); } delay(1000); } ``` STM32代码: ``` #include "stm32f4xx.h" #include <stdio.h> #include <string.h> USART_InitTypeDef USART_InitStructure; void init_USART1(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); USART_InitStructure.USART_BaudRate = 115200; 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_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } void sendString(char* str){ while(*str){ while(USART_GetFlagStatus(USART1, USART_FLAG_TDRE) == RESET); USART_SendData(USART1, *str++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); } } void main() { init_USART1(); while (1) { if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) { char receivedChar = USART_ReceiveData(USART1); if (receivedChar == '\n') { sendString("Received message: "); } while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, receivedChar); } } } ``` 这些代码可能需要根据您的具体需求进行调整,但是它们应该可以让ESP32CAM和STM32之间进行UART串口通讯。如果您有任何问题,请随时向我提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FPGA之旅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值