初窥门径32系列02--GPIO编程实战

编程实战1:翻转一个LED灯状态

硬件设计

要控制一个外设,首先要知道这个外设怎么用,然后是它被那个引脚管理,LED的用法大家都懂就不废话了,直接看原理图,看图得知LED0 ~ 7分别由PC0 ~ 7控制
图7

配置GPIO

void MX_GPIO_Init(void)		//GPIO的初始化配置
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};	//定义GPIO参数的结构体

  /* GPIO Ports Clock Enable 时钟使能 */	
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();

  /*Configure GPIO pin Output Level 配置GPIOpin口的输出电平 */
  HAL_GPIO_WritePin(GPIOC, 0x00ff, GPIO_PIN_SET);     //LED0~7初始状态

  /*Configure GPIO pin : PC  -- LED */
  GPIO_InitStruct.Pin = 0x00ff;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;	//工作模式:推挽输出
  GPIO_InitStruct.Pull = GPIO_NOPULL;			//高阻态
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;	//工作频率:低速
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

CubeMX配置步骤

CubeMX的基本操作我就不讲了,新建一个项目大家都会吧!
这里我们直接进入配置界面
图1

  • 在左侧找到System Core选项卡,选择SYSDebug选项栏选择SerialWire选项,如下图
    图2
  • 然后选择RCCHigh Speed Clock(HSC)(高速时钟)选项栏选择Crystal(晶振)选项,如下图
    图3
  • 在右边的芯片引脚图上面选择我们需要的引脚。这里我们选择 PC0为例,左键PC0,在弹出的下拉菜单中选择要配置的 IO 口模式,我们选择输出模式。
    同时,这里还要配合原理图一起选择,我这块开发板的PC0 ~ 7控制了LED0 ~ 7,不同的开发板,引脚控制的外设不一样。
    图4
  • 回到左侧选择GPIO,点击PC0,就可以配置PC0的模式状态了,包括输出等级、模式、GPIO电平状态、输出速度及用户起的别名等,如下图
    图5
    图6
    剩下的时钟树配置,工程管理的内容我就不一一介绍了,属于基本操作,最后点击生成代码即可获得一个已经配置好PC0的工程了。

HAL库函数调用

HAL_GPIO_WritePin(GPIO, PIN, STATE);	//对一个GPIO口写入一个状态
HAL_GPIO_TogglePin(GPIO, PIN);			//翻转一个GPIO口的状态

应用层:main.c

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  while (1)
  {
	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_0);	//翻转L0的状态
    HAL_Delay(200);							//延时200ms
  }
}

编程实战2:独立按键

硬件设计

根据原理图得知:KEY0由PC8控制、KEY1由PC9控制、KEY2由PD2控制,均为低电平触发
WK_UP由PA0控制,高电平触发
图8

配置GPIO

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();


  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, 0x00ff, GPIO_PIN_SET);     //LED初始状态
    
  /*Configure GPIO pin : PC  -- LED */
  GPIO_InitStruct.Pin = 0x00ff;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pins : PC8 PC9  -- 按键 */
  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;	//工作模式:输入模式
  GPIO_InitStruct.Pull = GPIO_PULLUP;		//高电平
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

CubeMX配置步骤

这里直接开始配置GPIO的输入模式,其他的操作相同

  • PC8,9均配置为输入模式
    图9
  • 因为由低电平触发,所以这里我们初始化引脚电平为上拉模式
    图10
    最后点击生成代码即可获得配置好的工程了。

驱动层:hardware文件

//hardware.h
#include "main.h"
#define KEY_0             HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_8)
#define KEY_1             HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_9)
#define LED(led, state)   HAL_GPIO_WritePin(GPIOC, led, state)

typedef enum
{
  KEY_DOWN = 0,
  KEY0,
  KEY1,
  KEY_MAX
}KeyName;

void LED_Task(u8 led);
u8 Get_Key(void);
//hardware.c
#include "hardware.h"

void LED_Task(u8 led)
{
  LED((0x0001<<(led+1)), GPIO_PIN_SET);	//关闭上一个LED
  LED((0x0001<<led), GPIO_PIN_RESET);	//打开选中的LED
  LED((0x0001<<(led-1)), GPIO_PIN_SET);	//关闭下一个LED
}
//这里LED的运行程序我写的比较乱,不过后面我有改进,但这里懒得改了>_<
//大家也可以自行发挥^_^

/* 应用了STC51单片片机上的按键消抖和自锁模块 */
u8 Get_Key(void)
{
  static u8 pre_scan=0, pre_trg=0;
  u8 keynumber=0, scan=0, trg=0, value=0;
  if(KEY_DOWN == KEY_0)
  {
    keynumber = KEY0;
  }
  if(KEY_DOWN == KEY_1)
  {
    keynumber = KEY1;
  }
  scan = keynumber;
  if(scan == pre_scan)
    trg = scan;
  else 
    trg = 0;
  
  if(trg == pre_trg)
    value = 0;
  else 
    value = trg;
  
  pre_scan = scan;
  pre_trg = trg;
  return value;
}

应用层:main.c

//main.c文件
u8 KeyNum,led;

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  while(1)
  {
    KeyNum = Get_Key();
	switch(KeyNum)
    {
      case 1:++led;break;
      case 2:--led;break;
    }
    if(led>7) led=7;
    LED_Task(led);  
  }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值