STM32自学笔记讲解.docx

上传人:b****7 文档编号:8964501 上传时间:2023-02-02 格式:DOCX 页数:21 大小:955.80KB
下载 相关 举报
STM32自学笔记讲解.docx_第1页
第1页 / 共21页
STM32自学笔记讲解.docx_第2页
第2页 / 共21页
STM32自学笔记讲解.docx_第3页
第3页 / 共21页
STM32自学笔记讲解.docx_第4页
第4页 / 共21页
STM32自学笔记讲解.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

STM32自学笔记讲解.docx

《STM32自学笔记讲解.docx》由会员分享,可在线阅读,更多相关《STM32自学笔记讲解.docx(21页珍藏版)》请在冰豆网上搜索。

STM32自学笔记讲解.docx

STM32自学笔记讲解

一、原子位操作:

原子位操作定义在文件中。

令人感到奇怪的是位操作函数是对普通的内存地址进行操作的。

原子位操作在多数情况下是对一个字长的内存访问,因而位号该位于0-31之间(在64位机器上是0-63之间),但是对位号的范围没有限制。

原子操作中的位操作部分函数如下:

voidset_bit(intnr,void*addr)       原子设置addr所指的第nr位

voidclear_bit(intnr,void*addr)     原子的清空所指对象的第nr位

voidchange_bit(nr,void*addr)        原子的翻转addr所指的第nr位

inttest_bit(nr,void*addr)           原子的返回addr位所指对象nr位

inttest_and_set_bit(nr,void*addr)   原子设置addr所指对象的第nr位,并返回原先的值

inttest_and_clear_bit(nr,void*addr) 原子清空addr所指对象的第nr位,并返回原先的值

inttest_and_change_bit(nr,void*addr) 原子翻转addr所指对象的第nr位,并返回原先的值

 

    unsignedlongword=0;

   set_bit(0,&word);/*第0位被设置*/

   set_bit(1,&word);/*第1位被设置*/

 clear_bit(1,&word);/*第1位被清空*/

change_bit(0,&word);/*翻转第0位*/

二、STM32的GPIO锁定:

三、中断挂起:

因为某种原因,中断不能马上执行,所以“挂起”等待。

比如有高、低级别的中断同时发生,就挂起低级别中断,等高级别中断程序执行完,在执行低级别中断。

四、固文件:

