打印

[经验] STM32知识盘点,这篇够全了!

[复制链接]
298|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
王栋春|  楼主 | 2023-2-25 23:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、 SYSCLK 时钟源有三个来源:HSI RC、HSE OSC、PLL
2、 MCO[2:0]可以提供 4 源不同的时钟同步信号,PA8
3、 GPIO 口有两个反向串联的二极管用作钳位二极管。
4、 ICode 总线,DCode 总线、系统总线、DMA 总线、总线矩阵、AHB/APB 桥
5、在使用一个外设之前,必须设置寄存器 RCC_AHBENR 来打开该外设的时钟
6、 STM32 复位有三种:系统复位、上电复位、备份区域复位。其中系统复位除了 RCC_CSR 中的复位标志和 BKP 中的数值不复位之外,其他的所有寄存器全部复位。触发方式例如外部复位、看门狗复位、软件复位等;
电源复位由于外部电源的上电 / 掉电复位或者待机模式返回。复位除了 BKP 中的寄存器值不动,其他全部复位;
备份区域复位的触发源为软件复位或者 VDD 和 VBAT 全部掉电时。
7、 (NestedVectored Interrupt Controller)NVIC 嵌套向量中断控制器,分为两种:抢先式优先级(可嵌套)和中断优先级(副优先级,不能嵌套)。
两种优先级由 4 位二进制位决定。分配下来有十六种情况:
8、自动装载寄存器和影子寄存器:前者相当于 51 当中的溢出设定数值。而影子寄存器顾名思义是影子,就是寄存器的另一分 copy。
实际起作用的是影子寄存器,而程序员操纵的则是自动装载寄存器。如果 APPE 位使能,表明自动装载寄存器的值在下一次更新事件发生后才写入新值。
否则,写入自动装载寄存器的值会被立即更新到影子寄存器。
9、计数器的数值与输出比较器相等时,翻转输出信号
10、ARM 公司只生产内核标准,不生产芯片。ST、ti 这样的公司从 ARM 公司那里购买内核,然后外加自己的总线结构、外设、存储器、时钟和复位、I/O 后就组成了自己的芯片。
11、电容触摸屏原理:通过充放电的曲线不同来检测是否被按下。实际的实验过程中,TPAD 可以用一块覆铜区域来替代,通过电容的充放电常数来确定是否按下。
12、OLED,即有机发光二极管,又称为有机电激光显示。下图为 OLED 的 GRAM 与屏幕的对应表
PAGE2 单独列出来:
13、USART 可以操纵 SPI 设备。不过最大频率只有 4.5MHz
14、使用 I/O 口时应该注意的问题
15、ADC 的 Vref+和 Vdda 与 VSS,Vref- 一定要加高质量的滤波电容,切靠近单片机
16、在 STM32 内部,FSMC 的一端通过内部高速总线 AHB 连接到内核 Cortex-M3,另一端则是面向扩展存储器的外部总线。
内核对外部存储器的访问信号发送到 AHB 总线后,经过 FSMC 转换为符合外部存储器通信规约的信号,送到外部存储器的相应引脚,实现内核与外部存储器之间的数据交互。
17、FSMC 中的 DATASET 和 ADDSET 的设置需要参看外部存储器的时序图来确定。
一般而言,DATASET 指的是数据建立时间,也就是读 / 写信号开始到读 / 写信号停止(上升沿存储数据)的持续时间。(一般来说写比读快!)
而 ADDSET 指的是地址建立时间,指的是片选之后到读 / 写操作之前的时间,这是针对 SRAM 来说的,如果操纵的是 TFT,不存在地址线,所以此时的 ADDSET 就是读 / 写信号结束到 RS 电平的转换时间。
18、
19、
20、FSMC 的三个配置寄存器:FSMC_BCRx(片选控制配置)、FSMC_BTRx(片选时序)、FSMC_BWTRx(片选写时序)。
21、RTC 时钟配置必须要用到 BKP 寄存器,BKP 寄存器在单片机复位、电源复位、待机唤醒模式下是不会更改值的,他的供电由 VDD 供电,VDD 被切断后自动切换至外部的 VBAT 供电。
22、要修改 BKP 寄存器的值,必须取消其写保护的标志。BKP 寄存器在上电时自动写保护。
23、Stm32 有三种省电模式:
三种省电模式中,耗电量从上到下依次降低,待机模式的电流仅为 2uA。
24、从待机模式中唤醒单片机等效于让单片机复位,但是电源寄存器的值会有一个标志位指示单片机是被唤醒的,不是被复位的。
25、ADC 的时钟不要超过 14MHz,否则转换精度会下降。最大转换速率为 1MHz,即转换周期为 1us(14MHz,采样周期为 1.5 个 ADC 时钟)
26、Tcovn=采样时间+12.5 个周期。采样时间尽量选长一点,这样精度高一些,但是转换速率下降,这也是有利必有弊。
27、
28、拿 ARM7TDMI 来说,T 代表 Thumb 指令集,D 是说支持 JTAG 调试(Debugging),M 意指快速乘法器,I 则对应一个嵌入式 ICE 模块。
29、MMU 作为嵌入式处理器与应用处理器的分水岭标志 A 具有内存管理单元的嵌入式处理器可以定位为应用处理器。
这么说 M 系列和 A 系列的处理器的区别在于 A 系列的处理器具有 MMU 单元可以进行内存模块的管理。
30、ARM 处理器有两种状态:ARM 状态和 Thumb 状态。
31、这张图说明了一切:Thumb2 指令集做了一件很伟大的事情:将 16 位和 32 位的指令集融为一体,兼容性非常强!(这么说 CM3 不支持某些 32 位 ARM 指令集)
32、
33、MSP 是系统复位后使用的堆栈指针,PSP 由用户的代码使用。两个堆栈指针为 4 字节对齐!!
34、在 ARM 编程领域中,凡是打断程序运行的事件,统称为异常(exception)。
35、因为存在 LR(链接寄存器),所以可支持 1 级的子程序调用而不用压栈到内存,大大提高了运行速度。这就是说,我们在编程的时候,一级调用是不会耗费太多时间的,除非是二级调用!
36、处理器有两种操作模式:handler 模式和线程模式。
处理器也有两种特权分级:特权级和用户级。这张图说明了一切:复位进入特权级线程模式,如果有异常,进入特权级的 handler 模式处理异常或中断例程,然后返回至特权级线程模式。通过修改 CONTROL 寄存器可以进入用户级线程模式。
37、两个高级定时器 TIM1 和 TIM8 是挂接在 APB1 总线上
38、STM32 的外部中断是以组来区分的,也就是说 PA0,PB0,PC0 单片机是无法区分其中哪个触发的中断à均为 EXIT0 线中断服务例程。
所以,外部中断支持 16 路的中断分辨率。从另一个方面来讲,我们可以设置 GPIO_EXTILineConfig(GPIO_PortSourceGPIOx, GPIO_PinSourcex);来开通中断线实现组内的不同中断。
39、DAC 有两个寄存器,一个是 DHR(Data HoldingRegister)数据保持寄存器,一个 DOR(Data Output Register)数据输出寄存器。
真正起作用的是 DOR 寄存器,该寄存器把值给数模转换发生单元输出以 VREF+为参考电压的电压值。
如果是硬件触发转换,系统将在 1 个 ABP 时钟周期后把值给 DOR,如果是软件触发转换,时间为 3 个 APB 时钟周期。然后,均等待 Tsetting 时间(Typical 为 3us,Max 为 4us)后真正输出电压值。
40、DAC 分 8 位模式和 12 位模式,其中后者可以选择左右对齐
41、DMA 仲裁器分为软件和硬件两种。软件部分分为 4 个等级,分别是很高优先级、高优先级、中等、低。硬件部分由通道的大小来决定优先级,越低优先级越高。
42、DMA 有一个实时的传输数据量寄存器叫做 DMA_CNDTR,最大值为 65535,存放的是当前传输所要传输的数据量。当数据量变为 0 时,表明传输完成。
43、CAN 总线(ControllerArea Network)。CAN 控制器根据两根线上的电位差来判断总线电平,总线电平又分为显性电平和隐性电平,二者必居其一。
44、CAN 总线具有 6 个特点:
1、多主控制
2、系统若软性
3、通讯速度较快,通讯距离较远
4、具有错误检测、错误通知和错误恢复功能
5、故障封闭,当总线上的设备发生连续故障错误时,CAN 控制器会把改控制器踢出总线
6、连接节点多。理论上可以无限制加载,但是受到时间延迟和电气负载的限制,实际数目是有限制的。降低传输速度可以适当增加可挂接负载个数。
45、CAN 协议有两个标准,ISO11898(针对 125kbps~1Mbps 的高速速率)和 ISO11519-2(125kbps 以下的低速速率)
46、
47、CAN 协议的有 5 种类型的帧:数据帧、遥控帧、错误帧、过载帧、帧间隔。其中前两种帧有标准格式(11 位 ID)和扩展格式(29 位 ID)。
48、数据帧构成:
(1) 帧起始。表示数据开的段帧起始。
(2) 仲裁段。表示该帧优先级的仲裁段。
(3) 控制段。表示数据的字节及保留位段。
(4) 数据段。数据的内容,一帧可发送 0~8 个字节的数据。
(5) CRC 段。 检查帧的传输错误段。
(6) ACK 段。 表示确认正常接收的段。
(7) 帧结束。 表示数据的段帧结束。
49、Stm32f103 系列只有一个 CAN 控制器,有 3 个发送邮箱和 3 级深度的 2 个 FIFO,14 个过滤组器。
50、STM32 的每个过滤组可以配置为 1 个 32 位过滤器和 2 个 16 位过滤器。除此之外,还可以配置为屏蔽位模式(ID+屏蔽)和标识符列表(ID 和屏蔽寄存器均用来做 ID 寄存器)模式。
51、CAN 接收到有效报文被放置在 3 级邮箱深度的 FIFO 中,FIFO 完全由硬件来管理。
52、CAN 总线的波特率
53、触摸屏一般分为电阻式触摸屏和电容式触摸屏。前者检测触摸的位置原理是利用触摸屏控制器中的 A/D 转换器经过两次 A/D 读值后得出 X 和 Y 的坐标值。注意:这个 X 和 Y 的值是相对于触摸屏的,而非 LCD 屏。
所以在这里需要注意两个概念:触摸屏和 LCD 屏。这是两个不同的概念,也是两个不同的物理结构,其中电阻触摸屏是由上下两个导电层中间夹着一层非常薄的透明隔层;而 LCD 就是指显示屏。
54、电阻触摸屏有 X 和 Y、X 和 Y 的比例因子、坐标轴方向、偏移量。LCD 也有自己的这些参数。两者完全不相干,所以在定位的时候需要进行坐标转换。公式:
通过对屏幕的四个点进行校准,得到四元一次方程,求解即可。
55、NEC 协议的数据帧格式:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是 8 位数据格式。按照低位在前,高位在后的顺序发送。
56、NEC 协议在发送的时候,会有 560us 的 38KHz 的载波信号,而在接收的时候这部分载波信号被认定为低电平,而剩余的(2.25ms-650us)的逻辑“1”和(1.12ms-650us)的逻辑“0”时间则被认定为高电平。
57、在单位时间内的位移被定义为速度,速度有线速度和角速度之分,分别对应两种传感器测量这两种不同的速度:线速度传感器(加速度计)、角速度传感器(陀螺仪)。
前者多应用在静态或者低慢速运动中的姿态求解,后者多应用在动态运动中姿态求解。
58、根据标准约定,零加速度(或零 G 准位)通常定义为相当于最大输出值(12 位输出为 4096,10 位输出为 1024 等)一半的输出。对于提供 12 位输出的加速度计,零 G 准位将等于 2048。
输出大于 2048 表示正加速度。输出小于 2048 表示负加速度。加速度的数量通常用单位 g (1g = 9.8m/s2 = 重力加速度)表示。
通过确定测量的输出与零 G 准位之间的差值,然后除以加速度计的灵敏度(用计数 /g 或 LSB/g 表示)来计算加速度。
对于提供 12 位数字输出的 2g 加速度计,灵敏度为 819 计数 /g 或 819 LSB/g。加速度等于:a = (Aout - 2048)/(819 计数 /g),单位为 g。
59、加速度计测得的加速度的方向和设备设定的坐标系是相反的,因为原理表明在测量力的时候采用的是非惯性系参考系,而我们高中时代研究的坐标系是惯性系参考系,前者在物体进行运动产生加速度时,假想一个与速度方向相反的力作用在物体上,这个力就是惯性力;
后者我们说不存在惯性力,只说存在惯性,因为在惯性坐标系中,我们研究的是物体,而非坐标系(即假定坐标系相对地球静止),当我们把坐标系也考虑在内时,当坐标系运动,就产生了惯性力 f,这种力作用会假想作用在物体上,只是与运动方向相反。
60、由上可知,加速度计的本质是测量力而非加速度。
61、NRF24L01 工作在 2.4GHz 的频段,由于频段频率较高,所以传输速率较快,为 2Mbps。
62、STM32 的闪存模块由:主存储器、信息块和闪存存储器接口寄存器 3 个部分构成。
主存储器用来存放代码和 const 常量;信息块由两个部分组成:启动程序代码、用户选择字节。
其中启动程序代码为 ST 公司自带的启动程序,用于串口下载。
最后的闪存存储器接口寄存器用于控制整个对闪存区域的操作。
63、CPU 的运行速度比 FLASH 的操作速度快的多,一般 FLASH 的最快访问速度≤24Mhz。如果 CPU 的速度超过这个频率,那么在读取 FLASH 的时候必须加入等待时间(FLASH_ACR 设置)。
64、FLASH 编程时,写入必须为半字(16 位)。并且在写入的时候必须保证所写区域的数据必须为 0xFFFF。
65、STM32 的 FSMC 有 HADDR[27:0],其中[27:26]用来选择 BANK 区域的 4 个不同块。
剩下的[25:0]则用来连接外部存储区域的地址线 FSMC_A[25:0]。
如果数据宽度是 8bit,此时的 HADDR[25:0]和 FSMC_A[25:0]是完全对应的。
如果数据宽度是 16bit,此时的 HADDR[25:1]和 FSMC_A[24:0]是对应起来的。
需要注意:无论数据宽度是多少,外部的 FSMC_A[0]和 A[0]总是对应的。
66、关于 LB 和 UB 的信号控制是由硬件自动控制的,当 AHB 的数据宽度小于外部存储器的数据宽度时,此时 LB 和 UB 的控制信号自动产生(比如字节读取 / 写入 16bit 的外部存储器)。
67、 attribute (函数属性、变量属性、类型属性等)。如果在使用 SRAM 时,可以采用 u32 sram_array[xx] attribute ((at(0x68000000))代表将外部 SRAM 的空间全部给了 sram_array 这个变量,他具有在 at0x68000000 这个地址的属性。
往里面写值就直接在 SRAM 里面写值。
68、内存管理有一种方式叫做分块式内存管理。
注意表中的分配方向,从顶到底。每一项对应一个内存块。里面的数值代表了内存池的状态:如果为 0,表示该内存没有被分配;如果非 0,那么数值的大小就表示了该块内存被连续占用的内存数。
比如说数值为 20,意思是包括该项在内的内存块被连续占用了 20 块分给了指针。
69、SD 卡的分类:
一般的 SD 卡支持两种传输模式:SD 卡模式(SDIO)、SPI 模式。显然前面一种是专用模式,所以速度比较快。
70、常用的汉字内码系统有 GB2313、GB13000、GBK、BIG5(繁体)。其中 GB2313 只有几千个汉字,而 GBK 则有 2 万多汉字。
71、要显示汉字,采用的方式如果用点阵的形式是不可取的,因为这无法查找汉字。采用的方式就是内码系统。
GBK 标准中,一个汉字对应 2 个字节:前者称为区(0x810xFE)后者为(0x400x7E)和(0x80~0xFE)。前者有 126 个区,后者有 190,那么可以显示的汉字数量有 126*190=23940 个。
根据这两个值用来查找字库,字库中存放的还是每个汉字的点阵数据。
这个字库非常大,如果是 1616 的字体,那么一个字体就需要 32 个字节,如此说来需要 2394032=748K 的空间,可见非常大,所以需要外部的 Flash 来存储这个字库。
72、由于汉字内码系统不具有国际通用性,但是 Unicode 几乎把所有的语言都放置进来,这样在单片机中操作汉字时,就需要将 GBK 和 Unicode 转化。
尤其是在 FATFS 中,创建中文文件名和读取中文文件信息时需要将 Unicode 换转为 GBK 后再进行修改操作,再反转换成 Unicode 保存修改。
这么说,两者的存在是由于标准的不统一,并且 Unicode 中只有 6064 个汉字,而 GBK 显然是一种汉字扩展。
73、BMP 图片编码的顺序是从左到右,从下到上。
74、VS1053 是一款高性能的数字音频解码芯片,从 SD 卡中将 mp3 等音乐音频文件通过 SPI 送给 VS1053 后,由其进行音频解码,输出音乐给耳机。
耳机驱动可以采用 TDA1308 芯片,这款芯片为 AB 类耳机驱动芯片。
75、IAP(In Application Programming)在应用编程是为了后期开发更新程序方便而提出的概念。具体的实现方法如下图所示:
在普通编程中,flash 中的 code 是通过 JTAG 和 ISP 等工具下载到单片机中。
而在 IAP 编程中,flash 被分区为 A 和 B 两个区域,A 区域只允许用 USB/USART 等方式下载,此区域作为更新 B 区域的代码用。
B 区域则是用户的 code 区域,真正的代码在这里被执行,放置的就是 app。
上图表示 STM32 正常运行的流程图,可以看到上电复位后系统从 0x80000004 处开始运行程序,这里放置的是复位中断向量,然后跳转至复位中断程序入口后再跳转至 main 函数运行用户的程序。
上图表示加入 IAP 后的 STM32 程序运行流程图。可以看到上电复位后跳到 IAP 程序的 main 函数处运行 IAP 过程(这个过程就是把下面灰底色块的程序代码烧进 B 区域à代码更新)。
后面的过程和 STM32 正常运行一样,如果出现中断请求,还是跳转到 A 区域中的中断向量表中,然后再跳转到 B 区域的中断服务入口。
76、USB 有四根线,VCC、GND、D+、D-。在 USB 主机上,D+和 D- 均通过一个 15K 的电阻接地,这样两条线均为低电平。
在 USB 设备中,对于高速设备会在 D+通过一个 1.5K 的电阻接到 VCC,而低俗设备会在 D- 通过一个 1.5K 的电阻接到 VCC。
这样主机就可以通过 D+和 D- 的高电平的到来来检测是否有设备接入,并且识别高低速设备。
77、UCOSII 是一种实时操作系统,具有执行效率高、占有空间小(最小内核 2KB)、实施性能优良、扩展性强和移植性强等优点。
UCOS 具有多任务并发工作的特点(注意,任何时候只有一个任务能够占用 CPU。并发只是任务轮流占用 CPU 而不是同时工作)。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3521

主题

24506

帖子

71

粉丝