自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 详解CAN通信的标识符掩码和标识符列表两种过滤机制

因此示例的MASK仅限制了ID的最后1位与预设ID的最后1为一致即可,其余的位不做限制,只要满足这样形式的ID数据,都能通过示例的过滤机制,从而被接收方正确接收,此处可知,掩码的作用就是要以预设ID为模板,决定过滤掉哪些类型的ID;注意,此种模式下,在配置时需要将对应的ID和掩码数据分别写进寄存器的STID区域,如上图所示,在16位空间中,STID区域处于高11位,因此需要将预设ID和掩码数据左移5位后写进寄存器。在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。

2023-10-09 16:01:13 3263

原创 关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题

在这种情况下,排查了数据手册(datasheet)上SPI相关的引脚,结果发现了问题的根本所在:PB3引脚默认功能为JTDO,PB4引脚默认功能是NJTRST,他们是JTAG调试方式时用的,博主使用的是SWD的方式,且这两个引脚要配置为SPI功能需要做重定向处理,即将关闭这两个引脚JTAG相关功能,这样配置之后,测试发现一切正常了。但偶尔也会出现在配置引脚时少了一些配置,结果导致代码运行时偶尔出现问题,最终排查出了是引脚配置问题,因此特地记录下来,供有需求的同学参考。

2023-10-09 14:25:29 1335

原创 看门狗定时周期设置的秘密

之前使用看门狗时,遇到的绝大部分代码都是计时周期为1。某日,突发异想把计时周期改到10秒,结果出问题了。。。设备一直重启!先看代码,看门狗初始化配置代码如下:翻看手册:so,看到了什么?看门狗时钟16分频时,独立看门狗支持的最大计时周期是1638.4ms,即1.6384s,是无法实现我所期望的10秒周期的。如果需要实现看门狗计时10秒周期,查表可知,需要分频系数设置为128及以上。修改后,实现10秒计时周期的代码如下:此时,即可实现独立看门狗计时周期为10秒的配置。但实际上为了保证设备异常

2022-06-16 09:56:19 4088 1

原创 关于GD芯片启用看门狗后无法调试的解决办法

问题描述:使用GD系列芯片进入debug模式,在程序执行到某个断点之后,再点击全速运行时,程序可能会退出debug模式。原因分析:进入断点后,看门狗不再喂狗。导致再全速运行时,看门狗计数超时,触发看门狗事件引起系统重启;以下代码看门狗计时周期为1秒:为了避免在debug时导致调试异常,需要在看门狗初始化代码中增加如下代码:dbg_periph_enable(DBG_FWDGT_HOLD);目的是:在内核停止时(调试模式),使看门狗定时器保持工作,避免调试时触发看门狗如此一来就可以避免因看门狗触发

2022-06-16 09:33:11 3166 1

原创 独立看门狗配置及计算详解

一、独立看门狗用途独立看门狗通常用于防止软件意外卡死,在软件故障之后能够重启程序;二、独立看门狗时钟源独立看门狗使用的是专用的低速时钟,以GD32为例,其独立看门狗使用的是IRC40K时钟,以STM32为例,其独立看门狗使用的是LSI(40KHz);三、独立看门狗寄存器分析看门狗可以理解为是一个定时器,知道其时钟源,再根据想要的触发周期,计算出分频系数和重装载值就可以了。与定时器不同的是独立看门狗是独立于主程序运行的,即使在系统时钟异常,程序无法运行的情况下,独立看门狗仍然能够完全独立工作;以S

2021-02-01 14:15:38 6936 2

原创 STM32移植到GD32,将内部时钟切换为外部时钟后无法运行的问题分析

1. 前言作者之前用过GD32芯片,也成功移植过STM32代码到GD32芯片,但最近移植一份STM32代码到GD32后运行的时候发现一个问题:使用内部时钟时一切正常,一旦切换为使用外部12M时钟就启动不了。最开始以为是时钟配置不对,但是我先移植了一份bootloader的代码到GD32,使用内部时钟、外部时钟运行都是正常的(详细配置过程请查阅我的上一篇文章:《史上最详细的gd32时钟频率设置》)。由此断定:时钟的配置绝对没有问题。2.问题描述那么问题就来了,问题1:时钟配置确实没有问题,可为什么一

2021-01-24 22:38:39 4690 2

原创 史上最详细的gd32时钟频率设置

在调试GD32芯片时遇到了时钟配置错误的问题,仔细研究文档和网上资料,认真调试之后做了以下总结,希望能帮到同样有类似困惑的你。**1.认识时钟HXTAL:高速外部时钟;LXTAL:低速外部时钟;IRC8M:高速内部时钟;IRC40K:低速内部时钟;其中:HXTAL高速外部时钟为板子焊接的外部晶振,精度高,但同时功耗相较内部时钟也较高;IRC8M内部高速时钟为芯片内部自带的时钟,精度较低,可以应用在对时钟要求不高的场景中;IRC40K低速内部时钟用于独立看门狗的计数。了解时钟分类

2021-01-19 14:27:51 31707 26

原创 移植GD芯片时显示“typedef enum {FALSE = 0, TRUE = !FALSE}bool”处错误的解决方法

