STM32H743+CubeMX-学习FDCAN控制器上的TxFIFO

一.TxFIFO设为1所带来的问题

在STM32F103,STM32F407上面的CAN控制器,到了STM32H743上升级成FDCAN控制器。浏览了正点原子,安富莱,野火的STM32H7教程,都没有介绍FDCAN如何使用。关于FDCAN相关的教程,广州硬石电子科技做得比较好。但是,硬石科技的FDCAN例程在实际项目上直接使用的话,会有一些问题等着你发现。

硬石科技将FDCAN控制器的TxFIFO设置为1,相当于取消FIFO的功能。

以下图片摘自硬石科技的H743教程:
TxFIFO

1.1 代码

代码
LED5_Handler()会被FreeRTOS系统每隔1S调用一次。实际上,代码的目的是发送5条CAN报文,CAN_ID分别是0x181,0x182,0x183,0x184,0x185。

1.2 CAN分析仪

通过CAN分析仪看到的结果是: "每隔1S时间,STM32H743只是发送了CAN_ID为0x181的CAN报文,并不是5条CAN报文。"
在这里插入图片描述
导致这个结果的原因是TxFIFO被设为1。

二. 解决问题的方法

2.1 STM32CubeMX

STM32CubeMX
根据HAL库的源码可以看到,Tx Fifo Queue Elmts Nbr的范围是: 0 ~ 32.
源码

2.2 CAN分析仪

代码不用修改,直接观察CAN分析仪的情况。
在这里插入图片描述
从上图可以看到,CAN分析仪每隔1S时间,收到CAN_ID为0x181,0x182,0x183,0x184,0x185的5条CAN报文。
问题解决了,代码的目的达到了。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的蓝牙测试程序,使用STM32H743VIT6单片机和UART1与蓝牙模块进行通信。假设蓝牙模块使用115200波特率,8位数据位,无校验位和1个停止位。 首先,需要在CubeMX中启用UART1,并设置它的波特率为115200。然后在代码中添加以下头文件和变量: ```c #include "stm32h7xx.h" #include <string.h> #define TXBUFFERSIZE 100 #define RXBUFFERSIZE 100 uint8_t aTxBuffer[TXBUFFERSIZE]; uint8_t aRxBuffer[RXBUFFERSIZE]; ``` 接下来,需要在main函数中初始化UART1,并将其设置为中断模式。在初始化过程中,需要设置UART的参数如下: ```c huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_EnableFifoMode(&huart1) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_EnableFifoMode(&huart1) != HAL_OK) { Error_Handler(); } if (HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1) != HAL_OK) { Error_Handler(); } ``` 接下来,需要在main函数中添加一个无限循环,以等待用户输入并将其发送到蓝牙模块。发送数据时,需要在数据的末尾添加回车符和换行符。 ```c while (1) { HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1); if (strlen((char *)aTxBuffer)) { strcat((char *)aTxBuffer, "\r\n"); HAL_UART_Transmit_IT(&huart1, (uint8_t *)aTxBuffer, strlen((char *)aTxBuffer)); memset(aTxBuffer, 0, sizeof(aTxBuffer)); } } ``` 最后,需要添加一个UART1的中断处理程序,以接收从蓝牙模块发送的数据。 ```c void USART1_IRQHandler(void) { HAL_UART_IRQHandler(&huart1); } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { strcat((char *)aTxBuffer, (char *)aRxBuffer); HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1); } } ``` 现在就可以编译和下载代码到STM32H743VIT6单片机,并使用串口调试助手或其他蓝牙模块与之进行通信了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Wallace Zhang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值