流水灯实验:

一、GPIO口概述  

在CortexM4中一大部分都是GPIO口-》General Purose Input/Output 通用输入输出引脚,每一个引脚都可以引出一根功能复用线:配置不同功能;

  GPIO口四大功能:

  (1)输入input 从外部向芯片输入电平信号,芯片用来感知

  (2)输入output 引脚向外部输出电平信号

  (3)复用功能 例如:通用定时器/串口

  (4)特殊功能

就用GPIO来总管外设

  呐~实验就是以GPIO为基础嘛

  STM32F4xx共有144个GPIO引脚,分为9组:GPIOA~GPIOI 每个GPIO分组都包含16个引脚

gpio接口如何使用python gpio接口功能_引脚

 

 

   例如这里列出来GPIOA分组的16个引脚

  算一下一共有多少引脚呢:16*9=144

  那么芯片是如何管理这些端口的性质呢:

  每组GPIO口都配置:

  (1)4个32位寄存器用于基本配置(OTPYER、OSPEEDR、MODER、PUPDR)

  (2)2个32位寄存器用于数据配置(IDR、ODR)

  (3)1GPIO用于复位、置位(BSSR)

  (4)1个锁存器(LCKR)

  (5)2个复用功能寄存器(AFRH、AFRL)

  哇有没有感觉一个GPIO口给他服务的寄存器好多啊~哈哈哈各个GPIO都是小皇帝,寄存器是小佣人

GPIOA:0x4002 0000~0x4002 03ff

 

二、GPIO功能描述(主要是前三个)

    

gpio接口如何使用python gpio接口功能_寄存器_02

 

 

 

  首先说清楚什么是上拉、下拉电阻

  (a)上拉电阻,在电阻那边接一个正电压

  (b)下拉电阻,电阻那边解一个GND

  (1)输入模式

  输入数据每个一个AHB1时钟周期获取一次值

    (a)输入悬空:GPIO口没有什么电阻在外

  CPU通过读取GPIO口就知道外部是什么电平

    (b)带上拉输入

    在内部接入上拉电阻:那可以知道,外部信号下拉时,CPU读到的电平是低电平

    (c)下拉输入-》和上拉相反

    (d)模拟输入

    获取到接口的模拟信号,并通过ADC转化为数字量

  (2)输出模式

   

 

  

gpio接口如何使用python gpio接口功能_复用_03

 

   a)输出推挽

      可以输出高/低电平:两个mos管够可以工作

   b)输出开漏

      其中一个MOS管不工作,假设是p-mos不工作,要想输出高电平得接入函数能够接入上拉电阻,要不然只能输出0

 (3)复用功能

  每一个GPIO口都可以复用很多其他功能:I2C、UART串口

  每一个GPIO口都有一个复位器,其中复位器将16路复用接入,AFRL->GPIO(0~7) AFRH-》GPIO(8~15)

   

gpio接口如何使用python gpio接口功能_复用_04

 三、配置GPIO口

  (1)基本配置

  ·GPIOx_MODER(32位)

    

gpio接口如何使用python gpio接口功能_复用_05

 

 

 一共有4中模式所以2位代表一组,共16组

  其中2y+1:2y

     00输入

     01输出  

     10复用

     11模拟

所以比如配置PA3为输出模式:

    GPIOA_MODER[]&=(1<<6)

  volatile unsigned long *p = (volatile unsigned long *)0x40020000->PA

  unsigned long value = *p

  value &=(1<<6)

 

·输出模式

  GPIOx_OTYPER共32位

  

gpio接口如何使用python gpio接口功能_寄存器_06

 

 

 其中只有两种模式所以1位就可以

  y

  0-》推挽输出

  1-》开漏输出

·推拉寄存器

  GPIOx_PUPDR

gpio接口如何使用python gpio接口功能_寄存器_07

 

 

 

  其中和MODER一样

 其中2y+1:2y

     00无上下啦

     01上拉

     10下拉

     11保留

·速度寄存器

  

gpio接口如何使用python gpio接口功能_gpio接口如何使用python_08

 

 

 

 (2)数据寄存器

  

gpio接口如何使用python gpio接口功能_gpio接口如何使用python_09

 

·输入数据寄存器

  只读~偏移地址0x10

  只有低16位可用

  

gpio接口如何使用python gpio接口功能_复用_10

 

 

 ·ODR输出数据寄存器

  那就是rw的

  

gpio接口如何使用python gpio接口功能_gpio接口如何使用python_09

gpio接口如何使用python gpio接口功能_寄存器_12

 

 

 写博客可太累了。。。

 ·BSRR数据复位/置位

gpio接口如何使用python gpio接口功能_gpio接口如何使用python_13

 

 

 

 一定要注意奥~BSx和BRx都操作BSx优先~

reset-》1-》置0

set-》1-》置1

(3)上锁寄存器

  就是封锁某个GPIO口

(4)复用

  每个GPIO口16中功能,一个GPIO占4位;一组占4*16=64位即需要两个32位寄存器来搞~

  GPIOx_AFLR(0~7) GPIOx_AFHR(8~15)

我要吐了~好了好了现在附上我的代码

 众所周知让灯亮的得看原理图~

gpio接口如何使用python gpio接口功能_引脚_14

 

 

 看到了吗?LED右边的端口为低电平时,灯会亮

  那就找对应的GPIO端口~

gpio接口如何使用python gpio接口功能_复用_15

 

gpio接口如何使用python gpio接口功能_gpio接口如何使用python_16

那就结束了吖要配置的就是

LED0-LED0-PF9

LED1-LED1-PF10

LED2-FSMC D10-PE13

LED3-FSMC D11-PE14

(1)声明需要的寄存器

gpio接口如何使用python gpio接口功能_寄存器_17

 

 

 

gpio接口如何使用python gpio接口功能_引脚_18

 

 

 (2)首先端口使能

GPIOE GPIOF

gpio接口如何使用python gpio接口功能_引脚_19

 

 

 

gpio接口如何使用python gpio接口功能_gpio接口如何使用python_20

 

 

 

gpio接口如何使用python gpio接口功能_引脚_21

 

 

 

gpio接口如何使用python gpio接口功能_gpio接口如何使用python_22

 

 

 

 

gpio接口如何使用python gpio接口功能_引脚_23

 

 

 

gpio接口如何使用python gpio接口功能_复用_24

 

 

 

gpio接口如何使用python gpio接口功能_寄存器_25

 

 

 

gpio接口如何使用python gpio接口功能_gpio接口如何使用python_26

 

 

 

gpio接口如何使用python gpio接口功能_寄存器_27

 

 

 

gpio接口如何使用python gpio接口功能_寄存器_28

 

 

这,keil要是复制粘贴下来注释就乱码了~就截图了奥

gpio接口如何使用python gpio接口功能_gpio接口如何使用python_29