固件(Firmware)就是写入EROM(可擦写只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序。

五、固件库:

包含各个外设或者内核的驱动头文件和C文件。

六、TIx的输入捕获滤波器(消抖):

采样频率fSAMPLING,采样次数N,如果以采样频率对一脉冲进行采样时,如果在N个采样方波里该脉宽不变,则视为一次有效的脉冲,否则视为无效的脉冲。

七、高级定时器的PWM互补输出:

常用于X相电机驱动,其中的互补输出则防止电机的死区出现。

八、Systick系统时钟(以cortex-M3为基准):

其两大作用:

1、产生精确的延时

2、提供给操作系统一个单独的心跳(时钟)节拍

Cortex-M3内核中包含一个Systick时钟,其为一个24位递减计数器,计数器设定初始值并使能后,每经一个系统时钟计数值减一,计数到零时COUNTFLAG置位,计数器装载,触发中断。

3、四大寄存器:

(1)、STK_CTRL:

STK控制寄存器

Bit0:

ENABLE

          SysTicktimer的使能位,1使能Systicktimer,0关闭Systicktimer

Bit1:

TICKINT

          异常触发使能位,TICKINT=1,STK_VAL计数到0触发异常;TICKINT=0,不触发异常

Bit2:

CLKSOURCE

          Systick时钟选择位,SysTick=1,时钟为AHB时钟;0时钟位AHB/8(属于它所挂的AHB中。

Bit16:

COUNTFLAG

          计数为0标志位, 当STK_VAL计数到0,此标志位会被置1

(2)、STK_LOAD:

STK装载寄存器位0~23

(3)、STK_VAL:

STK当前值寄存器位0~23。

(4)、STK_CALIB:

九、死区时间控制:

死区,简单解释:

通常,大功率电机、变频器等,末端都是由大功率管、IGBT等元件组成的H桥或3相桥。

每个桥的上半桥和下半桥是是绝对不能同时导通的,但高速的PWM驱动信号在达到功率元件的控制极时,往往会由于各种各样的原因产生延迟的效果,造成某个半桥元件在应该关断时没有关断,造成功率元件烧毁。

死区控制就是在上半桥关断后,延迟一段时间再打开下半桥或在下半桥关断后,延迟一段时间再打开上半桥,从而避免功率元件烧毁。

这段延迟时间就是死区

PWM的上下桥臂的三极管是不能同时导通的。

如果同时导通就会是电源两端短路。

所以,两路触发信号要在一段时间内都是使三极管断开的。

这个区域就叫做“死区”优点就不用说了。

缺点是使谐波的含量有所增加。

死区时间大,模块工作更加可靠,但会带来输出波形的失真及降低输出效率。

死区时间小,输出波形要好一些,只是会降低可靠性,一般为us级。

最佳的设置是:

在保证安全的前提下,越小越好。

以不炸功率管、输出不短路为目的。

十、换相事件(COM事件):

十一、存储器的编码格式:

1、大端格式:

在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,例如存16位宽的数据0x1234,其存储方式如图:

2、小端格式:

低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节,例如存16位宽的数据0x1234,其存储方式如图:

十二、位段与别区名:

现在STM32的位段、位带别名区就是为了实现对位操作的功能,它的对象可以是SRAM、I/O(STM32F407有复位/置位寄存器实现对位操作)和外设空间。

要实现对这些地方的某一位的操作。

它是这样做的:

在寻址空间(32位对应的地址空间为4GB)的另一地方,取个别名区空间,从这个地址开始处,每一个字(32BIT)对应SRAM或I/O的一位。

使用位段的好处:

可以把代码缩小,速度更快,效率更高,更安全。

一般操作要6条指令,而使用位带别名区只要4条指令。

一般操作是读-改-写的方式,而位带别名区是写操作。

防止中断对读-改-写的方式的影响。

映射公式为:

bit_word_addr=bit_band_base+(byte_offsetx32)+(bit_number×4)其中:

—bit_word_addr代表别名区域中将映射到目标位的字的地址

—bit_band_base代表别名区域的起始地址

—byte_offset代表目标位所在位段区域中的字节编号

—bit_number代表目标位的位位置(0-7)

存的时候是以字节的形式存的,但是写入与写出是以32位存的,固结果是位数乘以4,

其中SRAM和外设的位带区域和位带别名如下图:

alias:

别名;

 

十三、SYSCFG寄存器:

想要操作SYSCFG模块寄存器必须先使能SYSCFG模块时钟,RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);

十三、存储器的固定存储映射:

代码区域起始地址为0x00000000(通过ICode和DCode访问),代码区域起始地址为0x20000000(通过ICode访问)。

十三、STM32的自举:

自举就是自己让自己启动吧!

有一个BOOT引脚可以控制通过三种方式中的任何一种启动。

十四、上电、掉电、欠压复位:

欠压复位:

单片机内部电压监控电路形成的异步复位,当电源电压VDD电压小于一定触发阈值时,发出复位信号并保持到电源电压大于欠压复位功能恢复电压。

欠压复位是用来确保单片机的电源并不在有效工作电压范围之内时内部产生复位过程,使得单片机保持在正确的状态中,欠压复位有三个重要的参数:

1)VTR是欠压复位功能恢复电压,大于该电压值的时单片机的欠压复位状态就结束了;

2)VTF是欠压复位功能触发电压,小于该电压值的时单片机将保持欠压复位状态;

3)VHYS是欠压复位的回差电压,VHYS=VTR-VTF;这个电压的主要目的是防止电源有噪声干扰的时候频繁的反弹,一般在0.1~0.2V之间。

如图所示,欠压复位是在电源电压达到VTR以后,内部的计数器才工作,因此在上电复位完成以后,欠压复位继续工作直至欠压复位完成既定的延迟后,整个单片机才会退出复位状态;因此内部引入欠压复位电路对于解决电源电压上升率过快和过慢的情况都有很大的帮助。

