stm32主要由内核和片上外设组成。与电脑相比,内核就当于cpu,外设相当于主板、内存、显卡、硬盘。 片上外设有GPIO、USART、I2C、SPI。 驱动单元2 v) n2 o5 q+ M ICode总线 内核通过ICode总线来粗去存放在flash中的指令 DCode总线 常量放在flash中,变量放在SRAM中0 F8 a' T1 n2 x* X% ?8 p- [ System总线 用来访问外设的寄存器: v6 b% ?" I! \8 ?# M/ a4 t) w$ C DMA总线 主要用来传输数据。DCode和DMA都能用来传输数据,在取数的时候通过总线矩阵来决定哪个总线取数" @+ {% t, `% m# Q) U3 u( h' n 被动单元9 h1 z/ W: [% m; w 闪存存储器(flash) 用来存放编写好的程序. V# C) }; c% f- t i5 k2 [( Y SRAM 程序的变量,堆栈等开销 FSMC 用来扩展静态内存 AHB到APB的桥 ! X# Y% I) ^8 E! D. i* F 存储器映射 被动单元Flash、RAM、FSMC、和AHB到APB的桥,这些功能部件共同排列在一个4GB的地址空间中。在编程的hi后,可以通过地址找到它们,进而操作它们。在这4GB的地址空间中,ARM将它平均分成了8个块,每个块也规定了用途。8 M% t5 s5 @+ P5 w$ k 寄存器映射- _. Q! @. `2 g, ?& }* e! E 存储器本身不具有地址信息,它的地址是由芯片厂商或者用户分配,给存储器分配地址的过程成为存储器映射4 i3 V: C3 @8 h% y/ ~ 在存储器Block2这块区域上设计的是片上外设,以4个字节为一个单元,共32位,每一个单元对应着不同的功能。如果我们想驱动这些外设工作,我们可以找到每个单元的起始地址,然后通过C语言指针操作的方式来访问这些单元。但是这种方式不断不好记还容易出错,因此,我们可以根据每个单元的功能的不同,以功能为名给这个内存单元取以一个别名,这个别名就是经常说的寄存器。! m. v4 S" E' a. M+ P1 Z7 N 比如,我们找到GPIOB端口的输出数据寄存器ODR的地址是0x40010C0C,ODR寄存器是32位,低16位有效,对应16个外部IO,写0/1对应的IO输出低/高电平。0x40010C0C在我们看来是GPIOB端口ODR的地址,但是在编译器看来,这只是一个普通的变量,是一个立即数,要想让编译器也认为是指针,得进行强制类型转换,把它转换成指针,即(unsigned int *)0x40010C0C,然后再对这个指针进行*操作。 寻址空间 各种单位运算关系0 c! E' a7 p( A- t7 }8 H1 G 版权声明:weich37 |
基于STM32的BootLoader经验分享
基于STM32如何选择 S2-LP 的外部晶体经验分享
基于是STM32的BLE 设备地址经验分享
基于ToF传感器的3D手势识别
NUCLEO-U545RE-Q评测(2)运行环境建立
基于使用 STM32 TT 类型 IO 的注意事项经验分享
基于STM32使用Framebuffer_Analyzer工具调试图像显示
ST安全连接,护航工业物联网一路前行
基于STM32的TouchGFX 4.22解锁新功能经验分享
基于STM32的MPU子区经验分享