- 博客(17)
- 收藏
- 关注
转载 STM32的硬件I2C的BUG
这些都是我调STM32硬件I2C的一些心得。上文提及到的中断接收和发送方法,我用TIM自动更新,产生最高占先优先级的中断,并在中断里停留70us左右,且重装载值是一个素数的情况下,STM32F103VET6 400kHz的I2C跑了近一周没有发现数据错误。至此,STM32 I2C的问题基本解决,欢迎广大电工们指正、反馈。转载出处iguesser。
2024-03-15 15:58:30 704 1
转载 IIC总线解析
IIC开发于1982年,当时是为了给电视机内的CPU和外围芯片提供更简易的互连方式。电视机是最早的嵌入式系统之一,而最初的嵌入系统是使用内存映射(memory-mapped I/O)的方式来互连微控制器和外围设备的。要实现内存映射,设备必须并行连入微控制器的数据线和地址线,这种方式在连接多个外设时需大量线路和额外地址解码芯片,很不方便并且成本高。
2024-03-12 19:01:32 72 1
转载 循环队列kfifo
kfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现;它提供一个无边界的字节流服务,最重要的一点是,它使用并行无锁编程技术,即当它用于只有一个入队线程和一个出队线程的场情时,两个线程可以并发操作,而不需要任何加锁行为,就可以保证kfifo的线程安全。kfifo代码既然肩负着这么多特性,那我们先一敝它的代码:structkfifounsignedcharbuffer;
2024-03-05 14:32:56 121
转载 可变参数宏
大家在以后的工作和学习中,可能会接触到各种各样、形形色色的宏,只要我们有牢固的 C 语言基础,熟悉 GNU C 的常用扩展语法,再遇到这样类似的宏,我们都可以慢慢去分析了。其实,C99 标准已经支持了这个特性,但是其它的编译器不太给力,对 C99 标准的支持不是很好,只有 GNU C 支持这个功能,所以有时候我们也把这个可变参数宏看作是 GNU C 的一个语法扩展。前面加上宏连接符 ##,这样做的好处是,当变参列表非空时,## 的作用是连接 fmt,和变参列表,各个参数之间用逗号隔开,宏可以正常使用;
2024-03-04 19:47:09 69 1
转载 什么是字节对齐
前面我们也说到,计算机每次读写一个字节块,例如,假设计算机总是从内存中取8个字节,如果一个double数据的地址对齐成8的倍数,那么一个内存操作就可以读或者写,但是如果这个double数据的地址没有对齐,数据就可能被放在两个8字节块中,那么我们可能需要执行两次内存访问,才能读写完成。由于不同平台对齐方式可能不同,如此一来,同样的结构在不同的平台其大小可能不同,在无意识的情况下,互相发送的数据可能出现错乱,甚至引发严重的问题。也就是说,如果我们在设计结构的时候,合理调整成员的位置,可以大大节省存储空间。
2024-03-04 18:51:31 58 1
转载 STM32上的硬件流控
另外,在 CubeMX 里也可以使能 RS485 的硬件流控,这里的流控实际上流控的是数据的方向,因为 RS485 是一个半双工的通讯模式,它的数据收的时候就不能发,发的时候不能收。当 Data 2 还在 TX 线上进行发送的时候,如果此时在 CTS 信号上检测到了高电平,即使在 Data 2 的 STOP 位发送完之前写入了 Data 3,在当前的字节发送完之后是不会马上发送新写入的数据的,而是要等待,直到在 CTS 管脚上检测为低电平后,TX脚上才会开启 Data 3 的 Start 信号。
2024-02-27 16:54:32 657
转载 芯片手册查阅方法
第44章“ELECTRICAL DATA”(对于电气数据,在图2.28中未画出),描述芯片的电气特性,如电压、电流和各种工作模式下的时序、建立时间和保持时间的要求。所有的数据手册都会包含类似章节,这一章对于硬件工程师比较关键,但是,一般来说,驱动工程师并不需要阅读。第3~34章对应于CPU内部集成的外设或总线控制器,当具体编写某接口的驱动时,应该详细阅读,主要是分析数据、控制、地址寄存器(数据手册中一般会以表格列出)的访问控制和具体设备的操作流程(数据手册中会给出步骤,有的还会给出流程图)。
2024-02-27 11:00:09 201
转载 学嵌入式需要查阅的手册
数据手册和参考手册属于常用且比较重要的两个手册。库使用我倒是没怎么用,函数里面一般会有对应注释,也还够用。勘误手册在你实在想不通的时候,不妨看看,说不定不只是你遇到呢。从原子哥那里下载的资料,使用的时候感觉手册齐全,换了一款单片机,却又不知道该如何搜索这些手册了。4、勘误手册:用户在使用过程中向官方反馈的常见BUG,这个大手子才会用吧,我是那种怀疑自己也不会怀疑单片机有BUG的菜鸟 ,哈哈。1、数据手册(datasheet):主要是单片机的一些电气特性,硬件工程师常用。
2024-02-27 10:56:24 46
转载 Systick载入值为什么要减1
我们可以发现它是倒数到0的,也可以理解成从0计数到设定值的,所以它是ticks-1次。总结:在配置过程对CTRL//LOAD/VAL三个寄存器进行了配置,初始化了SysTick使用的时钟,清除系统当前值,装入重装值,使能SysTick,使SysTick能响应中断,说了半天其实就这一句话。这里引起了我的思考,在很多程序里的第一步都是检查输入值是否可用,也许我应该形成一种条件反射,一看到有输入值就应该判断是否应该对其检查是否可用,这样的好处还是很多的,经过检查我们就不必输入值合法不,不合适时程序会提示我们的。
2024-02-26 13:41:39 232 1
转载 C语义与C++中的static inline
一开始出现编译错误的原因是对swap的调用是真的调用(没有转换成内嵌代码),同时还没有输出swap的对应的汇编代码。C中定义内联函数要同时使用修饰符,这样生成的代码开启优化选项后不输出汇编代码,直接内嵌调用(一般情况);如果添加非inline函数原型,相当于,即使开启优化选项,也会生成相应的汇编代码,只不过本地调用直接内嵌(一般情况)。C和C++不一样,C++的inline函数自带static属性,而C中的需要显式指定static才行。
2024-02-25 18:34:10 154
转载 AFIO时钟什么时候需要开启
只有当使用事件控制寄存器、复用重映射和调试寄存器以及外部中断寄存器的时候,才需要提前开启AFIO的时钟!可是在配置这些外设时钟的时候,不知道大家有没有这样的疑惑,既然作为GPIO口的一种复用功能,为什么不需要开启复用时钟(AFIO时钟)呢?像定时器、串口这类外设,虽然不需要开启复用时钟,但一定要开启他们自己的相应的外设时钟。还有就是,这些外设确实是引脚功能的一种复用,在配置GPIO输出方式时一定别忘了使用。定时器、串口,这些都是STM32的外设,在使用时看作。
2024-02-25 16:00:20 374
转载 GPIO功能复用
STM32Fxx系列单片机的GPIO引脚可以配置为浮空输入(Input Floating)、上拉输入(Input Pull-up)、下拉输入(Input Pull-down)、模拟量(Analog)、开漏输出(Output Open-drain)、推挽输出(Output Push-pull)、复用开漏(Alternate function open-drain)输出和复用推挽(Alternate function push-pull)输出等八种模式。复用开漏输出和(普通)开漏输出的道理是一样的。
2024-02-25 15:00:38 305
转载 事件与中断的关系
结合具体的ST MCU运行过程,其中会有许多各种各样的事件,比方管脚电平变化、计数器溢出、DMA空、FIFO非空、AD转换结束、超时、外设使能、初始化等等,其中有些事件是不会导致中断产生的,比方外设使能或部分初始化动作是不会导致中断发生的,有些事件就可能导致中断发生,比方计数器溢出,AD转换结束等,这些就是中断事件。当然非中断事件的形成也是可控的。一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化.
2024-02-24 17:20:33 78
转载 ((void)0)的作用
assert既可以在debug模式下使用,也可以在release模式下使用,那么它在两种模式下应该具有一致性:当代码在debug和release模式下切换时,无需手动更改代码,且除assert以外的代码表现应完全一致。假如将assert定义为空,即1int n = 0;...123从而产生编译错误。而使用(void)0int n = 0;...123这是合法的。孰优孰劣,一眼便知。可能又有人提出异议:那就规定assert。
2024-02-23 15:43:04 137
转载 C语言中什么时候需要在花括号后面加分号?
时,右大括号后是需要加分号的,在C++中使用class关键字定义类时,右大括号后也是需要加分号的,而在定义函数时,右大括号后是不需要加分号的。在结构体的定义完成之后,可以立马定义一个变量,所以遇到右大括号不一定就是结尾,因此,此时只能用分号来告诉编译器该结尾了。例如:while循环、for循环、if语句中,右大括号}就能代表这个循环或者语句结束了,所以不需要分号来辅助。中,执行语句后,再判断是否执行下一次循环,这里的右大括号}不能代表结尾,需要分号辅助。语句、定义不需要分号结尾,声明需要分号结尾。
2024-02-02 21:31:30 501
转载 Keil编译器无法输入汉字
2、在Editor页面,可以看到General Editor Settings 下方有一个Encoding,这里有许多的选项,选择Chinese GB2312(Simplified),点击OK即可输入中文注释。应该有不少新手小白遇到过keil注释无法输入汉字的情况,输入的汉字都变成了问号“?同样作为新手小白的我在网上找到了一种解决方法。1、在工具栏里单击Edit,选择最下方的Configuration,单击。又遇到了keil里空格变成“?”的情形,等找到解决办法再更上来。
2024-02-02 11:31:16 1709
转载 Keil5 添加 V5编译器
更新最新的版本(MDK5.37)后,在编译以前版本的工程文件时,发现出现了非常多的报错,在网上搜索之后发现原来时编译器版本不匹配的问题,即MDK5.37中使用的是Version 6版本的编译器,而缺少Version 5,对于以前编写的工程文件来说,需要使用的是Version 5版本,因此产生了报错。
2024-02-02 11:06:52 2778 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人