PY32F003F18按键输入

一、PY32F003F18的GPIO介绍

1、PY32F003F18的18个I/O,均可作为外部中断;

2、每个GPIO都可以由软件配置为输出:

1)、推挽输出(push-pull)

2)、开漏极输出(open drain)

注意:驱动电流为8mA;

3、每个GPIO都可以由软件配置为输入:

1)、浮空输入(floating)

2)、上拉输入(pull-up)

3)、下拉输入(pull-down)

4)、模拟输入(analog)

4、每个GPIO都可以由软件配置为外设复用功能;

5、Debug引脚默认被置于复用功能上拉或下拉模式:
PA14默认为SWCLK: 置于下拉模式
PA13默认为SWDIO: 置于上拉模式
PF4默认为Boot:Boot引脚默认置于输入下拉模式

二、GPIO输入输出的用户函数

1、__HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟

2、__HAL_RCC_GPIOB_CLK_ENABLE();//使能GPIOB时钟

3、__HAL_RCC_GPIOF_CLK_ENABLE();//使能GPIOF时钟

4、HAL_GPIO_Init(GPIO_TypeDef ?*GPIOx, GPIO_InitTypeDef *GPIO_Init);
根据GPIO_InitTypeDef型结构变量初始化GPIOx端口

5、HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
将GPIOx端口的第GPIO_Pin引脚设置输出电平值为PinState

6、HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
将GPIOx端口的第GPIO_Pin引脚设置输出为反向电平,即输出电平翻转

7、HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
读取"GPIOx端口的第GPIO_Pin引脚"输入的电平值

三、测试程序

复制代码
#include "Key.h"
#include "py32f0xx_hal.h"

void Key1_Init(void);

//函数功能:Key1引脚初始化
void Key1_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructureure;

  __HAL_RCC_GPIOA_CLK_ENABLE();  //GPIOA时钟使能

  GPIO_InitStructureure.Pin = GPIO_PIN_12;       //选择第12脚
  GPIO_InitStructureure.Pull = GPIO_NOPULL;      //引脚上拉和下拉都没有被激活
  GPIO_InitStructureure.Speed = GPIO_SPEED_FREQ_MEDIUM;//配置GPIO速度为中速
	GPIO_InitStructureure.Mode = GPIO_MODE_INPUT;//设置引脚工作模式为输入浮空模式
	HAL_GPIO_Init(GPIOA,&GPIO_InitStructureure);
	//根据GPIO_InitStructureure结构变量指定的参数初始化GPIOA的外设寄存器
}

#include "LED.h"

void MCU_LED_Init(void);

//函数功能:MCU_LED灯引脚初始化,并配置为关灯
void MCU_LED_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;

  __HAL_RCC_GPIOB_CLK_ENABLE();//使能GPIOB时钟

  //初始化GPIOB5
  GPIO_InitStructure.Pin = GPIO_PIN_5;                  //选择第5脚
  GPIO_InitStructure.Pull = GPIO_PULLUP;                //引脚上拉被激活
  GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //配置GPIO速度为极高
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;        //设置引脚工作模式为推挽输出方式

  HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
	//根据GPIO_InitStructure结构变量指定的参数初始化GPIOB的外设寄存器

	MCU_LED_Off();
}

#ifndef __LED_H
#define __LED_H

#include "py32f0xx_hal.h"

#define MCU_LED_On()      HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET)  //输出低电平开灯
#define MCU_LED_Off()     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET)    //输出高电平关灯
#define MCU_LED_Toggle()  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5)                //输出电平翻转

extern void MCU_LED_Init(void);

#endif /* __LED_H */

#include "delay.h"

static uint8_t  fac_us=0; //us延时倍乘数

void delay_init(void);
void delay_us(uint32_t nus);
void delay_ms(uint32_t nms);

//函数功能:配置"SysTick定时器"每1ms中断一次,优先级为最低
void delay_init(void)
{
	fac_us=SystemCoreClock/1000000;//不论是否使用OS,fac_us都需要使用
	uwTickFreq=HAL_TICK_FREQ_1KHZ;
	//准备配置"SysTick定时器"每1ms中断一次
  //HAL_TICK_FREQ_10HZ= 100,"SysTick计数器"的中断周期为100ms
  //HAL_TICK_FREQ_100HZ= 10,"SysTick计数器"的中断周期为10ms
  //HAL_TICK_FREQ_1KHZ = 1,"SysTick计数器"的中断周期为1ms

	HAL_InitTick(PRIORITY_LOWEST);//配置"SysTick定时器"每1ms中断一次,优先级为最低
//	HAL_Init();//配置"SysTick定时器"每1ms中断一次,优先级为最低

	HAL_SetTickFreq(uwTickFreq);//设置"SysTick滴答定时器"的中断周期为uwTickFreq个毫秒
}