需要注意的是低电压的复位电平阈值是和供电电压相关的,并且按照比例设定的无法更改,因此如果系统上不合则需要考虑外部的复位方法。

十四、BOOT设置(BOOT1,BOOT0):

1)(BOOT1=x,BOOT0=0):

主FLASH区,即扇区,正常工作模式。

2)(BOOT1=0,BOOT0=1):

系统存储器,芯片内部一块特定的区域,该区域出厂时预置了一段Bootloader,即ISP程序,这部分已经被固化了,无人能改。

这也是利用串口下载时的第一步:

BOOT1=0,BOOT0=1。

ISP下载模式。

3)(BOOT1=1,BOOT0=1):

SRAM,芯片内置RAM,即内存。

调试模式。

十五、关于串口:

方向以PC机为主

●RTS:

请求发送,PC→→设备

●CTS:

清楚发送,设备→→PC

●DTR:

数据终端准备好,设备→→PC

●DSR:

数据设备准备好,PC→→设备

●DCD:

载波检测

 

十六、关于一键下载原理:

CH340G上电后DTR#和RTS#都为高电平,在用MCUISP烧写软件时,我们在软件下方选择“DTR的低电平复位,RTS高电平进BootLoader”,CH340GIC在实际操作时引脚的变化为“DTR#拉高,RTS#拉低”,即软件设置和实际情况是取非的,相反的。

十七、关于抢占优先级和响应优先级:

STM32(Cortex-M3)中有两个优先级的概念:

抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。

(1)、抢占先式优先级(pre-emptionpriority)

 高抢占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套。

(2)、副优先级(subpriority)

在抢占先式优先级相同的情况下,高副优先级的中断优先被响应;

    在抢占先式优先级相同的情况下,如果有低副优先级中断正在执行,高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应—非抢断式响应(不能嵌套)。

(3)、判断中断是否是被响应的依据

首先是占先式优先级,其次是副优先级;

     占先式优先级决定是否会有中断嵌套;

(4)、优先级冲突的处理

     具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断的嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

   当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。

如果这个两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

十八、结构体成员变量地址对齐方式:

(举例解释说明)

举个例子:

struct {

    char a;    //1byte

    int b;    //4byte

    char c[2]    //2byte

    double d;    //8byte

}Struct_A;

1、8位机里就按字节对齐,那么上述结构体共占用1+4+2+8=15byte。

2、在16位机里,变量就按照2字节对齐,比如a这个成员,虽然是个char类型,地址在0x80000000本身只占1字节,但是下一个成员b却不能使用0x80000001这个地址,而必须使用0x80000002,这就是按字长对齐。

以上结构体占用的空间也就是2+4+2+8=16字节。

3、在32位机中,如果a在0x80000000的话,b只能放在0x80000004,因为这里的字长是4个字节。

以上结构体占用空间4+4+4+8=20字节。

十九、关于STM32F4的RCC:

