天天看点

STM32F767--->寄存器

文章目录

    • IO 配置常用的 8 个寄存器
      • MODER
      • OTYPER
      • OSPEEDR
      • PUPDR
      • ODR
      • BSRR
      • IDR
      • AFRH & AFRL
    • 串口通信用到的寄存器
      • 外设时钟使能寄存器APB2ENR
      • 串口波特率设置寄存器USART_BRR
      • 串口控制寄存器USART_CR1~3
    • DMA(直接存储器)相关寄存器
      • DMA中断状态寄存器DMA_LISR/DMA_HISR
      • DMA 中断标志清除寄存器DMA_LIFCR /DMA_HIFCR
      • DMA 数据流 x 配置寄存器DMA_SxCR(x=0~7)
      • 数据流 x 数据项数寄存器(DMA_SxNDTR)
      • 数据流 x 的外设地址寄存器(DMA_SxPAR)
      • 数据流 x 的存储器地址寄存器

IO 配置常用的 8 个寄存器

MODER、OTYPER、OSPEEDR、PUPDR、ODR、IDR 、AFRH 和 AFRL。

MODER

  MODER 寄存器,该寄存器是 GPIO 端口模式控制寄存器,用于控制 GPIOx(STM32F7 最多有 9 组 IO,分别用大写字母表示,即 x=A/B/C/D/E/F/G/H/I,下同)的工作模式,

STM32F767--->寄存器

OTYPER

 OTYPER 寄存器,该寄存器用于控制 GPIOx 的输出类型,该寄存器仅用于输出模式,在输入模式(MODER[1:0]=00/11 时)下不起作用。该寄存器低 16 位有效,每一个位控制一个 IO 口。设置为 0 是推挽输出,设置为 1 是开漏输出。复位后,该寄存器值均为 0,也就是在输出模式下 IO 口默认为推挽输出。

STM32F767--->寄存器

OSPEEDR

 OSPEEDR 寄存器,该寄存器用于控制 GPIOx 的输出速度,该寄存器也仅用于输出模式,在输入模式(MODER[1:0]=00/11 时)下不起作用。该寄存器每 2 个位控制一个 IO 口,复位后,该寄存器值一般为 0。

STM32F767--->寄存器

PUPDR

PUPDR寄存器,该寄存器用于控制 GPIOx 的上拉/下拉,该寄存器每 2 个位控制一个 IO 口,用于设置上下拉,STM32F1 是通过 ODR寄存器控制上下拉的,而 STM32F7 则由单独的寄存器PUPDR控制上下拉,使用起来更加灵活。复位后,该寄存器值一般为 0。

STM32F767--->寄存器

ODR

 ODR 寄存器,该寄存器用于控制 GPIOx 的输出电平,该寄存器用于设置某个 IO 输出低电平(ODRy=0)还是高电平(ODRy=1),该寄存器也仅在输出模式下有效,在输入模式(MODER[1:0]=00/11 时)下不起作用。

STM32F767--->寄存器

BSRR

 寄存器 BSRR,它叫置位/复位(置1/清零)寄存器。该寄存器和 ODR寄存器具有类似的作用,都可以用来设置 GPIO 端口的输出位是 1 还是 0。

STM32F767--->寄存器

IDR

IDR 寄存器,该寄存器用于读取 GPIOx 的输入数据,该寄存器用于读取某个 IO 的电平,如果对应的位为 0(IDRy=0),则说明该 IO 输入的是低电平,如果是 1(IDRy=1),则表示输入的是高电平。

STM32F767--->寄存器

AFRH & AFRL

 AFRH & AFRL这两个寄存器是用来设置 IO 口的复用功能的

串口通信用到的寄存器

外设时钟使能寄存器APB2ENR

 串口1在APB2ENR 寄存器的第 4 位,串口6也在APB2ENR 寄存器中

串口波特率设置寄存器USART_BRR

 每个串口都有一个自己独立的波特率寄存器 USART_BRR,通过设置该寄存器就可以达到配置不同波特率的目的。

串口控制寄存器USART_CR1~3

STM32F767 的每个串口都有 3 个控制寄存器 USART_CR1~3,串口的很多

配置都是通过这 3 个寄存器来设置的。

STM32F767--->寄存器

DMA(直接存储器)相关寄存器

DMA中断状态寄存器DMA_LISR/DMA_HISR

DMA_LISR 和 DMA_HISR,每个寄存器管理 4 数据流(总共 8 个),DMA_LISR 寄存器用于管理数据流 0~3,而 DMA_HISR 用于管理数据流 4~7。这两个寄存器各位描述都完全一模一样,只是管理的数据流不一样。通过这两个寄存器可以获取数据的传输状态

STM32F767--->寄存器

如果开启了 DMA_LISR 中这些位对应的中断,则在达到条件后就会跳到中断服务函数里面去,即使没开启,我们也可以通过查询这些位来获得当前 DMA 传输的状态。这里我们常用的是 TCIFx位,即数据流 x 的 DMA 传输完成与否标志。注意此寄存器为只读寄存器,所以在这些位被置位之后,只能通过其他的操作来清除。DMA_HISR 寄存器各位描述通 DMA_LISR 寄存器各位描述完全一样,只是对应数据流 4~7.

DMA 中断标志清除寄存器DMA_LIFCR /DMA_HIFCR

DMA_LIFCR /DMA_HIFCR,同样是每个寄存器控制 4 个数据流,DMA_LIFCR 寄存器用于管理数据流 0~3,而 DMA_ HIFCR 用于管理数据流 4~7。DMA_LIFCR 的各位就是用来清除 DMA_LISR 的对应位的,通过写 1 清除。在 DMA_LISR 被置位后,我们必须通过向该位寄存器对应的位写入 1 来清除。DMA_HIFCR 的使用同 DMA_LIFCR 类似。

STM32F767--->寄存器

DMA 数据流 x 配置寄存器DMA_SxCR(x=0~7)

该寄存器控制着 DMA 的很多相关信息,包括数据宽度、外设及存储器的宽度、优先级、增量模式、传输方向、中断允许、使能等都是通过该寄存器来设置的。所以 DMA_ SxCR 是 DMA 传输的核心控制寄存器。

数据流 x 数据项数寄存器(DMA_SxNDTR)

第四个是 DMA 数据流 x 数据项数寄存器(DMA_SxNDTR)。这个寄存器控制 DMA 数据流 x 的每次传输所要传输的数据量。其设置范围为 0~65535。并且该寄存器的值会随着传输的进行而减少,当该寄存器的值为 0 的时候就代表此次数据传输已经全部发送完成了。所以可以通过这个寄存器的值来知道当前 DMA 传输的进度。特别注意,这里是数据项数目,而不是指的字节数。比如设置数据位宽为 16 位,那么传输一次(一个项)就是 2 个字节。

数据流 x 的外设地址寄存器(DMA_SxPAR)

该寄存器用来存储 STM32F767 外设的地址,比如我们使用串口 1,那么该寄存器必须写入 0x40011028(其实就是&USART1_TDR)。如果使用其他外设,就修改成相应外设的地址就行了。

数据流 x 的存储器地址寄存器

由于 STM32F767 的 DMA 支持双缓存,所以存储器地址寄存器有两个:DMA_SxM0AR 和 DMA_SxM1AR,其中 DMA_SxM1AR 仅在双缓冲模式下才有效。