延时函数学习完之后,可以学习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、测试程序文章来源:https://www.toymoban.com/news/detail-691004.html
#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();
}
/*
一、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功能:
__HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟
__HAL_RCC_GPIOB_CLK_ENABLE();//使能GPIOB时钟
__HAL_RCC_GPIOF_CLK_ENABLE();//使能GPIOF时钟
HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
根据GPIO_InitTypeDef型结构变量指定的参数初始化GPIOx的外设寄存器
HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
PinState=0,GPIOx端口的GPIO_Pin引脚输出低电平;PinState=1,GPIOx端口的GPIO_Pin引脚输出高电平
HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
GPIOx端口的GPIO_Pin的输出电平翻转
HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
读取"GPIOx端口的第GPIO_Pin引脚"输入的电平值
HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
将"GPIOx端口的GPIO_Pin引脚"的外设寄存器恢复到"复位时的默认值"
HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
锁定GPIO引脚GPIO_Pin的配置;当GPIO_Pin执行了"锁键的写入时序"后,在下次系统复位前将不能再更改端口位的配置;
//这个回调函数没啥用
*/
#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 "py32f0xx_hal.h"
#include "delay.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引脚默认置于输入下拉模式
*/
int main(void)
{
delay_init();//配置"SysTick定时器"每1ms中断一次,优先级为最低
MCU_LED_Init();//MCU_LED灯引脚初始化,并配置为关灯
HAL_Delay(1000);
while (1)
{
MCU_LED_Toggle();
delay_ms(1000);
}
}
#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中断一次
//配置"SysTick定时器"时钟源为系统时钟,并使能中断
//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中断一次,优先级为最低
//HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource)
//设置系统滴答定时器的时钟源
//CLKSource=SYSTICK_CLKSOURCE_HCLK_DIV8时,系统滴答定时器的时钟源为系统时钟的8分频
//CLKSource=SYSTICK_CLKSOURCE_HCLK,系统滴答定时器的时钟源为系统时钟
文章来源地址https://www.toymoban.com/news/detail-691004.html
到了这里,关于PY32F003F18点灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!