简介:对位操作,由别名转换到位的方法以及一些stm32硬件知识。
Stm32相对于51复杂了太多,之前自己学习方法不对,所以导致花了时间也没什么效果,现在工作了自己也知道该怎么来更好学习了,准备花两周左右看一下stm32中文手册及固件库手册,然后再按照正点原子的不完全手册结合这开发板来学习,也记下学习笔记总结学习、加深记忆。
此次的学习是以STM32F103RBT6作为核心MCU的,其有128k flash、20k sram、2个spi、3个串口、1个usb、1个can、2个12位的adc、rtc以及51个可用的IO口。
笔记一存储器及总线架构
1.Stm32主系统由以下部分构成:
●四个驱动单元:─Cortex??-M3内核DCode总线(D-bus),和系统总线(S-bus)─通用DMA1和通用DMA2
●四个被动单元─内部SRAM
─内部闪存存储器
─FSMC
─AHB到APB的桥(AHB2APBx),它连接所有的APB设备。
2.在每一次复位以后,所有除SRAM和FLITF以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟。所以以后编程的时候要记住设置RCC_AHBENR来使能外设。
3.memory map是很重要的,以前一直没有引起足够的重视,程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。
4.两个位段(bit-band)区,下面的映射公式给出了别名区中的每个字是如何对应位带区的相应位的(相当于51单片机中的P0口操作转换到P0^1的操作):
bit_word_addr = bit_band_base + (byte_offset×32) + (bit_number×4)
其中:bit_word_addr是别名存储器区中字的地址,它映射到某个目标位。
bit_band_base是别名区的起始地址。
byte_offset是包含目标位的字节在位段里的序号
bit_number是目标位所在位置(0-31)
例子:下面的例子说明如何映射别名区中SRAM地址为0x20000300的字节中的位2:0x22006008 = 0x22000000 + (0x300×32) + (2×4).对0x22006008地址的写操作与对SRAM中地址0x20000300字节的位2执行读-改-写操作有着相同的效果。
5.boot0和boot1可以设置stm32启动模式
启动模式选择引脚启动模式说明
(BOOT1 BOOT0)
X0主闪存存储器主闪存存储器被选为启动区域
01系统存储器系统存储器被选为启动区域
11内置SRAM内置SRAM被选为启动区域
当使用ISP下载的时候,选择第三种启动方式。
笔记二CRC计算单元
对于本章,不知道要用到什么地方,不过等以后遇到再说。
CRC用两个数据寄存器和一个控制寄存器,一个数据寄存器用来做计算寄存器,对其写操作作为输入寄存器,输入计算数据;对其读操作作为输出寄存器,输出计算结果。另一个数据寄存器只有低8位有效,可以用来寄存数据;控制寄存器只有0位有效,作为reset位,只能写1,硬件自动清零。
笔记三电源控制及管理
之前学51什么的,电源啊时钟呀都只有一个不需要设置选择,后来工作接触了增强型8051后了解了多个时钟电源后再来学32已经不像之前那样对这么多的时钟电源感到畏惧了,呵呵。。Stm32的工作电压(vdd)在2-3.6v,可以通过内置的电压调节器提供所需的1.8v电源。当主电源(vdd)掉电后,可以通过VBAT引脚为实时时钟(RTC)和备份寄存器提供电源,当主电路中没有设计使用外部电源时,则必须将VBAT连接到VDD引脚上面。还有一点需注意,VDD与VBAT在某些情况下会存在注入电流,所以在外部VBA和电源之间要接一个低压降二极管。
为了提高转换精度,stm32为adc提供了一个独立的电源供电,过滤和屏蔽来自印刷电路板上面的毛刺干扰。
电压调节器总是使能的在复位后,有运转模式、停止模式、待机模式三种工作模式。
Stm32中有一个完整的上电复位(POR)和掉电复位电路(PDR),只要供电电压达到2v则能正常工作。当VDD/VDDA低于VPOR和VPDR时则保持为复位状态。对于可编程电压检测器(PVD)可以利用PVD对VDD电压与电源控制寄存器(PWR_CR)中的PLS[2:0]位进行比较来监控电源,这几位选择监控电压的阀值。
因为之前研究过silab公司出的低功耗无线芯片si100x(增强型8051内核的),所以对stm32的低功耗模式就比较容易理解了,32有睡眠模式、停止模式和待机模式三种低功耗模式,可以通过不同的寄存器操作去实现,这个就不详细说了,了解了大概,以后需要用的时候再详细研究吧。32还提供了一个低功耗模式下的自动唤醒模式,主要依靠rtc(和si100x差不多的,不过si100x还要强大的多)。
对寄存器什么的就等以后用到的时候再查阅相关资料吧,相信那样记忆也会更深刻。
笔记四复位和时钟电路
该32芯片支持三种复位形式,系统复位、上电复位和备份区域复位。
除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器以外,系统复位将复位所有寄存器至它们的复位状态。
当发生以下任一事件时,产生一个系统复位:
1. NRST引脚上的低电平(外部复位)
2.窗口看门狗计数终止(WWDG复位)
3.独立看门狗计数终止(IWDG复位)
4.软件复位(SW复位)
5.低功耗管理复位
可通过查看RCC_CSR控制状态寄存器中的复位状态标志位识别复位事件来源。还存在软件复位和低功耗复位,详细参考中文手册吧。
当以下事件中之一发生时,产生电源复位:
1.上电/掉电复位(POR/PDR复位)
2.从待机模式中返回
电源复位将复位除了备份区域外的所有寄存器。
备份区域拥有两个专门的复位,它们只影响备份区域。
当以下事件中之一发生时,产生备份区域复位。
1.软件复位,备份区域复位可由设置备份域控制寄存器(RCC_BDCR)中的BDRST位产生。
2.在VDD和VBAT两者掉电的前提下,VDD或VBAT上电将引发备份区域复位。
时钟有三种不同的时钟源可以被用来驱动系统时钟(SYSCLK)
●HSI振荡器时钟●HSE振荡器时钟●PLL时钟
这些设备有以下2种二级时钟源:
●40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。
●32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。
高速外部时钟由(HSE)以下两种时钟源组成:
●HSE外部晶体/陶瓷谐振器●HSE用户外部时钟
为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和负载电容器必须尽可能地靠近振荡器引脚。负载电容值必须根据所选择的振荡器来调整。外部时钟信号(50%占空比的方波、正弦波或三角波)必须连到SOC_IN引脚,同时保证OSC_OUT引脚悬空。
还有HSI时钟、PLL时钟、LSE时钟、LSI时钟、时钟安全选择、RTC时钟、看门狗时钟等等也应该理解的这里就不一一做笔记了,反正以后遇到了后再来查阅。
关于系统时钟的选择,当系统复位的时候HIS被默认选为系统时钟,当其他时钟源被选为系统时钟之前,不能被停止。只有当目标时钟源准备就绪了(经过启动稳定阶段的延迟或PLL稳定),从一个时钟源到另一个时钟源的切换才会发生。在被选择时钟源没有就绪时,系统时钟的切换不会发生。直至目标时钟源就绪,才发生切换。在时钟控制寄存器(RCC_CR)里的状态位指示哪个时钟已经准备好了,哪个时钟目前被用作系统时钟。
微控制器允许输出时钟信号到外部MCO引脚。相应的GPIO端口寄存器必须被配置为相应功能。
以下四个时钟信号可被选作MCO时钟:
●SYSCLK●HSI●HSE●除2的PLL时钟
时钟的选择由时钟配置寄存器(RCC_CFGR)中的MCO[2:0]位控制。
笔记五GPIO和AFIO(复用功能I/O)
相当于51单片机I/O口来说,stm32的I/O就要复杂得多了,不仅有多种输入输出方式,还需要配置不同的寄存器来达到相应的功能。
(一)每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器)(GPIOx_IDR,GPIOx_ODR),一个32为置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)及一个32为锁定寄存器(GPIOx_LCKR)。可以将其配置如下模式:
─输入浮空、输入上拉、输入下拉、模拟输入
─开漏输出、推挽式输出、推挽式复用功能、开漏复用功能
可以按照下面的表格对其配置:
表一 端口位配置表
表二输出模式位
复位期间和刚复位后,复用功能未开启,I/O口被配置为浮空输入模式(CNFx[1:0]=01b,MODEx[1:0]=00b)。复位后JTAG相关的引脚被置位上拉或者下拉模式。
所有的端口都可以配置为外部中断模式,不过首先必须配置为输入模式。对于复用功能现在不怎么了解怎么用,可能今天头脑不清晰的原因,不过先不管吧,等以后碰到再说。对gpio还可以进行重新映射以及锁定(即使端口位的配置在下一次复位之前不能改变),关于对输入输出等等功能的配置等以及寄存器以后用的时候一点点的积累吧,现在记住也没用。
上一篇:STM32应用-简单的串口接收与发送程序
下一篇:STM32其他问题集锦
推荐阅读最新更新时间:2024-11-03 12:44