stm32/单片机
文章平均质量分 77
暴躁的野生猿
请加入裙,欢迎同行一起学习交流,1零251②7672。百度搜索【CSDN 暴躁的野生猿】也可搜到群号码
展开
-
ARM汇编伪指令AREA
可以看到,按照ARM的规则,AREA指令后面紧跟段名,有些段名是保留的(编译器内置的),这些保留的段名有特殊意义,例如上图中出现的特殊段名有:STACK、HEAP、RESET,|.text|。对于STACK段,编译器会把该区域的汇编代码或描述编译到栈区,也即内存的最高字节处。对于RESET段,编译器会把该区域的汇编代码或描述编译到flash的0地址处。用于定义一个代码段或数据段。以STM32的启动文件为例,里面有很多AREA指令。原创 2024-04-22 14:45:02 · 791 阅读 · 0 评论 -
keil把c语言函数转成汇编
有上图可见,这个标签对应的flash地址处,通过DCD命令占用了一个32bit的空间,这个空间中的值被初始化成了全局变量var的地址。然后执行编译,这样就会在工程的输出文件夹(一般会被命名为OBJ)下,找到与.c文件同名的.s文件,这个C文件中的所有函数,都会被一一转换为汇编函数。汇编可以让开发人员从根源上理解程序的运行逻辑,本文介绍如何在keil环境下如何把一个c文件中的某一个函数,转换为汇编函数,并编译运行。由这段代码可以看到在汇编中是如何调用C函数的,以及汇编是如何读写c语言中的全局变量var的。原创 2024-04-22 11:25:39 · 3169 阅读 · 0 评论 -
nor flash、nand flash、eeprom、fram的读写特性
因为EEPROM的写入速度很慢,所以他里面带有一个高速缓存,这个缓存的大小就是page的大小,借助这个缓存,我们就可以通过20M的SPI把数据快速发给EEPROM,然后单片机就可以切换线程,或者切换状态机,让CPU去干别的事情,而不是把CPU都浪费在数据发送和等待上。如果你指定起始地址为0,要写入257字节,也即出现了跨页操作,那么EEPROM把第0页写满之后,写指针不会跳到第257字节处(也即不会跳到第1页的第0字节处),而是会发生回环,跳回本页的第0字节处,会导致之前写入的数据被覆盖。原创 2023-07-06 18:39:22 · 5212 阅读 · 0 评论 -
FAT32文件和目录的组织方式
文件在硬盘、SD卡等存储,而里面存储的都是二进制数据,驱动程序是如何从这堆二进制数据中,解析出目录层次、文件列表、文件内容的呢?这就必须要了知道FAT32文件系统在存储介质中的组织方式了。所谓组织方式,就是一种约定或规定,大家都按这套规则来读写就好了。原创 2022-10-10 16:26:21 · 3707 阅读 · 0 评论 -
STM32CubeMx配置定时器
定时器的用法很多:1、作为时基。也即仅读取定频自增的TIMx->CNT2、定时中断3、计数4、捕获5、输出PWM(也叫:比较输出)6、等等以编程中最常见的定时中断为例首先配置时钟树:定时器的时钟来自于内部的PLL分频->AHB->APB1或2而且由上图可见,APBx时钟进入定时器之前频率会被x2定时器溢出时间的计算:T=((period+1)*(psc+1))/(TIM_CLK_Mhz/ TIM_ClockDivision) u.原创 2021-12-01 18:37:18 · 12364 阅读 · 0 评论 -
CAN总线通信原理
CAN总线的仲裁是基于“线与原理(有一个0则为0,全部为1才为1)”,也即,总线上连接多个设备,只要有一个设备输出低电平,那么总线上的电平就为低(这一现象在CAN领域称为“显性”);只有全部设备均输出高电平,总线才能呈现为高电平(称为“隐性”)。可见,只要有一个设备电平显性,那么他就可以覆盖其他所有设备的电平隐性。CAN控制器在发送报文的同时会监听总线状态与自己发送的电平是否一致,如果不一致发生在ID段则会发生仲裁,如果发生在其他区域则会触发相应错误。基于这一原理,如果自己在发送报文时,别的设备也在发送报文原创 2021-11-15 13:41:06 · 12300 阅读 · 0 评论 -
keil/STM32/ARM之分散加载文件scatter file
官方资料:依次打开 -> keil -> help -> uVision help,打开帮助文件,然后定位到分散加载文件章节:分散加载文件有什么用?我们知道,在嵌入式程序中,main函数并不是首先被执行的代码,还有一个隐藏的函数,名字叫__main,他会在main之前被执行,还有一些汇编代码也会在main之前被执行。他们主要干了这些事情:1、设置栈顶地址;2、设置PC指针;3、把0初始化变量所在内存区清0;4、给非0初始化的变量赋值;3、设置栈顶地址。loa.原创 2021-09-02 11:29:52 · 4431 阅读 · 2 评论 -
STM32外部中断EXIT使用步骤与注意事项
先记录几个知识点:1、STM32的任何一个引脚均可配置成外部中断。2、PA0/PB0/PC0...等均可任选一个连接到中断线0,PA3/PB2/PC3.....等均可任何一个连接到中断线3。。。。其余pin同理3、EXTI_Line8的中断服务函数是EXTI9_5_IRQHandler,也即这个服务函数要对[5,9]这5个中断线进行服务,如何判断到底是哪个中断线引发的中断,以8号线为例,可通过这条语句查询:if(EXTI_GetITStatus(EXTI_Line8) != RESET).原创 2021-01-13 15:51:31 · 2141 阅读 · 0 评论 -
STM32/keil把多个c文件编译为静态库lib
众所周知,编译lib的目的无非两个:加速编译、隐藏代码。一个常见的应用场景就是,把ST的标准库或HAL库等编译成lib,这样以后再编译整个工程时,就无需再次编译他们了,可以节省编译时间。当然,坏处是,无法右键1、把打算编译成lib的多个c文件放到同一个group。你也可以不把这些c文件放到同一个lib,这不影响后续步骤。放到同一个group的目的是,仅仅是方便后续操作而已。如下图,我们可以新建一个group。2、编译项目,保证项目可以编过(最好是0 warning 0 error).原创 2021-01-05 10:28:20 · 5922 阅读 · 2 评论 -
STM32开启浮点运算单元FPU与DSP运算库,附性能测试+加减乘除耗时测试
STM32F4xx属于Cortex M4F架构,自带FPU硬件,可以加速float类型数据的加减乘除运算。观察启动文件,发现,要启用FPU,需要启动满足两个宏:(__FPU_PRESENT == 1) && (__FPU_USED == 1)在keil的魔术棒中,如上图所示,直接选中单精度浮点运算器,keil就会自动把所需的宏给定义出来。如何验证是否开启成功?验证方法1:我们把F407主频设为168M,不选中/选中FPU,分别做10万次乘法:发现耗时分别为32..原创 2020-11-27 10:19:26 · 15153 阅读 · 1 评论 -
单片机中断防护概述
主优先级相同的中断,相当于同处一个线程,main链条是优先级最低的线程,如果把中断分组设置为共4个主优先级,那么加上main,整个程序共有5个线程,优先级由高到低依次为:int0 int 1 int2 in3 main同级别的中断,对同一个变量的操作,永远不会发生读写一半被改掉的情况,如同main链中的各个函数一样,属于同步操作。当多线程异步操作同一个变量时,中断(线程)防护需要面临的情景:高优先级[读],低优先级[读写]异常:低优先级把变量写了一半,被高优先级给读到,低优先级必须..原创 2020-11-26 12:38:03 · 1098 阅读 · 0 评论 -
STM32-CAN转TTL串口-使用详解,以F407为例
情况是这样的,因为项目中需要外接的串口设备很多,STM32F4的6个UART/USART已经都被占用完了,如果想继续接入串口设备,只能通过【can<->串口】转换模块来实现,而且由于can总线支持N多can节点,理论上,STM32就可以接入100多个串口设备了。但是,只使用一个【can<->串口】模块,是无法使串口设备与STM32通信的,因为单片机都是TTL电平(0~3.3或5V),是无法与can总线(差分电平2.3V)通信的,所以必须有一个模块能够把单片机发出的信号转换为CAN原创 2020-10-22 10:40:48 · 9367 阅读 · 5 评论 -
STM32使用库函数设置系统时钟频率
参考原子哥的教程http://www.openedv.com/forum.php?mod=viewthread&tid=95570&extra=page=1,原子哥排版比较乱,这里自己记录一下,以STM32F103为例:库函数的默认的系统时钟流程是这样的:首先从汇编启动文件中调用C语言函数:void SystemInit (void)这个函数会设置一些...原创 2020-04-17 13:55:31 · 5178 阅读 · 0 评论 -
SPI详解,以STM32F4为例
通用SPI有4根线:①时钟线SCK。②主机输出从机输入MOSI。③主机输入从机输出MISO。④片选CS。推挽上拉master output slave in简称MOSI, chip select简称CS由以上四根线定义可见,SPI是区分主机、从机的。片选线的作用:主机通过拉低某个从设备的CS,来选中这个从设备。时钟SCK只能由主机发出,从机被这个SCK驱动。根据SCK的极性(...原创 2020-03-02 12:04:27 · 7248 阅读 · 0 评论 -
STM32的Code/RO/RW/ZI区、Flash/Ram的占用情况、堆栈大小Stack_Size/Heap_Size的设置
以cortex-M3为例,例如STM32F103这篇文章要讲2个问题:1、编译出的程序(指令)、变量的存放位置、大小?2、在代码和keil中,“堆、栈”两者的大小如何设置?keil编译完成后,会有提示,形如:Program Size: Code=1148 RO-data=424 RW-data=20 ZI-data=1636 其中:①Code为代码,本质上就...原创 2019-10-15 18:37:37 · 16860 阅读 · 6 评论 -
查看/修改STM32的时钟频率+精确测量程序运行时间+测量不准怎么办+delay函数
一、查看STM32各个时钟的频率#include "stm32f10x_rcc.h"提供了查看时钟频率的函数:void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks);把RCC_Clocks添加到watch窗口用jlink观察即可,或者用串口把数据打印出来也行。可以看到,所有的时钟都列出来了,其中系统时钟为SYSCLK,其值为0...原创 2019-01-22 16:33:28 · 23673 阅读 · 0 评论 -
STM32如何查看哪句代码引发的hardFault?
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。STM32出现硬件错误可能有以下原因:(1)数组越界操作;(2)内存溢出,访问越界;(3)堆栈溢出,程序跑飞;(4...转载 2019-03-23 15:08:02 · 4321 阅读 · 1 评论 -
STM32/ARM术语:处理者模式/线程模式、特权级/用户级
http://blog.sina.com.cn/s/blog_98ee3a930100ymvd.html上面这篇文章讲的是双堆栈指针的问题,提到:模式分为两种:处理者模式(handler)和线程模式(thread);权限级别也分为两种:特权级别、用户级别。转载:https://blog.csdn.net/lushoumin/article/details/78640850最关键...原创 2018-05-21 22:58:04 · 12039 阅读 · 0 评论 -
STM32使用FIFO实现USART串口发送中断
fifo就不要造轮子了,用现成的就行了。linux内核中有目前人类写出的基于c语言的最强FIFO,请自行搜索学习《巧夺天工的kfifo》,或者我的另一篇博文《整数的环回特性》。直接把最常用的几个函数拷贝到STM32工程文件里,顺便把kfifo结构体中的自旋锁成员给屏蔽掉,这玩意只在多核才有用,在单核的32上没有作用,直接注释掉就行。然后把源码中自旋上锁、自旋解锁分别改成STM32的开中断...原创 2019-05-28 10:08:57 · 14926 阅读 · 3 评论 -
IIC/I2C/i2c协议编程要点,模拟I2C示例代码
对于IIC编程来说,以下几点最为重要:1、SCL和SDA必须用硬件或者软件上拉。2、接收方总是在SCL为高电平期间采样bit位,等价于:发送方必须在SCL高电平期间保持SDA不变;3、Ack的本质上就是发送1个bit的数据,它发生在接收完一个字节后(接收方可能是主机也可能是从机),也即第9个SCL的高电平期间。在SCL高电平期间,若SDA为0,就称为ACK,若SDA为1(默认上拉),称...原创 2019-01-22 11:39:18 · 1985 阅读 · 0 评论 -
STM32使用中断屏蔽寄存器BASEPRI保护临界段+中断分组+抢占/响应优先级概念
如果某些代码段不允许被中断打断,那么这段代码就必须用关中断的方式给保护起来,在UCOS中可以看到,一般保护方式有3种:(1)关闭中断(总中断或者指定的几个中断),执行临界段,开启中断(总中断或者指定的几个中断)。这个方法的弊端有两个:①执行完临界段之后中断总是打开的,即使在关闭中断之前,中断明明没有打开;②会干扰一些重要的中断的执行,例如systick,高精度定时器等。(2)把中断状态压栈...原创 2019-05-30 10:33:08 · 10518 阅读 · 4 评论 -
STM32+MS5611气压计测量海拔,IIC方式
气压转海拔的经验公式,自行搜索《气压温度求海拔高度》《关于大气压力与海拔高度经验计算公式的讨论》,这里贴两个参考公式:或者: 也即https://wenku.baidu.com/view/87130b0d168884868762d67a.html?from=search硬件连接:PS引脚决定了MS5611从哪个接口输出数据,PS拉高代表使用IIC接口,拉低使用SPI接口。...原创 2019-06-05 11:37:37 · 10163 阅读 · 8 评论 -
利用整数的环回特性打造高效计时器、补码反码、负数的内存布局
对于任意一个uint8的数字x,一定有:式① x + (~x) = 255 = (1111_1111)b 其中"~"是标准C语言运算符:按位取反式② x + (-x ) = 0 = (0000_0000)b那么① + 1 =255+1= (1111_1111)b + (0000_0001)b = (1_0000_0000)b,(1_0000_0000)...原创 2019-05-30 21:12:32 · 1103 阅读 · 0 评论 -
发送与解析不定长报文的标准流程
定长报文处理起来很简单,大多通信协议的报文结构都是这样的:stc-body-check-tail,假设每帧报文长为L字节。说明:stc(start char)为报文头字符,check为校验字(和校验、CRC校验等),tail为报文尾,也可以没有尾,很多协议会把校验字当做尾。1、把收到的字节都存进fifo,并发出通知,在通知的回调中开始处理报文2、通知的回调函数:(1)从fifo中p...原创 2019-07-18 10:40:28 · 4645 阅读 · 5 评论 -
Keil打开工程时,解决“Loading PDSC Debug Description Failed”错误
网上搜到一个方法是,把Keil.STM32Lxxx_DFP.pdsc文件中,删除行“Message(2, "Not a genuine ST Device! Abort connection.");”,这个方法属于掩耳盗铃,只是不让他弹出错误而已。正确的解决方法是,安装与keil版本相匹配的pack包,以我自己的工程为例:我安装的keil是5.18,我下载了三个版本的pack,如下图:...原创 2019-09-12 11:42:26 · 28311 阅读 · 16 评论 -
STM32F1xx的IIC/I2C通信+推挽/开漏区别+是否上拉
一、硬件配置相关IIC的SCL和SDA都要求接上拉电阻,也即,只要主机和从机都还没开始干活,那么SCL和SDA就都是空闲的(默认的高电平状态被称为“空闲”,也可以称总线被“释放”),同理,SCL或SDA为low时,就称总线被占用或正忙。IIC协议要求:SCL和SDA必须都是【开漏+上拉】!简单些一下开漏和推挽的区别:参考《从硬件分析推挽输出和开漏输出详细区别》(1)推挽:写1时,GP...原创 2019-01-22 15:06:23 · 7527 阅读 · 4 评论