【STM32CubeMX】F103&串口通信_stm32f103 cubemx 串口fifo

前言

本文记录下我学习STM32CubeMX时的流程,系统板是基于STM32F103C6T6,方便以后回忆。本章记录串口通信。这里居然有玄学问题,给我整了好久,头都大了。可能也是我能力有限才有的吧,泪目。

目录

  • 串口通信

串口通信

  1. STM32CubeMX中的串口配置,配置完后就可以生成了。

在这里插入图片描述
在这里插入图片描述
2. Keil5中打开生成的工程文件。写下发送函数,发送测试。

uint8\_t send_str1[] = "hello world\r\n";	//这个在开头定义,所以说截图中没看到。
//&huart1 为串口1 , send\_str1 为要发送的数据 , sizeof(send\_str1) 为要发送的数据的长度 , 1000 为设置超时时间
HAL\_UART\_Transmit(&huart1,send_str1,sizeof(send_str1),1000);	//堵塞模式发送,超时时间1000ms
//关于&huart1这个名称,在串口端口初始化函数原型上已有它的名称结构在声明了,所以说要是换串口后,不知道名称,也可以跳转去看。

在这里插入图片描述

stm32f1xx_hal_uart.h文件中,串口操作相关函数。在725行位置处。

* 堵塞模式,传输函数将会阻塞,一直等待缓冲区可用时再传输数据,如果超过了超时时间,缓冲区在一定时间内无法发送数据时,传输函数将会超时退出。
* 非堵塞模式,则与上述相反,没有超时时间的概念,有数据就收发,不存在数据传输等待。
//堵塞模式发送 
HAL_StatusTypeDef HAL\_UART\_Transmit(UART_HandleTypeDef \*huart, uint8\_t \*pData, uint16\_t Size, uint32\_t Timeout);
//堵塞模式接收
HAL_StatusTypeDef HAL\_UART\_Receive(UART_HandleTypeDef \*huart, uint8\_t \*pData, uint16\_t Size, uint32\_t Timeout);
//非堵塞模式发送
HAL_StatusTypeDef HAL\_UART\_Transmit\_IT(UART_HandleTypeDef \*huart, uint8\_t \*pData, uint16\_t Size);
//非堵塞模式接收
HAL_StatusTypeDef HAL\_UART\_Receive\_IT(UART_HandleTypeDef \*huart, uint8\_t \*pData, uint16\_t Size);

  1. 接收测试

接收测试的思路本来是想在接受完后,用发送函数发给串口调试助手。

1. 测试方法一,在主函数中加入下述代码。现象,接收函数一直响应,不管有无数据。而且就算有数据它也会一直重复响应那一串数据,我想可能是中断标志或者数据缓冲区没清除干净,但是试了各种方法后到不行,挺奇怪的。
if(HAL\_UART\_Receive(&huart1,rece_str1,16,100))
{
    HAL\_UART\_Transmit(&huart1,rece_str1,sizeof(send_str1),1);
    //memset(send\_str1, 0, sizeof(send\_str1));
}

在这里插入图片描述

2. 测试方法二,在主函数中加入下述代码。现象,莫名的卡顿感,怎么个卡顿呢,就是在必须要在规定的超时时间内收到规定长度的字节长度否正就丢弃(这是我后来才发现的,具体测试三说),把接收时间缩短或者换非堵塞模式又收不到。虽然说总感觉是接收函数出了问题,但是还是没头绪。

 
```
if(RESET != \_\_HAL\_UART\_GET\_FLAG(&huart1, UART_FLAG_IDLE))   //判断是否是空闲中断
{
    HAL\_UART\_Receive(&huart1,rece_str1,16,2000);
    HAL\_UART\_Transmit(&huart1,rece_str1,sizeof(send_str1),2000);
    memset(rece_str1,0,16);                                 //清空缓冲区
    \_\_HAL\_UART\_CLEAR\_IDLEFLAG(&huart1);                     //清除空闲中断标志(否则会一直不断进入中断)
}

```

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

s://bbs.csdn.net/topics/618654289)

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于STM32CubeMX FDCAN回环通信,您需要进行以下步骤: 1. 在STM32CubeMX中配置FDCAN模块,并启用回环模式。 2. 在代码中初始化FDCAN,并设置回环模式。 3. 使用FDCAN发送数据,并在接收到数据后进行处理。 以下是一个简单的示例代码,用于在FDCAN1上进行回环通信: ``` #include "main.h" #include "stm32h7xx_hal.h" FDCAN_HandleTypeDef hfdcan1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_FDCAN1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_FDCAN1_Init(); uint8_t tx_data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; uint8_t rx_data[8]; FDCAN_TxHeaderTypeDef tx_header; tx_header.Identifier = 0x123; tx_header.IdType = FDCAN_STANDARD_ID; tx_header.TxFrameType = FDCAN_DATA_FRAME; tx_header.DataLength = FDCAN_DLC_BYTES_8; tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE; tx_header.BitRateSwitch = FDCAN_BRS_OFF; tx_header.FDFormat = FDCAN_CLASSIC_CAN; tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS; tx_header.MessageMarker = 0; while (1) { HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &tx_header, tx_data); HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &rx_header, rx_data); } } void MX_FDCAN1_Init(void) { hfdcan1.Instance = FDCAN1; hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; hfdcan1.Init.AutoRetransmission = ENABLE; hfdcan1.Init.TransmitPause = DISABLE; hfdcan1.Init.ProtocolException = DISABLE; hfdcan1.Init.NominalPrescaler = 1; hfdcan1.Init.NominalSyncJumpWidth = 1; hfdcan1.Init.NominalTimeSeg1 = 6; hfdcan1.Init.NominalTimeSeg2 = 3; hfdcan1.Init.DataPrescaler = 1; hfdcan1.Init.DataSyncJumpWidth = 1; hfdcan1.Init.DataTimeSeg1 = 6; hfdcan1.Init.DataTimeSeg2 = 3; hfdcan1.Init.StdFiltersNbr = 0; hfdcan1.Init.ExtFiltersNbr = 0; hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; hfdcan1.Init.TxFifoQueueSize = 8; hfdcan1.Init.RxFifo0ElmtsNbr = 8; hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8; hfdcan1.Init.RxFifo1ElmtsNbr = 0; hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8; hfdcan1.Init.RxBuffersNbr = 0; hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8; if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) { Error_Handler(); } FDCAN_FilterTypeDef filter; filter.IdType = FDCAN_STANDARD_ID; filter.FilterIndex = 0; filter.FilterType = FDCAN_FILTER_MASK; filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; filter.FilterID1 = 0x7FF; filter.FilterID2 = 0x7FF; HAL_FDCAN_ConfigFilter(&hfdcan1, &filter); } void Error_Handler(void) { } void SystemClock_Config(void) { } static void MX_GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); } FDCAN_RxHeaderTypeDef rx_header; ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值