STM32 输出端口调试

STM32输出端口调试

固件库这块正点原子视频介绍的很清楚,就不细讲了,而且基本上都是操作步骤。
值得注意的是我们使用的是标准库,不是HAL库(STM32Cube)
一时也讲不明白。贴出几张有意思的图片
STM32 输出端口调试_第1张图片
STM32 输出端口调试_第2张图片


文章目录

  • STM32输出端口调试
  • 0、 keil基础
  • 一、 IO口简介
  • 二、STM32八种IO口模式
  • 三、IO口与相关的寄存器
    • 3.1 端口配置寄存器
    • 3.2 端口输入读取配置寄存器
    • 3.3端口输出状态寄存器
    • 3.4 端口输出状态寄存器
    • 3.5 GPIOx_BSRR
    • 3.6 GPIOx_BSRR
  • 四 库文件调用


0、 keil基础

从这节开始,之后就是关于代码的介绍了,这里先定义一下约定俗成的一些东西
首先:
一个字节=8位2进制=0000 0000
十六进制0X00=二进制0000 0000
uint8_t、uint16_t、uint32_t
typedef unsigned char uint8_t;//给无符号char,取别名为uint8_t
typedef unsigned short int uint16_t;//给无符号短整型short int,取别名为uint16_t
typedef unsigned int uint32_t;//给无符号整型short int,取别名为uint32_t
其实就是简单的有几位(二进制)uint8_t就是8位二进制(16)


一、 IO口简介

注意:这里仅仅适用于F1系列开发板
称IO口为GPIO,4组IO口, 一共16X3+3=51个IO。
然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)

二、STM32八种IO口模式

4种输入模式:
输入浮空、 输入上拉、 输入下拉、模拟输入
4种输出模式:
开漏输出
、开漏复用功能、推挽式输出
、推挽式复用功能
要注意:上面说的几种模式不是单纯的高低电平,是一种中很复杂的操作方式(不建议学)。
3种最大翻转速度:
-2MHZ、-10MHz、-50MHz
坦白说这八种状态不需要详细深究(电路图就不给出了),但是需要明白某些功能需要配置IO口是那种状态。

三、IO口与相关的寄存器

两个32位配置寄存器(GPIOx_CRL ,GPIOx_CRH) ,
两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR),
一个32位置位/ 复位寄存器(GPIOx_BSRR),
一个16位复位寄存器(GPIOx_BRR),
一个32位锁定寄存器(GPIOx_LCKR)。
也就是说上面7个寄存器,可以控制一组GPIO的16个IO口,实际上只用了前面5组寄存器
这些寄存器除了BRR16位其他都是32位的,也就是说需要改变32位的数据实现相应功能

3.1 端口配置寄存器

GPIOx_CRL&GPIOx_CRH
这两个都是端口配置寄存器,控制八种模式以及输出频率,其中:CRL 控制的是低 8 位口,而 CRH 控制的是高 8位口。一共16个正好一组
STM32 输出端口调试_第3张图片
STM32 输出端口调试_第4张图片
在代码中这样说道:
通过构造就结构体,对控制环礁序号、管脚模式(设置枚举是那个就行,不需要自己设定地址,这里在详细说一下,比方说推挽输出设定的是0X10,化为二进制就是0001 0000,正好将设定CNF1,CNF0是1与0,这样就是推完设置,不过这块不需要记)、管脚速度进行封装,然后进行初始化,就能够实现IO的控制
typedef struct
{ uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode; }GPIO_InitTypeDef;
然后初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0–>PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数配置 GPIO

3.2 端口输入读取配置寄存器

GPIOx_IDR
输入需要什么配置?自然是不用,我们仅仅读出端口就行。所以IDR 是一个只读,只用了低 16 位。该寄存器为只读寄存器(我只要读取端口电平高低就行),并且只能以16 位的形式读出(似乎和上面的32位读出有些bug)。

STM32 输出端口调试_第5张图片
代码中只需要:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
比如我要读 GPIOA.5 的电平状态,那么方法是:GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);返回值是 1(Bit_SET)或者 0(Bit_RESET);

3.3端口输出状态寄存器

GPIOx_ODR
可以读出某个端口的输出状态,也可以控制某个端口的输出电平
STM32 输出端口调试_第6张图片
在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现的:void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);该函数一般用来往一次性一个 GPIO 的多个端口设值。

3.4 端口输出状态寄存器

GPIOx_ODR
可以读出某个端口的输出状态,也可以控制某个端口的输出电平
STM32 输出端口调试_第7张图片
在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现的:void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);该函数一般用来往一次性一个 GPIO 的多个端口设值。

3.5 GPIOx_BSRR

BSRR 寄存器是端口位设置/清除寄存器。该寄存器和 ODR 寄存器具有类似的作用该寄存器和 ODR 寄存器具有类似的作用,都可
以用来设置 GPIO 端口的输出位是 1 还是 0,但是只能改变管脚状态为低电平,对寄存器 管脚对于位写 1 相应管脚会为低电平。写 0 无动作。
STM32 输出端口调试_第8张图片

3.6 GPIOx_BSRR

BRR 寄存器是端口位清除寄存器。该寄存器的作用跟 BSRR 的高 16 位雷同
在 STM32 固件库中,通过 BSRR 和 BRR 寄存器设置 GPIO 端口输出是通过函数
GPIO_SetBits()和函数 GPIO_ResetBits()来完成的。
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
要设置 GPIOB.5 输出 1,那么方法为:GPIO_SetBits(GPIOB, GPIO_Pin_5);
反之如果要设置 GPIOB.5 输出位 0,方法为:GPIO_ResetBits (GPIOB, GPIO_Pin_5);

四 库文件调用

STM32 输出端口调试_第9张图片
这里代码就不细说了
如果用J-LINk仿真可以测试引脚输出端口电平。

你可能感兴趣的:(stm32,单片机,嵌入式硬件)