左左右学堂 · 课程目录

第32期 一节课讲明白stm32内部架构

观看B站原视频 · 文稿与高清画面

hello,小伙伴们,大家好。这里是左左右。你是否好奇?指尖大小的这块黑色塑料片。如何成为无数智能设备的大脑?今天,我们将深入STM32F103C8T6的微观宇宙。解锁这颗传奇芯片的内部奥秘。STM32F103C8T6这颗芯片内部有四个驱动单元。他们分别是Cortex M3内核、DCode总线、系统总线、通用DMA1和通用DMA2。

视频画面 02:26.9
视频画面 02:26.9 · 1080P 原图 · 查看对应视频

有四个被动单元。他们分别是内部SRAM、 内部闪存存储器Flash、FSMC。AHB到APB的桥和它连接所有的APB设备。那么,什么是驱动单元?什么又是被动单元呢?驱动单元是指有能力主动发起读写操作的模块,而被动单元只能被动地响应来自主动单元的读写请求。这里的Cortex M3内核就是stm32单片机的CPU,也就是单片机的大脑。

视频画面 01:37.8
视频画面 01:37.8 · 1080P 原图 · 查看对应视频

DMA是我们比较熟悉的,它有许多别名。比如,专业牛马、数据搬运工、CPU小助手等等,这里的Flash相当于电脑的硬盘,用来存储我们编译好的代码。它是非易失性存储器,也就是断电数据不丢失。SRAM相当于点电脑的内存。它属于易失性存储器,数据在断电瞬间即丢失。它是程序的运行空间。

主要用于程序运行时的高速数据存取,读写极快。FMSC用来连接外部的Flash和SRAM。SDIO是用来高速读写SD卡的,这里的ICOode总线是用来读取指令的,也就是读取我们编译好的程序的,而DCOode总线是用来传输数据的,System总线是处理所有不属于I-Code和D-Code专职范围的访问。

比如,片上外设、通过FSMC连接的其他外部存储器等等,这里的APB2总线和APB1总线分别通过桥接1和桥接2连接到了AHB总线。与APB2和APB1连接的都是一些片上外设。这里的GPIO和USART都是我们熟悉的。APB1和APB2的主要区别在于。APB1操作速度上限是36MHz,APB2操作速度上限是72MHz。

视频画面 02:51.4
视频画面 02:51.4 · 1080P 原图 · 查看对应视频
视频画面 03:15.9
视频画面 03:15.9 · 1080P 原图 · 查看对应视频

APB2主要连接的是GPIO、ADC、高级定时器等对速度要求高的外设。APB1主要连接的是I2C、SPI、USART等大部分通用通讯接口。其他一些片上外设我也会在接下来的视频中陆续讲到的。这里有这么多总线其实就是不同的分工而已。不要被密密麻麻的总线吓到,这里的总线矩阵就相当于是个集散中心。

关于stm32的系统架构我们只要有一个宏观的感受就可以了。不用细究。好的,今天的视频就到这里了。您的关注,点赞和收藏是我持续更新下去的最大动力。我们下期见。

我们在给寄存器中P A 15,这一位,置1和,置0时。设置为1,会,将ODR对应的位的值,置为0。设置为1,会,将ODR对应的位的值,置为1。

那么,我们该如何改变其中某一位中的值呢?stm32已经替我想好了。接着,我们来看BSRR这个寄存器。这个寄存器分为低16位和高16位。这里也是分别控制PA0到PA15。

typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;
#define GPIOA                           ((GPIO_TypeDef *)GPIOA_BASE)
#define GPIO_PIN_15                ((uint16_t)0x8000)
#define GPIOA_BASE                 (APB2PERIPH_BASE + 0x00000800UL)
#define APB2PERIPH_BASE       (PERIPH_BASE +          0x00010000UL)
#define PERIPH_BASE                                                      0x40000000UL
uint32_t *GPIOA_ODR = (uint32_t*)0x40010800 + 0x0000000C;
*GPIOA_ODR = 0x00008000;
HAL_Delay(500);
*GPIOA_ODR = 0x00000000;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
HAL_Delay(500);

这里我们打开实现LED小灯闪烁的那期视频的程序。来看看hal库具体是怎么操作寄存器的?打开HAL_GPIO_WritePin这个函数。这两行代码作用是判断我们输入的这两个参数是否合法?

下期视频 改代码 讲bssr寄存器 看输出数据寄存器图片 读源码。

uint32_t    *GPIOA_ODR = (uint32_t*)(0x40010800 + 0x0000000C);
	 *GPIOA_ODR = 0x00008000;
	  HAL_Delay(500);
	  *GPIOA_ODR = 0x00000000;
	  HAL_Delay(500);
uint32_t *GPIOA_ODR = (uint32_t*)(0x40010800 + 0x0000000C);
*GPIOA_ODR = *GPIOA_ODR | 0x1 << 15;
*GPIOA_ODR |= 0x1 << 15;
 HAL_Delay(500);
*GPIOA_ODR = *GPIOA_ODR & ~(0x1 << 15);
*GPIOA_ODR &= ~(0x1 << 15);
HAL_Delay(500);