关联UART、SFR(special function register)硬件外设寄存器、单片机RAM的存储、GPIO时钟源、外部中断、HSE、MCO(外部输出时钟引脚)

UART它作为单片机的一个硬件模块,与主处理器(CPU)协同工作,帮助完成数据通信任务。因此,它是一个 外设,而不是处理器的一部分。

UART 通常是通过 APB(Advanced Peripheral Bus) 总线与 MCU 内部的时钟进行连接的。

定时器 用于产生周期性的时间中断,使得单片机可以执行定时任务。

一.SFR寄存器

SFR特殊功能寄存器Special Function Register)的缩写,在微控制器(如 8051、STM32 等)中,SFR 是指一些 控制外设处理器功能 的寄存器

这些寄存器通常用于直接与硬件交互,并且它们通常具有特殊的功能和操作方式。SFR 是微控制器中的 内存映射寄存器,用于配置和控制外部硬件组件,如定时器、串口、GPIO 等。

常见的 SFR 功能:

  • 控制硬件外设:例如,控制 GPIO 引脚 的输入输出模式、状态,控制 定时器 的启停和计时周期,控制 UART 串行通信等。
  • 状态读取:从 SFR 中可以读取硬件外设的状态,比如 中断标志位,定时器溢出状态,外部输入引脚的电平等。
  • 中断控制:一些 SFR 用于控制中断的启用、禁用,以及读取中断标志位。
  • SFR 寄存器的存储位置

  • SFR 寄存器位于特殊的寄存器区,并不是存储在 RAMFlash 中。
  • 大多数微控制器架构 中,SFR 是直接映射到 内存地址空间中的特定区域,而这一区域是专门为 硬件外设控制和配置 而设计的。这些寄存器并不占用 RAM 的空间,也不会被存储在 Flash 中。它们是通过 CPU 直接访问的特殊内存区域。
  • SFR:是 硬件外设寄存器,每个外设控制器(如 UART、ADC、GPIO)都通过一组 SFR 来配置和控制

    SFR 寄存器的例子

  • GPIO 控制寄存器:用于配置 GPIO 引脚的方向、状态(高/低)、中断等。
  • 定时器控制寄存器:用于配置定时器的工作模式、计数器值等。
  • 串口控制寄存器:用于配置 UART、USART 等外设的工作状态。
  • 二.单片机RAM存储哪些东西

    1. 程序栈(Stack)

  • 是用于存储函数调用信息的区域,包括返回地址、局部变量、保存的寄存器等。每当一个函数被调用时,相关的数据就会被压入栈中,函数返回时则会从栈中弹出。
  • 栈指针(SP) 通常会指向栈的顶部,随着函数调用和返回,栈指针会向下或向上移动。
  • 2. 全局变量和静态变量

  • 全局变量 是在程序的任何地方都可以访问的数据。它们在 RAM 中的地址是固定的,通常从程序开始运行时分配,并保持到程序结束。
  • 静态变量(包括 static 关键字声明的变量)虽然作用域通常在局部,但它们的生命周期与程序运行周期相同,因此也存储在 RAM 中。
  • ARM Cortex-M 系列单片机 中,程序的启动地址和中断向量表等通常会存储在 FLASH 中。CPU 会首先执行 初始化代码,然后根据中断向量表来设置中断。
  • 有些单片机在执行时会把中断向量表从 FLASH 中加载到 RAM 中,以便更高效地响应中断。
  • 3. 局部变量

  • 当一个函数被调用时,它的 局部变量 会存储在栈中。局部变量的生命周期仅限于函数执行期间,函数返回后,局部变量的空间会被回收。
  • 在嵌套函数调用的过程中,多个函数的局部变量会被压入栈中,直到函数返回
  • 4. 缓冲区和临时数据

  • 缓冲区:例如用于存储接收到的串口数据、接收的数据包、传感器的读取数据等。这些数据通常需要在 RAM 中暂存,直到它们被处理或传输到其他设备。
  • 临时数据:程序在执行期间需要的临时数据(如计算结果、临时数组等),也存储在 RAM 中。
  • 5. 堆区(Heap)

  • 堆区 用于动态内存分配,通常由程序员手动管理(例如使用 mallocfree 或者其他内存管理函数)。
  • 堆区在运行时进行内存分配和释放,通常用于存储不确定大小的动态数据结构(如链表、树等)。
  • 6. 中断服务程序的上下文

  • 当外设产生中断时,CPU 会中断当前执行的程序,并跳转到相应的 中断服务程序(ISR)。在此过程中,当前程序的上下文(如寄存器的值、程序计数器等)会被保存到 栈中
  • 中断处理完成后,程序会从栈中恢复之前的上下文,继续执行原来的任务。
  • 7. I/O 寄存器和标志位

  • 单片机的 I/O 寄存器(如 GPIO、定时器控制寄存器等)通常位于 SFR 区域,但是一些较复杂的内存系统也会将 I/O 状态和标志位存储在 RAM 中。这些存储的数据用于保存与外部设备的交互状态。
  • 8. 缓存数据

  • 某些单片机支持 缓存(Cache),用来提高数据访问速度。缓存可能会存储程序中频繁访问的数据,减少对较慢存储器的访问。
  • 9. 实时数据和操作状态

  • 单片机的 实时数据(例如传感器测量的值、外部设备的状态、控制标志等)会存储在 RAM 中,用于随时更新和操作。
  • 操作系统或中断处理程序也会在 RAM 中保存设备的状态和控制信息。
  • 10. DMA(直接内存访问)缓冲区

  • 如果单片机支持 DMA,则数据传输过程中的缓冲区通常会存储在 RAM 中,DMA 控制器直接与 RAM 进行数据交换。

  • 三.GPIO 时钟来源

      GPIO 引脚的时钟通常由微控制器的 系统时钟外设时钟 供给。

      大部分微控制器会将 GPIO 模块的时钟信号 独立管理,因此你需要 显式地使能 GPIO 的时钟才能操作 GPIO 引脚。在 STM32 等 MCU 中,通常需要通过时钟控制寄存器来 打开 GPIO 时钟

    例如,在 STM32 系列中,GPIO 引脚的时钟由 RCC(Reset and Clock Control) 模块管理。每个 GPIO 端口(如 GPIOA、GPIOB 等)都有一个独立的时钟源,你必须在配置 GPIO 引脚之前,先确保相应的时钟已被启用。

     如何使能 GPIO 时钟

    通常,通过访问 RCC 寄存器 来使能 GPIO 时钟。例如,STM32 的代码中,时钟使能通常使用类似如下的语法:

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    在这行代码中,RCC_AHB1Periph_GPIOA 是控制 GPIOA 时钟的标志,RCC_AHB1PeriphClockCmd 函数用于使能或禁用该时钟。

    GPIO 的时钟源

    GPIO 引脚的时钟通常来自微控制器的 AHBAPB 总线时钟

  • AHB 总线时钟:适用于高性能外设,通常是系统主时钟的一个倍频。
  • APB 总线时钟:适用于较低性能的外设,如定时器、UART、I2C 等。
  • 外部中断时钟

    如果 GPIO 引脚被配置为 外部中断模式,例如响应外部触发信号(如按键、传感器等),那么它需要依赖 外部中断控制器(例如 STM32 的 EXTI)以及 外部中断时钟。这些时钟信号也通常由微控制器的时钟系统提供。

    例如,STM32 中的外部中断系统需要时钟支持:

    // 使能外部中断控制器时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    外部中断时钟指的是单片机内部用于处理外部中断的时钟信号。虽然外部中断通常是由外部信号触发的,但中断的处理、调度和响应是由单片机内部的时钟来管理的。中断处理的时钟信号一般包括以下几个部分:

  • 外部中断时钟源:有些微控制器允许外部信号直接驱动一个独立的时钟输入,用于外部中断处理。在这种情况下,时钟信号通常来自 外部时钟源(例如,外部晶振或时钟发生器)。

  • 内部时钟分配:即使外部中断源来自外部事件,外部中断的响应处理仍然是由 内部时钟系统 控制的。微控制器的中断控制器(如 NVIC)会在内部时钟的节奏下处理和分发外部中断。时钟的节奏决定了外部中断的触发和响应延迟。

  • 具体实现

    在一些具体的微控制器中,如 STM32、AVR、PIC 等,外部中断通常由如下几个模块配合时钟系统共同实现:

  • 外部中断引脚(如 GPIO):负责接收外部事件信号。
  • 中断控制器:如 STM32 的 EXTI 模块或 AVR 的 EIC,负责管理和触发外部中断。
  • 时钟分配与同步模块:如 STM32 中的 RCCPLL,负责为外部中断模块提供合适的时钟源。
  • 外部中断时钟源是指在微控制器(MCU)中用来处理外部中断的时钟信号来源。

    许多微控制器允许使用外部时钟信号作为外部中断的时钟源。在这种情况下,外部设备(如外部时钟发生器或信号源)提供时钟信号,MCU通过专门的引脚将时钟信号输入到系统中。

    HSE(High-Speed External)引脚的作用就是允许外部时钟源输入到系统中

    时钟源的连接:

    你可以将一个 MCU 的时钟输出连接到另一个 MCU 的 HSE 引脚,用作该 MCU 的时钟源。这样,第二个 MCU 就可以利用第一个 MCU 的时钟信号来同步其工作。

    一些微控制器支持将内部时钟信号输出到其引脚上。例如,某些 MCU 配备了专门的时钟输出引脚(如 MCO,Microcontroller Clock Output)。这个引脚可以输出当前 MCU 的系统时钟或经过 PLL 处理后的时钟。

    作者:q2380957683

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机原理学习

    发表回复