3.3节 GPIO实验及Keil软件使用WatchWindows进行Debug调试
本节将学习STM32基本的GPIO读取操作,并通过该GPIO实验学习keil软件的使用。
a.实验准备:碰撞开关/杜邦线,ST-Llink下载器,CHEAPX机器人控制板
b.实验目的:读取STM32芯片的管脚电平
c.相关知识点:
STM32的I/O口有8种工作模式:
GPIO_Mode_AIN = 0x0,//模拟输入,用于AD采集
GPIO_Mode_IN_FLOATING = 0x04,//浮空输入,用于判断外接电平是高电平还是低电平的情形
GPIO_Mode_IPD = 0x28, // 下拉输入,用于判断外接电平是高电平的情形
GPIO_Mode_IPU = 0x48, //上拉输入,用于判断外接电平是低电平的情形
GPIO_Mode_Out_OD = 0x14, //开漏输出,需外接上拉电阻,用于多个输出并联的情形
GPIO_Mode_Out_PP = 0x10, //推挽输出 ,内部电路直接驱动直接输出高、低电平,用于单独输出高低电平的情形
GPIO_Mode_AF_OD = 0x1C, //复用开漏输出,用于开漏输出的复用IO情形
GPIO_Mode_AF_PP = 0x18 // 复用推挽输出,用于推挽输出的复用IO情形
建议同学们先大概了解该知识点,后续在实验中再具体领会。
d.编程及运行
(1)初始化芯片管脚PD8,位置如下图。步骤如下:打开对应GPIO口的时钟,再配置管脚模式。此为GPIO初始化的通用标准步骤,后续同学自己编程类似功能时,可参考该代码,把RCC_APB2Periph_GPIOD、GPIO_Pin_8、GPIO_Mode_IPU等改为实际所用的GPIO管脚及模式即可。
void InitBumper(void) { GPIO_InitTypeDef GPIO_InitStruct; //H1 BUMP1 PD8 //Config Clock 配置时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//打开GPIOD时钟 //Config GPIO PD8 配置芯片管脚 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode GPIO模式:上拉输入模式 GPIO_Init(GPIOD, &GPIO_InitStruct); //传入结构GPIO_InitStruct,配置GPIOD }
(2)使用库函数GPIO_ReadInputDataBit()读取芯片管脚电平,该函数具体使用方法如下:
void BumperUpdate(void) { if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_8)) //读取GPIO PD8 电平 _currBumperStatus=1; //高电平,_currBumperStatus=1 else _currBumperStatus=0; //低电平,_currBumperStatus=0 }
(3)编写主函数
//GPIO 实验 int main(void) { InitBumper(); //初始化 BUMP1 PD8 while(1) { BumperUpdate();//更新 } }
(4)编译,并使用ST-Link下载.硬件操作步骤如下:打开控制板开关;将控制板SWD接口的GND SWDIO SWCLK 分别连接ST-Link 的DIO CLK GND。软件操作查看上一节。
(5)配置WatchWindows进行Debug调试。步骤如下:点击debug工具,点击WatchWindows,输入如下图中内容。
(6)设置断点
(7)运行程序。点击如下按钮,程序会一直运行,遇到设置了断点的语句行才会停止。如图,全局变量_currBumperStatus在程序未运行时,其值为初始化值 0。
(8)通过观察watch windows中的全局变量_currBumperStatus的值,就可以知道PD8的电平。我们使用碰撞开关做实验,PD8与碰撞开关的输出口相连。当开关打开时,输出口为高电平;当开关闭合时,低电平。我们要检测碰撞开关的闭合情形(发生碰撞情形),所以在初始化时,使用GPIO_Mode_IPU 上拉输入模式,用于判断外接电平是低电平的情形。若同学们是使用杜邦线做实验,将PD8与VCC或GND相连即可达到同样给PD8输入高低电平的目的。
(9)实验结果:碰撞开关打开,点击运行,运行到断点停止时,可以观察到全局变量_currBumperStatus的值为1;碰撞开关闭合(手不要松开),点击运行,运行到断点停止时,可以观察到全局变量_currBumperStatus的值为0。
e.总结:watch windows可以观察STM32寄存器的值,以及全局变量值,是我们调试程序最有效手段。除此以外,我们后面还会学习使用串口打印的方法,输出我们要观察的值。