GD32替换STM32使用HAL库开发问题

GD32HAL库开发问题

1can初始化进入error handle

HAL库的HAL_CAN_Init中,hcan->Instance->MSR寄存器无法清零,STM32先清零,再退出睡眠模式,而GD32需要先退出才能清零

c 复制代码
    while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U) {
        if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) {
            /* Update error code */
            hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;

            /* Change CAN state */
            hcan->State = HAL_CAN_STATE_ERROR;

            return HAL_ERROR;
        }

再其前面加上退出睡眠语句即可

c 复制代码
    #if defined(GD32F407xx)
        CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
    #endif

    /* Wait initialisation acknowledge */
    while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U) {
        if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) {
            /* Update error code */
            hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;

            /* Change CAN state */
            hcan->State = HAL_CAN_STATE_ERROR;

            return HAL_ERROR;
        }
    }

2发送邮箱不能按照填写顺序发送

配置了发送邮箱按照填写邮箱的先后顺序发送,ST可以按照顺序发送,而GD不行

查看HAL_CAN_AddTxMessage里面,发现transmitmailbox = (tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos获取的GD32空闲的邮箱不对

c 复制代码
            /* Select an empty transmit mailbox */
            transmitmailbox = (tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos;

            /* Check transmit mailbox value */
            if (transmitmailbox > 2U) {
                /* Update error code */
                hcan->ErrorCode |= HAL_CAN_ERROR_INTERNAL;

                return HAL_ERROR;
            }

对比文档发现,CAN_TSR_CODE的寄存器ST和GD定义不一样,ST表示的是空闲邮箱,而GD表示下一个发送邮箱

通过TMEx获取空闲邮箱后正常

c 复制代码
        if (((tsr & CAN_TSR_TME0) != 0U) || ((tsr & CAN_TSR_TME1) != 0U) || ((tsr & CAN_TSR_TME2) != 0U)) {
            /* Select an empty transmit mailbox */
            transmitmailbox = (tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos;

        #if defined(GD32F407xx)
            if (CAN_TSR_TME0 == (tsr & CAN_TSR_TME0)) {
                transmitmailbox = 0;
            } else if (CAN_TSR_TME1 == (tsr & CAN_TSR_TME1)) {
                transmitmailbox = 1;
            } else if (CAN_TSR_TME2 == (tsr & CAN_TSR_TME2)) {
                transmitmailbox = 2;
            } else {
                transmitmailbox = 3;
            }
        #endif

            /* Check transmit mailbox value */
            if (transmitmailbox > 2U) {
                /* Update error code */
                hcan->ErrorCode |= HAL_CAN_ERROR_INTERNAL;

                return HAL_ERROR;
            }

3 GD32修改代码被stm32cudemx覆盖问题

在上面中,对GD32不一样的地方加入了GD32F407xx预处理命令,在KEIL或stm32cubeid中定义该宏就可以编译可以加入GD32代码,但是每次重新生成代码都会被覆盖。在库文件里面修改改文件后,cubemx生成文件时从库复制过来就是修改后的文件。

对应的库文件路径在C:\Users\用户名\STM32Cube\Repository\STM32Cube_FW_F4_V1.27.1\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_can.c

相关推荐
宵时待雨2 分钟前
STM32笔记归纳4:I2C
笔记·stm32·单片机
仰泳之鹅16 分钟前
【杂谈】stm32重定向printf为什么需要勾选MicroLIB
stm32·单片机·嵌入式硬件
方芯半导体2 小时前
EtherCAT从站控制器芯片(FCE1353)与MCU(STM32H743)功能板解析!
xml·stm32·单片机·嵌入式硬件·物联网·自动化
一路往蓝-Anbo3 小时前
第 4 篇:策略模式 (Strategy) —— 算法的热插拔艺术
网络·驱动开发·stm32·嵌入式硬件·算法·系统架构·策略模式
DLGXY13 小时前
STM32——旋转编码器计次(七)
stm32·单片机·嵌入式硬件
独处东汉17 小时前
freertos开发空气检测仪之输入子系统结构体设计
数据结构·人工智能·stm32·单片机·嵌入式硬件·算法
風清掦18 小时前
【江科大STM32学习笔记-04】0.96寸OLED显示屏
笔记·stm32·学习
想放学的刺客1 天前
单片机嵌入式试题(第25)嵌入式系统可靠性设计与外设驱动异常处理
stm32·单片机·嵌入式硬件·mcu·物联网
wotaifuzao1 天前
STM32+FreeRTOS 长期可维护架构设计(事件驱动篇)-- 告别“屎山”代码
c语言·stm32·嵌入式硬件·freertos·状态机·事件驱动·嵌入式架构
一路往蓝-Anbo1 天前
第 1 篇:对象池模式 (Object Pool) —— 裸机下的动态内存革命
jvm·数据库·stm32·单片机·嵌入式硬件·网络协议·tcp/ip