• 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引脚"输入的电平值

    三、测试程序

    1. #include "Key.h"
    2. #include "py32f0xx_hal.h"
    3. void Key1_Init(void);
    4. //函数功能:Key1引脚初始化
    5. void Key1_Init(void)
    6. {
    7. GPIO_InitTypeDef GPIO_InitStructureure;
    8. __HAL_RCC_GPIOA_CLK_ENABLE(); //GPIOA时钟使能
    9. GPIO_InitStructureure.Pin = GPIO_PIN_12; //选择第12
    10. GPIO_InitStructureure.Pull = GPIO_NOPULL; //引脚上拉和下拉都没有被激活
    11. GPIO_InitStructureure.Speed = GPIO_SPEED_FREQ_MEDIUM;//配置GPIO速度为中速
    12. GPIO_InitStructureure.Mode = GPIO_MODE_INPUT;//设置引脚工作模式为输入浮空模式
    13. HAL_GPIO_Init(GPIOA,&GPIO_InitStructureure);
    14. //根据GPIO_InitStructureure结构变量指定的参数初始化GPIOA的外设寄存器
    15. }
    1. #include "LED.h"
    2. void MCU_LED_Init(void);
    3. //函数功能:MCU_LED灯引脚初始化,并配置为关灯
    4. void MCU_LED_Init(void)
    5. {
    6. GPIO_InitTypeDef GPIO_InitStructure;
    7. __HAL_RCC_GPIOB_CLK_ENABLE();//使能GPIOB时钟
    8. //初始化GPIOB5
    9. GPIO_InitStructure.Pin = GPIO_PIN_5; //选择第5
    10. GPIO_InitStructure.Pull = GPIO_PULLUP; //引脚上拉被激活
    11. GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //配置GPIO速度为极高
    12. GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //设置引脚工作模式为推挽输出方式
    13. HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
    14. //根据GPIO_InitStructure结构变量指定的参数初始化GPIOB的外设寄存器
    15. MCU_LED_Off();
    16. }
    1. #ifndef __LED_H
    2. #define __LED_H
    3. #include "py32f0xx_hal.h"
    4. #define MCU_LED_On() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET) //输出低电平开灯
    5. #define MCU_LED_Off() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET) //输出高电平关灯
    6. #define MCU_LED_Toggle() HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5) //输出电平翻转
    7. extern void MCU_LED_Init(void);
    8. #endif /* __LED_H */
    1. #include "delay.h"
    2. static uint8_t fac_us=0; //us延时倍乘数
    3. void delay_init(void);
    4. void delay_us(uint32_t nus);
    5. void delay_ms(uint32_t nms);
    6. //函数功能:配置"SysTick定时器"1ms中断一次,优先级为最低
    7. void delay_init(void)
    8. {
    9. fac_us=SystemCoreClock/1000000;//不论是否使用OS,fac_us都需要使用
    10. uwTickFreq=HAL_TICK_FREQ_1KHZ;
    11. //准备配置"SysTick定时器"1ms中断一次
    12. //HAL_TICK_FREQ_10HZ= 100,"SysTick计数器"的中断周期为100ms
    13. //HAL_TICK_FREQ_100HZ= 10,"SysTick计数器"的中断周期为10ms
    14. //HAL_TICK_FREQ_1KHZ = 1,"SysTick计数器"的中断周期为1ms
    15. HAL_InitTick(PRIORITY_LOWEST);//配置"SysTick定时器"1ms中断一次,优先级为最低
    16. // HAL_Init();//配置"SysTick定时器"1ms中断一次,优先级为最低
    17. HAL_SetTickFreq(uwTickFreq);//设置"SysTick滴答定时器"的中断周期为uwTickFreq个毫秒
    18. }
    19. //函数功能:延时nus
    20. //nus:要延时的us数.
    21. //nus:0~204522252(最大值即2^32/fac_us)
    22. void delay_us(uint32_t nus)
    23. {
    24. uint32_t ticks;
    25. uint32_t told,tnow,tcnt=0;
    26. uint32_t reload=SysTick->LOAD;//读取"SysTick定时器"自动重装载值
    27. ticks=nus*fac_us; //需要的节拍数
    28. told=SysTick->VAL; //读取"系统滴答定时器的计数值"
    29. while(1)
    30. {
    31. tnow=SysTick->VAL;//读取"系统滴答定时器的计数值"
    32. if(tnow!=told)
    33. {
    34. if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
    35. else tcnt+=reload-tnow+told;
    36. told=tnow;
    37. if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
    38. }
    39. }
    40. }
    41. //函数功能:延时nms
    42. //nms:要延时的ms数
    43. //nms:0~65535
    44. void delay_ms(uint32_t nms)
    45. {
    46. delay_us((uint32_t)(nms*1000));//普通方式延时
    47. }
    48. //HAL库接口函数
    49. //HAL_Delay(x)延时x毫秒,x<0xFFFFFFFF,至少需要延时一个周期
    50. //HAL_SuspendTick();不使能"SysTick滴答定时器"中断
    51. //HAL_ResumeTick();使能"SysTick滴答定时器"中断
    52. //HAL_GetTickFreq();读取"SysTick滴答定时器"的中断频率
    53. //HAL_SetTickFreq(Freq);设置"SysTick滴答定时器"的中断频率为Freq
    54. //HAL_GetTickPrio();读取"SysTick滴答定时器"的中断优先级
    55. //HAL_GetTick();读取"SysTick滴答定时器"的中断次数计数器uwTick
    56. //HAL_IncTick();供SysTick_Handler()调用
    57. //uwTickFreq=HAL_TICK_FREQ_1KHZ;//准备配置"SysTick定时器"1ms中断一次
    58. //HAL_InitTick(PRIORITY_LOWEST);//配置"SysTick定时器"1ms中断一次,优先级为最低
    1. #include "py32f0xx_hal.h"
    2. #include "delay.h"
    3. #include "Key.h"
    4. #include "LED.h"
    5. /*
    6. PY32F003F1818个I/O,均可作为外部中断
    7. 每个GPIO都可以由软件配置为输出:推挽输出(push-pull),开漏极输出(open drain);注意:驱动电流为8mA;
    8. 每个GPIO都可以由软件配置为输入:浮空输入(floating),上拉输入(pull-up),下拉输入(pull-down),模拟输入(analog);
    9. 每个GPIO都可以由软件配置为外设复用功能;
    10. Debug引脚默认被置于复用功能上拉或下拉模式:
    11. PA14默认为SWCLK: 置于下拉模式
    12. PA13默认为SWDIO: 置于上拉模式
    13. PF4默认为Boot:Boot引脚默认置于输入下拉模式
    14. */
    15. void Delay_ms(uint32_t x_ms);
    16. int main(void)
    17. {
    18. // HSE_Config();
    19. //初始化"HSI,HSE,LSI振荡器",HSE用作系统时钟(SYSCLK),同时配置"AHB时钟(HCLK)和APB时钟(PCLK)"
    20. delay_init();
    21. Key1_Init();//Key1引脚初始化
    22. MCU_LED_Init();//MCU_LED灯引脚初始化,并配置为关灯
    23. HAL_Delay(1000);
    24. while (1)
    25. {
    26. if( Key1_LevelValue() ) MCU_LED_Off();
    27. else MCU_LED_On();
    28. delay_ms(500);
    29. }
    30. }

  • 相关阅读:
    一文带你玩转k0s
    RIP小实验配置及缺省路由下发
    【入门】使用sklearn实现的KNN算法:鸢尾花数据集分类预测
    要让程序员在代码中添加注释
    极坐标扇图使用场景与功能详解
    基于Springboot开发实现二手交易商城
    重庆东微电子推出高性能抗射频干扰MEMS硅麦放大器芯片
    undo log
    Avalonia 11.0.0 正式版发布
    Java 注解
  • 原文地址:https://blog.csdn.net/weixin_42550185/article/details/132649931