1、Fpclk是给串口的时钟(PCLK1用于USART2、3、4、5,PCLK2用于USART1,以前说过,PCLK1是由系统时钟分频得来,最大36MHZ,PCLK2是直接由系统时钟得来,最大72MHZ。

二十、关于STM32F4的串口:

1、关于波特率的计算:

USART_BRR:

波特率寄存器,其分为尾数部分DIV_Mantissa和小数部分DIV_fraction,在计算时,尾数部分直接化成二进制存入DIV_Mantissa,而小数部分则要乘以16再存入DIV_fraction。

原理如同以下:

已知一个时间段是<1.1小时>,求相当于

>小时

>分钟。

(再者到二进制小数部分第四位得乘以16)

二十一、关于串口:

1、当勾选发送新行后,串口调试助手在每次发送一段字符后会自动添加0x0d和0x0a的换行符。

2、串口发送数据丢失:

2-1、串口发送第一个字节数据丢失

TC:

发送完成 ,当包含有数据的一帧发送完成后,由硬件将该位置位。

如USART_CR1中的TCIE为1,则产生中断。

由软件序列清除该位(先读USART_SR然后写入USART_DR)。

TC位也可以通过写入0来清除,只有在多缓存通讯中才荐这种清除程序。

 

0:

发送还未完成; 

1:

发送完成。

 

注意到这一句:

由软件序列清除该位(先读USART_SR,然后写入USART_DR)。

也就是说,要先readUSART_SR,然后writeUSART_DR,才能完成TC状态位的清除。

而硬件复位后,串口发送的首个数据之前没有readSR的操作,是直接writeDR,也就是说,TC没有被清除掉。

 因此,

2-1、加了printf()函数后,串口发送字节数据有些丢失

3、printf()中,%d是格式化为整型、%s是格式化为字符串、%lld是格式化为长整型。

4、%04x表示按16进制输出数据,最小输出宽度为4个字符,右对齐,如果输出的数据小于4个字符,前补0,如:

printf("%04x",100);//输出0064100的16进制数是64

5、sprintf()

intsprintf(char*buffer,constchar*format,[argument]…);

参数列表

buffer:

char型指针,指向将要写入的字符串的缓冲区。

format:

格式化字符串。

[argument]...:

可选参数,可以是任何类型的数据。

 

二十二、硬件SPI驱动OLED:

1、首先得讲解BUSY标志与TXE标志,BUSY标志指的是发送缓冲器已空且发送移位寄存器没有数据在发送,也就是没有数据发送任务;TXE标志仅仅指的是发送缓冲器已空,并不指示发送移位寄存器有没有数据。

2、so,问题就来了,为什么STM8用TXE标志就可以发送数据而STM32必须用BUSY标志呢?

因为STM8最快速度执行速度最大是16MHZ,虽然用的TXE标志,但等到下一次发送数据时,由于速度慢,这是发送移位寄存器早就没有数据了,只是BUSY=0;但STM32就不一样了,若用TXE标志,等到下一次发送数据时,由于STM32以168MHZ的速度执行代码,虽然发送缓冲器没有数据了,但发送移位寄存器还有数据没有发送完,所以,这是会出现乱码或者通信失败。

二十三、FSMC(灵活的静态存储控制器):

其支持SRAM、PSRAM、NAND FLASH、NORFLASH。

(1)、SRAM:

静态随机存取存储器。

它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。

◎优点,速度快,不必配合内存刷新电路,可提高整体的工作效率。

◎缺点,集成度低,掉电不能保存数据,功耗较大,相同的容量体积较大,而且价格较高,少量用于关键性系统以提高效率。

(2)、PSRAM:

PSRAM就是伪SRAM,内部的内存颗粒跟SDRAM的颗粒相似,但外部的接口跟SRAM相似,不需要SDRAM那样复杂的控制器和刷新机制,PSRAM的接口跟SRAM的接口是一样的。

容量没有SDRAM那样密度高,但肯定是比SRAM的容量要高很多的,速度支持突发模式,并不是很慢。

(3)、NORFLASH与NANDFLASH:

1、来源

(1)、NORflash是intel公司1988年开发出了NORflash技术。

NOR的特点是芯片内执行(XIP,eXecuteInPlace),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。

NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。

(2)、Nand-flash内存是flash内存的一种,1989年,东芝公司发表了NANDflash结构。

其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。

Nand-flash存储器具有容量较大,改写速度快等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用,如嵌入式产品中包括数码相机、MP3随身听记忆卡、体积小巧的U盘等。

2、NANDflash和NORflash的性能比较

flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。

任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。

NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。

由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。

执行擦除时块尺寸的不同进一步拉大了NOR和NADN之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。

这样,当选择存储解决方案时,设计师必须权衡以下的各项因素。

1、NOR的读速度比NAND稍快一些。

2、NAND的写入速度比NOR快很多。

3、NAND的4ms擦除速度远比NOR的5s快。

4、大多数写入操作需要先进行擦除操作。

5、NAND的擦除单元更小,相应的擦除电路更少。

3、NANDflash和NORflash的接口差别

NORflash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。

NAND器件使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同。

8个引脚用来传送控制、地址和数据信息。

NAND读和写操作采用512字节的块,这一点有点像硬盘管理此类操作,很自然地,基于NAND的存储器就可以取代硬盘或其他块设备。

4、NANDflash和NORflash的容量和成本

NANDflash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。

NORflash占据了容量为1~16MB闪存市场的大部分,而NANDflash只是用在8~128MB的产品当中,这也说明NOR主要应用在代码存储介质中,NAND适合于数据存储,NAND在CompactFlash、SecureDigital、PCCards和MMC存储卡市场上所占份额最大。

(4)存储器的分类:

(5)、异步模式、同步模式、突发模式、复用和非复用模式。

1)、异步SRAM正如其名称,不是与特定的时钟信号同步运行,而是根据输入信号的状态运行的。

