《SLAM机器人基础教程》第三章 单片机与STM32:GPIO实验及Keil软件使用WatchWindows进行Debug调试

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寄存器的值,以及全局变量值,是我们调试程序最有效手段。除此以外,我们后面还会学习使用串口打印的方法,输出我们要观察的值。

猜你喜欢

转载自www.cnblogs.com/Baron-Lu/p/13377778.html