移植GD芯片时显示“typedef enum {FALSE = 0, TRUE = !FALSE}bool”处错误的解决方法在st芯片程序往gd芯片移植过程中,编译发现一种奇怪的报错和警告:排查程序发现并没有报错提示的那种错误。如下图所示:全局搜索“FALSE”后,发现我其他文件中调用了stdbool.h文件,打开stdbool.h文件之后,就能发现该文件已经声明了诸如:“TRUE”FALSE"等bool类型的变量,如下图所示:由此分析,应该是变量重复定义导致的报错,尝试将gd32f10x.h

2021-01-18 17:42:21 4103 1

原创 串口收发乱码解决方案

串口收发乱码解决方案串口收发乱码解决方案总结串口收发乱码解决方案在使用基于stm32f103rct6芯片的板子实现485收发时,发现可以发送也可以接收,但是收发的数据都是乱码。第一步,因为可收可发,引脚肯定没问题;第二步检查波特率,检查后发现波特率也没问题;第三步检查时钟配置,仿佛也是没问题。。。此时已经郁闷了。二话不说,先上485配置代码:static void uart1_config(uint32_t baud_rate){ GPIO_InitTypeDef GPIO_Ini

2020-08-03 13:08:30 9345 5

原创 vim编辑器显示行数

设置ubuntu 的vim编辑器显示行数,方法如下:1.打开终端输入:sudo vi /etc/vim/vimrc,打开vim的配置文件(使用sudo可忽视vimrc文件的readonly属性);2.在配置文件中,找到最底行,点击键盘a键,打开输入模式;3.输入:set nu,设置显示行数;4.点击键盘esc键,退出输入模式,点击shift+:,输入:wq,保存退出;至此所有用vim打开的...

2020-05-02 22:02:14 8898 2

原创 dpkg:错误

在ubuntu执行安装包安装指令时,出现:“dpkg:错误:另外一个进程已经为 dpkg 状态数据库 加锁”的错误,解决方法:重启!

2020-05-01 19:04:24 2637

原创 ubuntu 在vim中编辑时键盘导航键失效,输入为ABCD的解决方案

两步解决在安装unbutu后,使用系统内的vim输入时,发现键盘导航键总是输入成ABCD,令人十分恼火,上网一搜发现好多人都遇到这个问题,解决方法如下,亲测有效:1.打开终端,输入:sudo apt-get remove vim-common,回车;目的是删除自带的vim编辑器;2.第一步之后,输入:sudo apt-get install vim,回车;目的是重装vim;...

2020-05-01 17:16:28 176 1

原创 栈的操作(入栈、出栈)之二:链栈

栈操作原则使用栈操作数据,必须遵循“先入后出”的原则;栈操作之链栈链栈是用链表实现栈的存储结构,链表头部作为栈顶,链表尾部为栈底(单链表);入栈写入数据时,实际是对链表做“头插”操作,空链表时,头指针head指向null;新进数据插入链表头部,头指针head指向当前链表头部;以此类推,这种操作即为入栈(压栈);出栈读出数据时,实际是删除当前链表的头部(首元节点),将头指针head...

2020-04-23 18:29:57 3450

原创 栈的操作(入栈、出栈)之一:顺序栈

栈操作原则使用栈操作数据,必须遵循“先入后出”的原则;栈操作之顺序栈使用顺序表实现栈的存储结构,本质上是数组;一个数组其下标最低的位置可当做栈底(注意,此处“下标最低”并不一定是0,可以是任何位置,只要是一段数组的最低下标即可);入栈写入数据时:最先进入的数据,放入栈底,后进入的放在数组下标加1的位置,以此类推;这种操作即为入栈(压栈);出栈读出数据时:最后进入的数据,位于栈顶,最...

2020-04-23 17:49:48 14726

原创 RT-Thread几个不得不知的知识

启动流程1.上电;2.运行复位函数Reset_Hhandler();3.c库函数_mian(),初始化系统堆和栈;4.执行subsubsubmain函数(main扩展函数,可在执行main之前执行submain,做一些硬件初始化等预操作,是keil自带的指令);/* re-define main function */int $Sub$$main(void){ rtthrea...

2020-04-22 16:00:22 2362

原创 RT-Thread进程间通信(IPC)各工作方式分析

IPC功能划分在实际应用中,有些情况需要在线程间或中断与线程间传输一定的数据(通信),有些情况下,只需要标记一种状态,并不需要传输具体的数据(同步);基于此,rt-thread中的ipc可以大致分为以下两种:线程间通信:1.邮箱mb;2.消息队列msq;线程间同步:1.信号量sem;2.互斥量mutex;3.事件集event;通讯IPC邮箱(mailbox)知识点如下:1....

2020-04-22 14:12:28 899

原创 链表中有环经典问题解答思路

判断链表中是否有环方案:1.定义一个快指针fast(操作一次移动两个位置);2.定义一个慢指针slow(操作一次移动一个位置);3.初始化两个指针(都指向头节点head);4.同时开始移动两个指针;5.当两者相遇时,表示链表上有环;6.若快指针的next指向NULL,表示链表无环,快指针已到达链表尾部;找到环的入口点方案:1.定理:从链表起点(head)到入口点的距离 = 从s...

2020-04-21 20:37:09 203

原创 双向链表的创建、插入、删除

**双向链表的创建、插入、删除**创建一个双向链表的数据结构双向链表结构创建双链表并初始化正向遍历链表反向遍历链表双向链表的尾插双向链表的头插在指定位置插入节点删除指定节点主函数整体工程CMD运行结果创建一个双向链表的数据结构// 创建一个双向链表的数据结构typedef struct list{ int data; struct list *next; struc...

2020-04-21 18:00:57 5419

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除