因为没有信号表示读取时已确定了有效数据,也没有信号表示写入时已接收到数据,所以,需要获取制造商的数据手册,根据时序图,按“应该已读出有效数据”及“应该能接收数据”这样的条件,进行存储器的设计。

2)、突发(Burst)模式:

包括突发长度(BL)、突发类型(BurstType)、CAS延迟(CASLatency)、运行方式(OperatingMode)和写入突发模式。

CAS:

列地址选通信号;RAS:

行地址选通信号

CL:

CAS的潜伏期,在选定列地址后,就已经确定了具体的存储单元,剩下的事情就是数据通过数据I/O通道(DQ)输出到内存总线上了。

但是在CAS发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一笔数据输出的这段时间,被定义为CL。

 

1、概念:

所谓的“突发”是指当我们对一个地址进行寻址并操作完成后,不必再重新对下一个地址进行寻址,而是直接进行操作。

这样就节省了很多的时间。

具体的情况也很简单就是节省了延时的那段时间。

读:

初始化→发行地址→RCD→发列地址→CL→数据

写:

初始化→发行地址→RCD→发列地址→数据(CL、RCD)

2、突发长度突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(BurstLengths,简称BL)。

3、对于存储bank。

进行寻址时需要先确定是哪个L-Bank,然后再在这个选定的L-Bank中选择相应的行与列进行寻址。

对内存的访问,一次只能是一个L-Bank,而每次与CPU交换的数据就是 L-Bank 存储阵列中一个“存储单元”的容量。

SDRAM内存芯片一次传输的数据量就是芯片的位宽,那么这个存储单元的容量就是芯片的位宽(也是 L-Bank 的位宽)。

上图为4BANK内存颗粒内部结构示意图。

内存芯片容量的计算方法为:

存储单元数量行数×列数(得到一个 L-Bank 的存储单元数量)×L-Bank 的数量。

在很多内存产品介绍文档中,都会用M×W 的方式来表示芯片的容量。

M 是该芯片中存储单元的总数,单位是兆,W 代表每个存储单元的容量,也就是 SDRAM 芯片的位宽(Width),单位是 bit。

计算出来的芯片容量也是以 bit 为单位,但用户可以采用除以 8 的方法换算为字节(Byte)

二十四、关于FSMC中定义结构体中变量的地址

typedefstruct

{

vu16LCD_REG;

vu16LCD_RAM;

}LCD_TypeDef;

//使用NOR/SRAM的Bank1.sector4,地址位HADDR[27,26]=11A6作为数据命令区分线

//注意设置时STM32内部会右移一位对其!

1111110=0X7E

#defineLCD_BASE((u32)(0x6C000000|0x0000007E))

#defineLCD((LCD_TypeDef*)LCD_BASE)

将这个地址强制转换为LCD_TypeDef结构体地址,那么可以得到LCD->LCD_REG的

地址就是0X6C00,007E,对应A6的状态为0(即RS=0),而LCD->LCD_RAM的地址就是0X6C00,0080(结构体地址自增),对应A6的状态为1(即RS=1)。

二十四、break,continue,return的区别及作用

 1、return语句的作用

   

(1)return从当前的方法中退出,返回到该调用的方法的语句处,继续执行。

   

(2)return返回一个值给调用该方法

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1