STM32之寄存器

本文介绍了ARM架构的基础知识,重点分析了STM32F103芯片的Cortex-M3内核和其片上外设,包括ICode、DCode、DMA总线,以及FSMC、寄存器、存储器映射等内容,为理解STM32编程打下基础。
摘要由CSDN通过智能技术生成

在学习STM32之前有必要了解一下ARM架构,以下相关ARM架构的知识来自百度百科​:​

ARM架构,曾称进阶精简指令集机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)架构。还有基于ARM设计的派生产品,重要产品包括MarvellXScale架构和德州仪器OMAP系列。

STM32芯片内部构造

以STM32F103为例,它采用的是Cortex-M3内核,内核即CPU,他是由ARM公司设计。内核之外的部件被称为片上外设,如GPIO、USART、I2C、SPI等都叫做片上外设。如下图所示:

芯片和外设之间是通过各种总线连接的,其中驱动单元有四个,被动单元也有四个。驱动单元就是平时所说的CPU,被动单元指的是外设。下面简要介绍一下各个部件。

驱动单元 
  • ICode 总线 ICode 中的 I 表示 Instruction,即指令。内核通过ICode 总线读取内部FLASH代码指令来执行程序。

  • DCode 总线 DCode 中的 D 表示 Data,即数据,那说明这条总线是用来取数的。因为数据可以被 Dcode 总线和 DMA 总线访问(向flash,SRAM,或外设数据寄存器里面取数据),所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数,取到的数据可以暂存在Cortex™-M3内核里面的寄存器在进行处理。 

  • 系统总线System 系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这根系统总线来完成的。

  • DMA 总线 DMA 总线与DCode总线一样主要是用来传输数据,但Dcode总线传输数据要占用内核(cpu)的资源,而DMA总线相当于独立于内核cpu但帮助内核cpu传输数据而不用占用内核(cpu)的资源,就是在DMA传输数据的同时内核cpu可以干别的事情比如点亮一个LED灯 

  • 总线矩阵 总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁,仲裁利用轮换算法。因为数据可以被 Dcode 总线和 DMA 总线访问,数据可以是在某个外设的数据寄存器,可以在SRAM,可以在内部的 FLASH。所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数 

被动单元 
  • 内部FLASH 简单介绍在flash存储内容:我们写好的程序编译之后都是一条条指令(二进制代码),存放在 FLASH 中,我们常量或常变量C 语言中的 const 关键字修饰也存放在FLASH

  • 内部SRAM 就是我们常说的电脑内存条,程序函数内部的局部变量和全局变量,堆(malloc分配)栈(局部变量)等的开销都是基于内部的SRAM。内核通过 DCode 总线来访问它 

  • FSMC FSMC 的英文全称是 Flexible static memory controller,叫灵活的静的存储器控制器,是 STM32F10xx 中一个很有特色的外设通过FSMC我们可以扩展内存,如外部的SRAM,NANDFLASH 和 NORFLASH。但有一点我们要注意的是,FSMC 只能扩展静态的内存,即名称里面的 S:static,不能是动态的内存,比如 SDRAM 就不能扩展。 

  • AHB 到 APB 的桥 两个AHB/APB桥在AHB和2个APB总线间提供同步连接。APB1操作速度限于36MHz,APB2操作于全速(最高72MHz),上面挂载着 STM32 各种各样的特色外设。我们经常说的 GPIO、串口、I2C、SPI 这些外设就挂载在这两条总线上,这个是我们学习 STM32 的重点,就是要学会编程这些外设去驱动外部的各种设备。

          

什么是寄存器?

寄存器是CPU内部用来存放数据的小型存储区域,用于暂时存放参与运算的数据和运算结果,所以被叫做寄存器。    

寄存器电路是由锁存器或触发器构成的,一个触发器或锁存器储存一位二进制数,一个8为寄存器至少含8个触发器或锁存器。

寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。也可以说是给特定功能的单元取的别名,寄存器是单片机内部的控制机构。

寄存器地址=总线基地址+外设基于总线地址的偏移量+寄存器相对于外设基地址的偏移量

存储器映射:芯片厂商给存储器分配地址的过程就成为存储器映射,如果给存储器再分配一个地址就叫存储器重映射。寄存器是一类特殊的存储器,它的每个位都有特定的功能,可以实现对外设功能的控制,给寄存器的地址命名的过程就叫做寄存器映射。

在STM32中,ST官方将各个外设寄存器的地址进行了封装,总线或外设都以他们的名字作为宏名,最后把寄存器封装成结构体。在操作寄存器时,我们可以直接使用宏定义好的结构体类型指针,使用时直接用相应指针对结构体成员寄存器进行访问即可。

接下来的一段时间里会对STM32重新进行认识,会对其中的的相关知识进行梳理。欢迎关注我的公众号,晚霁见月,我们一同交流学习。

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在STM32中使用寄存器编写串口空闲中断的步骤: 1. 首先,需要使能串口空闲中断。这可以通过设置USART_CR1寄存器中的IDLEIE位来实现。具体来说,将IDLEIE位设置为1,可以使能串口空闲中断。 2. 接下来,需要在NVIC中使能串口空闲中断。这可以通过设置NVIC_ISER寄存器中与串口空闲中断对应的位来实现。具体来说,将NVIC_ISER寄存器中与串口空闲中断对应的位设置为1,可以使能串口空闲中断。 3. 当串口接收到数据时,会产生中断。在中断服务程序中,需要读取USART_SR寄存器中的IDLE位,以判断是否是串口空闲中断。如果IDLE位被置位,说明是串口空闲中断,可以进行相应的处理。 4. 在处理完中断后,需要清除USART_SR寄存器中的IDLE位。这可以通过读取USART_SR寄存器,然后写入USART_DR寄存器来实现。 下面是一个示例代码,用于在STM32中使用寄存器编写串口空闲中断: ```c void USART_IRQHandler(void) { if (USART1->SR & USART_SR_IDLE) { // 处理串口空闲中断 // ... // 清除IDLE标志位 USART1->SR; USART1->DR; } } int main(void) { // 使能串口1 RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // 配置串口1 USART1->BRR = 0x1A0; // 波特率为115200 USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_IDLEIE; // 使能发送、接收和空闲中断 USART1->CR1 |= USART_CR1_UE; // 使能串口 // 使能串口1空闲中断 NVIC_EnableIRQ(USART1_IRQn); while (1) { // 主循环 // ... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值