littlebot
Published on 2025-04-11 / 1 Visits
0

【源码】基于STM32F3xx系列微控制器的CAN通信与编译器性能测试项目

项目简介

本项目涵盖两部分。一方面是编译器性能测试,针对近期邮件列表中关于GCC在嵌入式ARM编程表现不佳,特定版本Clang更具优势的观点,使用STM32F303K8进行简单音频DSP应用,对GCC和不同版本的Clang编译器做性能对比。另一方面是基于STM32的HAL库,为STM32F3xx系列微控制器开发的CAN通信驱动,可实现CAN消息的初始化、配置、发送和接收,还能通过回调函数处理特定CAN事件。

项目的主要特性和功能

编译器性能测试

  • 用个性化Makefile和参考特定文档,适配GCC和Clang编译STM32F3xx相关代码的流程。
  • 对两个版本的Clang和两个版本的GCC进行基准测试,以典型音频DSP应用为测试用例。
  • 从CPU负载、二进制文件大小等方面对比不同编译器性能,并生成对比图表。

CAN通信驱动

  • 初始化CAN接口,可设置波特率、模式、位定时等参数。
  • 配置CAN过滤器,实现接收CAN消息的过滤。
  • 支持阻塞和非阻塞模式的CAN消息发送和接收。
  • 提供回调函数机制,处理发送和接收完成事件。
  • 提供实用函数,如获取CAN接口状态、获取最近的CAN错误代码等。

安装使用步骤

编译器性能测试

  1. 若使用GCC,确保已安装GCC和对应的个性化Makefile,通过日常维护的Makefile进行编译、链接、反汇编和硬件烧录等操作。
  2. 若使用Clang,参考文档https://interrupt.memfault.com/blog/arm-cortexm-with-llvm-clang 适配GCC Makefile,使用Fedora发行版自带的免费版本Clang进行编译。
  3. 若测试ARM的专有Clang版本,申请30天免费试用的ARM Development Studio,用其提供的独立Makefile编译,注意其包含自己的头文件、库和不同命令语法的链接器。
  4. 运行测试用的音频DSP应用,进行性能测试并查看生成的对比图表。

CAN通信驱动

  1. 确保已正确安装STM32F3xx系列微控制器的HAL库。
  2. 在代码中包含必要的头文件,如stm32f3xx_hal_can.h
  3. 调用相关函数进行CAN接口的初始化、配置、发送和接收操作,示例代码如下: ```c

include "stm32f3xx_hal_can.h"

CAN_HandleTypeDef hcan;

void CAN_Config(void) { CAN_FilterTypeDef sFilterConfig;

__HAL_RCC_CAN_CLK_ENABLE();

if (HAL_CAN_Open(&hcan, CAN_HANDLE, 1, 500000) != HAL_OK) { // Error handling }

sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x00; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x00; sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; sFilterConfig.FilterActivation = ENABLE; sFilterConfig.SlaveStartFilterBank = 14;

if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK) { // Error handling }

// Additional CAN configuration }

int main(void) { // Initialize the CAN interface CAN_Config();

// Prepare and send a CAN message CAN_TxHeaderTypeDef TxHeader; uint8_t TxData[8] = {0};

TxHeader.StdId = 0x123; TxHeader.IDE = CAN_ID_STD; TxHeader.RTR = CAN_RTR_DATA; TxHeader.DLC = 8; TxHeader.TransmitGlobalTime = 0;

if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, 0) != HAL_OK) { // Error handling }

while (1) { // Main loop } } ``` 4. 在需要时,实现自定义的回调函数以处理CAN事件。

注意事项

  • CAN通信驱动基于STM32F3系列微控制器,可能不适用于其他STM32系列。
  • 根据具体的硬件和配置,实现可能有所不同。
  • 在使用前,请确保正确配置GPIO引脚和相关的硬件资源。
  • 遵循STM32的HAL编程模型,使用易于理解的API进行CAN通信的配置和控制。

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】