• PY32F003F18点灯


    延时函数学习完之后,可以学习PY32F003F18的GPIO输出功能。

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

    2、GPIO输出状态:

    1)、push-pull,推挽输出

    2)、open drain,开漏极输出

    3)、上拉/下拉

    #define  GPIO_NOPULL        (0x00000000u)   //引脚上拉和下拉都没有被激活
    #define  GPIO_PULLUP        (0x00000001u)   //引脚上拉被激活,Pull-up activation
    #define  GPIO_PULLDOWN      (0x00000002u)   //引脚下拉被激活,Pull-down activation

    3、测试程序

    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. }
    17. /*
    18. 一、PY32F003F18的GPIO介绍
    19. 1、PY32F003F1818个I/O,均可作为外部中断;
    20. 2、每个GPIO都可以由软件配置为输出:
    21. 1)、推挽输出(push-pull)
    22. 2)、开漏极输出(open drain)
    23. 注意:驱动电流为8mA;
    24. 3、每个GPIO都可以由软件配置为输入:
    25. 1)、浮空输入(floating)
    26. 2)、上拉输入(pull-up)
    27. 3)、下拉输入(pull-down)
    28. 4)、模拟输入(analog)
    29. 4、每个GPIO都可以由软件配置为外设复用功能;
    30. 5、Debug引脚默认被置于复用功能上拉或下拉模式:
    31. PA14默认为SWCLK: 置于下拉模式
    32. PA13默认为SWDIO: 置于上拉模式
    33. PF4默认为Boot:Boot引脚默认置于输入下拉模式
    34. 普通GPIO功能:
    35. __HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟
    36. __HAL_RCC_GPIOB_CLK_ENABLE();//使能GPIOB时钟
    37. __HAL_RCC_GPIOF_CLK_ENABLE();//使能GPIOF时钟
    38. HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
    39. 根据GPIO_InitTypeDef型结构变量指定的参数初始化GPIOx的外设寄存器
    40. HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
    41. PinState=0,GPIOx端口的GPIO_Pin引脚输出低电平;PinState=1,GPIOx端口的GPIO_Pin引脚输出高电平
    42. HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
    43. GPIOx端口的GPIO_Pin的输出电平翻转
    44. HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
    45. 读取"GPIOx端口的第GPIO_Pin引脚"输入的电平值
    46. HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
    47. "GPIOx端口的GPIO_Pin引脚"的外设寄存器恢复到"复位时的默认值"
    48. HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
    49. 锁定GPIO引脚GPIO_Pin的配置;当GPIO_Pin执行了"锁键的写入时序"后,在下次系统复位前将不能再更改端口位的配置;
    50. //这个回调函数没啥用
    51. */
    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 "py32f0xx_hal.h"
    2. #include "delay.h"
    3. #include "LED.h"
    4. /*
    5. PY32F003F1818个I/O,均可作为外部中断
    6. 每个GPIO都可以由软件配置为输出:推挽输出(push-pull),开漏极输出(open drain);注意:驱动电流为8mA;
    7. 每个GPIO都可以由软件配置为输入:浮空输入(floating),上拉输入(pull-up),下拉输入(pull-down),模拟输入(analog);
    8. 每个GPIO都可以由软件配置为外设复用功能;
    9. Debug引脚默认被置于复用功能上拉或下拉模式:
    10. PA14默认为SWCLK: 置于下拉模式
    11. PA13默认为SWDIO: 置于上拉模式
    12. PF4默认为Boot:Boot引脚默认置于输入下拉模式
    13. */
    14. int main(void)
    15. {
    16. delay_init();//配置"SysTick定时器"1ms中断一次,优先级为最低
    17. MCU_LED_Init();//MCU_LED灯引脚初始化,并配置为关灯
    18. HAL_Delay(1000);
    19. while (1)
    20. {
    21. MCU_LED_Toggle();
    22. delay_ms(1000);
    23. }
    24. }
    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. //配置"SysTick定时器"时钟源为系统时钟,并使能中断
    13. //HAL_TICK_FREQ_10HZ= 100,"SysTick计数器"的中断周期为100ms
    14. //HAL_TICK_FREQ_100HZ= 10,"SysTick计数器"的中断周期为10ms
    15. //HAL_TICK_FREQ_1KHZ = 1,"SysTick计数器"的中断周期为1ms
    16. HAL_InitTick(PRIORITY_LOWEST);//配置"SysTick定时器"1ms中断一次,优先级为最低
    17. // HAL_Init();//配置"SysTick定时器"1ms中断一次,优先级为最低
    18. HAL_SetTickFreq(uwTickFreq);//设置"SysTick滴答定时器"的中断周期为uwTickFreq个毫秒
    19. }
    20. //函数功能:延时nus
    21. //nus:要延时的us数.
    22. //nus:0~204522252(最大值即2^32/fac_us)
    23. void delay_us(uint32_t nus)
    24. {
    25. uint32_t ticks;
    26. uint32_t told,tnow,tcnt=0;
    27. uint32_t reload=SysTick->LOAD;//读取"SysTick定时器"自动重装载值
    28. ticks=nus*fac_us; //需要的节拍数
    29. told=SysTick->VAL; //读取"系统滴答定时器的计数值"
    30. while(1)
    31. {
    32. tnow=SysTick->VAL;//读取"系统滴答定时器的计数值"
    33. if(tnow!=told)
    34. {
    35. if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
    36. else tcnt+=reload-tnow+told;
    37. told=tnow;
    38. if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
    39. }
    40. }
    41. }
    42. //函数功能:延时nms
    43. //nms:要延时的ms数
    44. //nms:0~65535
    45. void delay_ms(uint32_t nms)
    46. {
    47. delay_us((uint32_t)(nms*1000));//普通方式延时
    48. }
    49. //HAL库接口函数
    50. //HAL_Delay(x)延时x毫秒,x<0xFFFFFFFF,至少需要延时一个周期
    51. //HAL_SuspendTick();不使能"SysTick滴答定时器"中断
    52. //HAL_ResumeTick();使能"SysTick滴答定时器"中断
    53. //HAL_GetTickFreq();读取"SysTick滴答定时器"的中断频率
    54. //HAL_SetTickFreq(Freq);设置"SysTick滴答定时器"的中断频率为Freq
    55. //HAL_GetTickPrio();读取"SysTick滴答定时器"的中断优先级
    56. //HAL_GetTick();读取"SysTick滴答定时器"的中断次数计数器uwTick
    57. //HAL_IncTick();供SysTick_Handler()调用
    58. //uwTickFreq=HAL_TICK_FREQ_1KHZ;//准备配置"SysTick定时器"1ms中断一次
    59. //HAL_InitTick(PRIORITY_LOWEST);//配置"SysTick定时器"1ms中断一次,优先级为最低
    60. //HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource)
    61. //设置系统滴答定时器的时钟源
    62. //CLKSource=SYSTICK_CLKSOURCE_HCLK_DIV8时,系统滴答定时器的时钟源为系统时钟的8分频
    63. //CLKSource=SYSTICK_CLKSOURCE_HCLK,系统滴答定时器的时钟源为系统时钟

  • 相关阅读:
    vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
    英语翻译的重点词汇词组
    react组件通信
    网络基础(传输层UDP协议&TCP协议)
    NX二次开发-设置WCS显示UF_CSYS_set_wcs_display
    MySql运维篇---008:日志:错误日志、二进制日志、查询日志、慢查询日志,主从复制:概述 虚拟机更改ip注意事项、原理、搭建步骤
    Linux—权限管理
    【Linux】线程(二:线程控制)
    MTK2735(1)——环境相关linux(ADB调试)
    DEEC算法附Matlab代码
  • 原文地址:https://blog.csdn.net/weixin_42550185/article/details/132641408