//函数功能:延时nus
//nus:要延时的us数.	
//nus:0~204522252(最大值即2^32/fac_us)	    								   
void delay_us(uint32_t nus)
{		
	uint32_t ticks;
	uint32_t told,tnow,tcnt=0;
	uint32_t reload=SysTick->LOAD;//读取"SysTick定时器"自动重装载值
	ticks=nus*fac_us; 						//需要的节拍数 
	told=SysTick->VAL;        	  //读取"系统滴答定时器的计数值"
	while(1)
	{
		tnow=SysTick->VAL;//读取"系统滴答定时器的计数值"	
		if(tnow!=told)
		{	    
			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.
			else tcnt+=reload-tnow+told;	    
			told=tnow;
			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}		
	}										    
}

//函数功能:延时nms
//nms:要延时的ms数
//nms:0~65535
void delay_ms(uint32_t nms)
{	
	delay_us((uint32_t)(nms*1000));//普通方式延时
}

//HAL库接口函数
//HAL_Delay(x)延时x毫秒,x<0xFFFFFFFF,至少需要延时一个周期
//HAL_SuspendTick();不使能"SysTick滴答定时器"中断
//HAL_ResumeTick();使能"SysTick滴答定时器"中断
//HAL_GetTickFreq();读取"SysTick滴答定时器"的中断频率
//HAL_SetTickFreq(Freq);设置"SysTick滴答定时器"的中断频率为Freq
//HAL_GetTickPrio();读取"SysTick滴答定时器"的中断优先级
//HAL_GetTick();读取"SysTick滴答定时器"的中断次数计数器uwTick
//HAL_IncTick();供SysTick_Handler()调用
//uwTickFreq=HAL_TICK_FREQ_1KHZ;//准备配置"SysTick定时器"每1ms中断一次
//HAL_InitTick(PRIORITY_LOWEST);//配置"SysTick定时器"每1ms中断一次,优先级为最低

#include "py32f0xx_hal.h"
#include "delay.h"
#include "Key.h"
#include "LED.h"

/*
PY32F003F18的18个I/O,均可作为外部中断
每个GPIO都可以由软件配置为输出:推挽输出(push-pull),开漏极输出(open drain);注意:驱动电流为8mA;
每个GPIO都可以由软件配置为输入:浮空输入(floating),上拉输入(pull-up),下拉输入(pull-down),模拟输入(analog);
每个GPIO都可以由软件配置为外设复用功能;

Debug引脚默认被置于复用功能上拉或下拉模式:
PA14默认为SWCLK: 置于下拉模式
PA13默认为SWDIO: 置于上拉模式
PF4默认为Boot:Boot引脚默认置于输入下拉模式
*/

void Delay_ms(uint32_t x_ms);

int main(void)
{
//	HSE_Config();
	//初始化"HSI,HSE,LSI振荡器",HSE用作系统时钟(SYSCLK),同时配置"AHB时钟(HCLK)和APB时钟(PCLK)"

	delay_init();

	Key1_Init();//Key1引脚初始化
	MCU_LED_Init();//MCU_LED灯引脚初始化,并配置为关灯

	HAL_Delay(1000);

  while (1)
  {
		if( Key1_LevelValue() ) MCU_LED_Off();
		else MCU_LED_On();
		delay_ms(500);
  }
}
相关推荐
清风66666610 小时前
基于单片机与DAC0832的双路波形信号发生系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
azwsm11 小时前
电路元器件和GPIO控制器
单片机·嵌入式硬件
kebidaixu14 小时前
FreeRTOS 移植到 STM32F407VETX 记录(一)
stm32·单片机·嵌入式硬件
CSDN官方博客14 小时前
「谁说嵌入式只是调包和焊板子?」—— 2026嵌入式全栈技术征锋令
嵌入式硬件·物联网·embedding
点灯小铭15 小时前
基于单片机的数码管定时插座设计与定时开关功能实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
云栖梦泽15 小时前
玩转RK3506SDK
linux·嵌入式硬件
数智工坊17 小时前
机器人四大主控板系统分层选型指南:树莓派、ESP32、STM32与Arduino的能力边界与实战定位
stm32·嵌入式硬件·机器人
进击的小头18 小时前
第8篇:IGBT 从零到精通:核心原理、关键参数、选型指南与工业级应用要点
经验分享·嵌入式硬件·学习
点灯小铭18 小时前
基于单片机的多模式智能洗衣机设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
项目題供诗18 小时前
STM32-AD单通道&AD多通道(十九)
stm32·单片机·嵌入式硬件