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

GD32HAL库开发问题

    • 1can初始化进入error handle
    • 2发送邮箱不能按照填写顺序发送
    • 3 GD32修改代码被stm32cudemx覆盖问题

1can初始化进入error handle

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

    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;}

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

    #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空闲的邮箱不对

            /* 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获取空闲邮箱后正常

        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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/208084.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法——双指针

一、背景知识 双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针进行访问,从而达到相应的目的。对撞时针: 两个指针方向相反对撞指针一般用来解决有序…

浅谈能源智能管理系统在大学高校中的应用

安科瑞 华楠 摘要:结合深圳南方科技大学能效系统工程设计实例,针对校园中电耗、热量消耗、冷量消耗及水资源消耗数据的采集、传输、分析管理系统,分析了系统中的水、电、气在高校中的能耗分布,并阐述了节能应用方案,可…

Java 编码

编码: 加密: 通过加密算法和密钥进行 也可通过码表进行加密 对称加密: 缺点:可被截获 元数据---加密算法密钥密文 ----> 解密算法密钥元数据 算法:DES(短 56位),AES(长 128位)破解时间加长 非对称加密: 元数据-加密算法加密密钥 密文 --->加密算法解密密钥元数据 …

在终端输入任意的英文字符串,求最后一个单词的长度

实例要求:1、在终端输入任意的英文字符串 s,由若干单词组成,单词前后用一些空格字符隔开;2、返回字符串中 最后一个 单词的长度;3、单词 是指仅由字母组成、不包含任何空格字符的最大子字符串;示例代码&…

C++(模板进阶)

目录 前言: 本章学习目标: 1.非类型模版参数 1.1使用方法 1.2注意事项 1.3 实际引用 2.模版特化 2.1概念 2.2函数模板特化 2.3类模板特化 2.3.1全特化 2.3.2偏特化 3.模版分离编译 ​编辑 3.1失败原因 ​编辑 3.2解决方案 4 总结 前言&…

SQL 中的 MIN 和 MAX 以及常见函数详解及示例演示

SQL MIN() 和 MAX() 函数 SQL中的MIN()函数和MAX()函数用于查找所选列的最小值和最大值,分别。以下是它们的用法和示例: MIN() 函数 MIN()函数返回所选列的最小值。 示例: 查找Products表中的最低价格: SELECT MIN(Price) F…

设计循环队列,解决假溢出问题

什么是假溢出? 当我们使用队列这种基本的数据结构时,很容易发现,随着入队和出队操作的不断进行,队列的数据区域不断地偏向队尾方向移动。当我们的队尾指针指向了队列之外的区域时,我们就不能再进行入队操作了&#xff…

Go 语言函数、参数和返回值详解

函数是一组语句,可以在程序中重复使用。函数不会在页面加载时自动执行。函数将通过调用函数来执行。 创建函数 要创建(通常称为声明)一个函数,请执行以下操作: 使用 func 关键字。指定函数的名称,后跟括…

打不开clickonce问题解决过程

1.用户电脑user文件夹下有xx和xx.1两个账户,原先安装在xx账户下,后修了电脑原数据保留在xx.1,新创建XX,之后clickonce就打不开了表现为没有反应,,删除注册表和appdata都只能正常安装,但是不能打开,没有任何报错,发现在我的电脑下打开有这样的提示,,在用户电脑上没有 尝试通过修…

电大搜题——让学习变得轻松高效

作为一名现代学者,您一定时刻关注着教育领域的进展和创新。今天,我将向大家介绍一个名为“电大搜题”的神奇工具,它将为您的学习之路带来一场完美的革命。 在快节奏的现代社会中,学习已经成为每个人追求成功的必经之路。然而&…

攻防世界-web-Confusion1

1. 题目描述 打开链接,如图 点击Login和Rigister,都报错 但是有提示 指出了flag所在的位置,题目中直接能获取到的信息暂时就这么些了 2. 思路分析 既然告诉了我们flag文件的位置,那么要读取到这个文件,要么是任意文…

设计模式-创建型模式-工厂方法模式

一、什么是工厂方法模式 工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。工厂方法模式是目标是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。…