【stm32 bug那些事儿】
🌞我打算边学边记录一下关于自己遇到的bug,后面这个文档也会不断更新
主要就是跟着网上的教程进行复现,然后找bug
代码不能运行,首先检查初始化!所以建议每次写完初始化的代码,都直接在main里面直接去调用。
一般而言,其实80%的问题都是自己的代码配置的问题,先怀疑一下自己的代码,然后在怀疑硬件本身的问题吧~
EXTI中断
这次 我以为会比较快,但是还是有bug
一开始是初始化没有
然后是中断回调函数写错,因为配置的是EXTI_Line0和EXTI_Line1
两个都差不多,但是最后复制过来复制过去 最终回调函数都给复制过去了
找了很久
还有就是配置NVIC的时候不能用 |
一起配置,要分开配置
12345678910111213141516//配置NVIC模块 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel=EXTI4_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级 NVIC_InitStruct.NVIC_I ...
【STM32学习】SPI通信
引子
最近跟着b站铁头山羊在学stm32单片机,目前学到SPI通信,主要就是想记录一下整个复现代码的过程,然后后面可以积累一些经验。这个up讲的很通俗,推荐大家去看看。
铁头山羊 stm32学习
首先刚开始我跟着他敲是完全没有完成的,明白一点说就是代码复现不了,啥都没有。然后只能回看回看,再回看。
直到晚上,我才发现了所有的bug。。。。
其实80%的问题都是自己的代码配置的问题,先怀疑一下自己的代码,然后在怀疑硬件本身的问题吧~
关于bug 的解决
我这边bug主要在哪个地方呢?
在没有解决这些bug之前,我的代码时卡死在读RXNE标志位,是否变成了非空,一直在那循环。我就觉得不对劲,后来发现:
1⃣第一个就是引脚配置,PB5 PB3 虽然他俩都是AF_PP输出的模式,我真的就直接复制了,居然没有改引脚名!
2⃣第二个,没有初始化SPI的时钟,多么离谱。只是因为up在讲解的时候没有特地讲,但是他的代码实际上是配置了的,所以我就忽略了,太离谱了。
3⃣第三个,在写spi通信的过程的buffer,明明应该是buffer[0]=0x03,buffer[1]=0x00,这种形式,我居然写成 ...
关于OB-GINS在VScode调试配置设置
关于OB-GINS在VScode调试配置设置
系统是Ubuntu18.04 然后其他都是按照牛老师团队整个代码的要求配置的
因为看这个代码比较困难,所以想着边调试边看代码这样会不会好一点,于是就有了这篇blog!!
这个blog记录一下本人首次在vscode调试配置成果叭 呜呜呜呜呜
然后也看了一堆教程,还有blog 终于终于啊!!
分享一下
资料和问题
利用cmake配置VScode的C++运行与调试环境
VSCode
使用CMake进行断点调试(超详细)
b站
cmake配置视频
然后是在linux下,进行配置时候,出现的一些bug
比如
在控制台下可以进行编译配置成功,但是在vscode里面就会有红线,而且会提示找不到的情况,这个时候
,参考了一个blog 但是这个blog我目前找不到了 呜呜呜,结论如下了
也就是在配置文件,setting.json里面加入这一句话,即可:
1"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools"
配置文件
关于在.vsocde里面的配置文件,可以参考上面的视频,然后配置文件无 ...
C/C++零碎知识点记录
C/C++知识点零碎记录
记录本人日常比较难理解的知识点 不定时更新
每天读一遍
vector就是特殊的数组,它的每个子单元都是特定的类型——==每个子单元左右是紧密连接的无空隙==
对一族类处理的情况,一般来说都不会往vector里面放对象本身,因为它们往往具有大小上的不同且vector只能保存同一类型;假设要把对象全部放进vector里,此时一般也只能放基类。这就会导致派生类超出基类的内容全部被截断——所以一般会往vector里面放类型一致的,大小一致的指针类型。而该类对象要么是在函数内声明创建的(也就是存储在栈上)要么就是通过new或malloc等创建的在堆上创建的对象。
为了便于批量处理,会把一族变量的指针放在同一个vector里面。因为派生类往往所具有基类不具有的内容,所以往往使用的是基类指针,即在vector里面保存的是基类指针。此时,我们可以通过基类指针调用本族类的通用方法,这件事情没有什么异议。而我们还需要通过基类指针调用同名但在基类和派生类中实现不同的方法,此时我们就需要用虚拟函数,也就是——
基本应用场景:一个类的族(一个基类和其他派生类,所有的类都包含在这 ...
武汉大学OB-Gins 环境配置的记录
武汉大学OB-Gins
环境配置的记录
🌈
本blog记录OB-GINS在虚拟机下的环境配置过程,整个过程主要是大概的步骤,和参考其它博主的详细的分详细步骤。整个过程,敲重点的是注意配置过程的版本号,以及虚拟机的设置(最好虚拟机运行前主机给他分配多一点性能,不然装ceres库的时候
会卡死)
1.虚拟机和Ubuntu
首先你需要一台虚拟机,市面上很多不同的软件可以达到这个要求,我下载的是VMware。然后系统是Ubuntu
18.04 or Ubuntu 20.04 。
新手的话这个配置的过程具体可以参考这个链接。
链接
如果是新手配置,配置完一下需要倒腾一下包括字体,分辨率,然后还可以在内部下载一些浏览器,VSCODE等等。当然别弄太多,毕竟这只是一个用于跑代码的环境。
因为我是之前配的ubuntu16.0版本的,所以需要倒腾一下,把16.0的,升级成18.04的,具体的教程可以参考这个(之前新手已配完的可以不看):
链接
2.GCC和g++下载
配置完之后配置gcc 和g++
注意 配置的版本是大于8.0以上的
3.Cmake下载
然后下载Cmake 最好是3.2以上的 ...
C 指针、多维数组零碎知识点
🌈 关于C指针和数组 相关的东西
今天被chj狠狠整顿了,现在回忆整理一下相关的知识点,既作分享,也加强记忆。本blog需要有基本的指针和数组相关的知识储备
下面是学习的点。配合代码食用更佳~
提要
二维数组 存储形式和一维数组一样
a[2] [3]是左值是因为a[2] [3]等价于 * (a+2* 3*
sizeof(int)+3*sizeof(int))
(int)b【也就是强制转换后】是右值,数组名a等效于右值
关于 intc =((int )&a);
int c= (char )a;
关于 float 类型 用%d读的时候 出现的0.0000问题
1.二维数组
首先二维数组 我们知道是a[m]
[n]这样的形式,其实就是数组的数组,可以理解为类似于矩阵的形式。
🤔那二维数组的存储方式和一维数组一样具体怎么理解?也就是二维数组和一维数组一样,是连续的存储空间。下面用一个代码展示一下。
12345678910111213141516#include<stdio.h>int main(void){ int a[2][3]={{1,2,3},{4, ...
C 存储类型
文字摘自 C Primer 第六版
存储类别
作用域和链接描述了标识符的可见性。
存储期描述了通过这些标识符访问的对象的生存期。
编程示例中使用的数据都储存在内存中。
🌿从硬件方面来看,被储存的每个值都占用一定的物理内存,C
语言把这样的一块内存称为对象(object)。对象可以储存一个或多个值。一个对象可能并未储存实际的值,但是它在储存适当的值时一定具有相应的大小(面向对象编程中的对象指的是类对象,其定义包括数据和允许对数据进行的操作,C不是面向对象编程语言)。
标识符:是一个名称,是可以用于指定特定对象的内容。标识符遵循变量的命名规则。标识符指定硬件内存中的对象方式。
如:int a=3; //a就是一个标识符
变量名不是指定对象的唯一途径。
1int *pt=&entity;
pt是一个标识符,它制定了一个存储地址的对象。但是*pt不是标识符,因为它不是一个名称,然而它趋确实指定了一个对象,这个对象和a指定的对象相同。
一般而言,那些指定对象的表达式称为左值所以a和*pt是表达式也是左值,指定了特定内存位置的值。
1int rank[10];
ranks的声明创建了 ...
C++ 学习 关于const的整理
今天回顾C++ 时候 发现遇到关于const的变量类型(底层const 顶层const
常量指针 指针常量 常量引用…)又有点懵懵的了,然后又仔细复盘了一下
最后整理了一下 也方便记忆
ps 虽然前面也写了相关的 但是我觉得这版好一些哈哈哈哈哈
引入
首先明确一下C/C++中的基本类型
在C/C++中,分为常量,变量,字面量三大类。
🍎常量,简单而言,就是数据类型前面加了const 的 ;
比如 const int a=2;
🍌变量,就是正常的数据类型 比如,int a=0; float a=3.2;
🍊 字面量,就是用的各种字符串,数字,比如上面我提到的
2,0,3.2等。
具体可以自行百度 这不是重点
另,要再讲讲指针变量这个东西。
指针变量也就只是一个数据类型而已,和int
float等一样,int类型里面存储的是整型变量,float是浮点型,而指针变量存储的是变量的地址而已,我们可以通过对指针进行一系列操作,来对这个地址上的变量的值进行更改。具体可以看看这篇blog
顶层const和底层const
而本文的const变量 就是 “常量”的类型,由这个常量可以 ...
毕业前夕
记大水怪离别前一夜
四年前,怀着忐忑,失落,自卑,又无奈,又有稍许期许来到武汉。直到今天,大水怪走之后,才有一种,真的真的要离开的感觉。
今天和大傻在华师拍照,居然还有种,这种在武汉的生活还能持续好久好久。我还想带个饼给大水怪吃,然后跟她一起吃饼。然后他说,回去了,她要走了。然后心咯噔一下,真的,要分开了。后面新的人,新的事物,新的一切,开始新的旅程。
“没有怎么办了,大学结束了。”
真的真的好快,我们要各奔东西了,可能之后再也没有这种缘分了。刚开始的时候不知道珍惜,以为自己拥有很多,但是,后面失去了才知道后悔。真的真的得要珍惜了,好好把握。
我好像还是太过于自以为是了,每次别人对我好,我都当作是实打实的,理所当然的。可是当我要付出的时候,我总是会去推辞别人,然后别人不理我了,然后再去巴巴地讨别人开心。人家回心转意之后,又开始周而复始。就这样一轮一轮的循环。
回顾一下大学四年,我遇见了很多人,但是重心仍然是放在学习为基础上的。每天没日没夜的“假勤奋”,把题库背了,刷老师的好感度,然后绩点就巴巴地上去了。
我还记得大学遇到的第一个朋友是lwd,然后大二实验室选拔开始,就慢慢疏远了。因 ...
C++ 学习 关于const 上
前言
这篇blog 主要是想具体讲讲新学到的const 当然不止是const
而是基于这个const引申出来的指针和引用。还是需要捋一捋的,这还是有点困难的。
我会把每一节的重点都摘出来,放在前面~
1⃣首先讲讲const
2⃣const引用和const指针 ❗ 特别容易混淆
这边blog 常量指针/引用
指针/引用常量 详细讲的不错 可以看看~
const 限定符
🌈敲重点!
🍎因为const对象一旦创建后其值就不能再改变,所以==const对象必须初始化==
🍐只能在const类型的对象上执行不改变其内容的操作
有时我们希望定义这样一种变量,它的值不能被改变。例如,用一个变量来表示缓冲区的大小。使用变量的好处是当我们觉得缓冲区大小不再合适时,很容易对其进行调整。另一方面,也应随时警惕防止程序一不小心改变了这个值。为了满足这一要求,可以用关键字const对变量的类型加以限定:
1const int bufsize = 512;//输入缓冲区大小
这样就把 bufsize定义成了一个常量。任何试图为
bufsize赋值的行为都将引发错误:
1bufSize = 512;//错 ...