STM32G431是ST公司推出的一款高性能微控制器,凭借其强大的性能、丰富的外设和较低的功耗,在工业控制、通信和电机控制领域备受欢迎。本篇文章将基于STM32G431,带大家实现以下两个功能: 
- 配置CAN接口,用于主从通信;
 - 配置GPIO,实现基本的LED控制功能。
 
  硬件与软件准备- 硬件
 
 
- STM32G431开发板
 - CAN收发器模块(如MCP2551或TJA1050)
 - LED和适配电阻
 - PC,用于通过CAN调试工具与MCU通信
 
 
  - 软件
 
 
- STM32CubeMX:用于生成初始代码
 - Keil或STM32CubeIDE:用于编写和调试程序
 
 
  
  CAN通信配置与实现配置步骤- 打开STM3总结本文基于STM32G431的CAN通信和GPIO控制功能进行了演示。从基础配置到代码实现,我们一步步探索了如何让STM32G431成为高效的嵌入式开发工具。希望本文对你的开发有所帮助!2CubeMX,选择STM32G431的芯片型号。
 - 在引脚图中,将CAN接口(FDCAN1)启用。
 - 配置CAN的波特率,比如500 kbps,同时开启接收和发送功能。
 - 生成代码,并使用CubeIDE导入。
 
  代码实现以下代码实现了一个简单的CAN接收和发送功能: 
- #include "main.h"
 
  
- // CAN消息接收/发送定义
 
 - FDCAN_HandleTypeDef hfdcan1;
 
 - FDCAN_RxHeaderTypeDef RxHeader;
 
 - FDCAN_TxHeaderTypeDef TxHeader;
 
 - uint8_t RxData[8];
 
 - uint8_t TxData[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
 
  
- 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();
 
  
-     // 配置CAN
 
 -     if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK) {
 
 -         Error_Handler();
 
 -     }
 
  
-     if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK) {
 
 -         Error_Handler();
 
 -     }
 
  
-     // 配置发送消息的头部
 
 -     TxHeader.Identifier = 0x123;
 
 -     TxHeader.IdType = FDCAN_STANDARD_ID;
 
 -     TxHeader.TxFrameType = FDCAN_DATA_FRAME;
 
 -     TxHeader.DataLength = FDCAN_DLC_BYTES_8;
 
 -     TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
 
 -     TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
 
 -     TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
 
 -     TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
 
  
-     while (1) {
 
 -         // 发送CAN消息
 
 -         if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK) {
 
 -             Error_Handler();
 
 -         }
 
 -         HAL_Delay(1000);
 
 -     }
 
 - }
 
  
- // CAN中断回调函数
 
 - void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) {
 
 -     if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0) {
 
 -         HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData);
 
 -         // 简单打印接收到的数据
 
 -         printf("Received Data: ");
 
 -         for (int i = 0; i < 8; i++) {
 
 -             printf("%02X ", RxData[i]);
 
 -         }
 
 -         printf("\n");
 
 -     }
 
 - }
 
  
- static void MX_FDCAN1_Init(void) {
 
 -     hfdcan1.Instance = FDCAN1;
 
 -     hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
 
 -     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 = 5;
 
 -     hfdcan1.Init.NominalSyncJumpWidth = 1;
 
 -     hfdcan1.Init.NominalTimeSeg1 = 13;
 
 -     hfdcan1.Init.NominalTimeSeg2 = 2;
 
 -     if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) {
 
 -         Error_Handler();
 
 -     }
 
 - }
 
 
  GPIO控制LED实现配置步骤- 在STM32CubeMX中将对应引脚配置为GPIO_Output模式,用于控制LED。
 - 生成代码,初始化GPIO。
 
  代码实现- static void MX_GPIO_Init(void) {
 
 -     GPIO_InitTypeDef GPIO_InitStruct = {0};
 
  
-     // GPIO时钟使能
 
 -     __HAL_RCC_GPIOA_CLK_ENABLE();
 
  
-     // 配置引脚PA5为输出模式
 
 -     GPIO_InitStruct.Pin = GPIO_PIN_5;
 
 -     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 
 -     GPIO_InitStruct.Pull = GPIO_NOPULL;
 
 -     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 
 -     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
 - }
 
  
- int main(void) {
 
 -     HAL_Init();
 
 -     SystemClock_Config();
 
 -     MX_GPIO_Init();
 
  
-     while (1) {
 
 -         // 点亮LED
 
 -         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
 
 -         HAL_Delay(500);
 
  
-         // 熄灭LED
 
 -         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
 
 -         HAL_Delay(500);
 
 -     }
 
 - }
 
 
  
 
 
  |