HAL库GPIO初始化
(本文章只是为了方便使用api,写着玩儿的,用的正点原子的开发板,STM32103ZET6)
1、配置IO口
typedef struct
{
uint32_t Pin; /*引脚号*/
uint32_t Mode; /*模式设置*/
uint32_t Pull; /*上拉下拉设置*/
uint32_t Speed; /*速度设置*/
} GPIO_InitTypeDef;
(1)Mode
#define GPIO_MODE_INPUT (0x00000000u) /*输入模式*//*禁止输出*/
#define GPIO_MODE_OUTPUT_PP (0x00000001u) /*推挽输出*//*高电平输出不推荐,设置低电平,接外部电源,可以读取IO口,电流型驱动*/
#define GPIO_MODE_OUTPUT_OD (0x00000011u) /*开漏输出*//*可以读取IO口状态*/
#define GPIO_MODE_AF_PP (0x00000002u) /*推挽式复用*/
#define GPIO_MODE_AF_OD (0x00000012u) /*开漏式复用*/
#define GPIO_MODE_AF_INPUT GPIO_MODE_INPUT
#define GPIO_MODE_ANALOG (0x00000003u) /*模拟模式*/
#define GPIO_MODE_IT_RISING (0x10110000u) /*外部中断,上升沿触发检测*/
#define GPIO_MODE_IT_FALLING (0x10210000u) /*外部中断,下降沿触发检测*/
#define GPIO_MODE_IT_RISING_FALLING (0x10310000u) /*外部中断,上升和下降双沿触发检测*/
#define GPIO_MODE_EVT_RISING (0x10120000u) /*外部事件,上升沿触发检测*/
#define GPIO_MODE_EVT_FALLING (0x10220000u) /*外部事件,下降沿触发检测*/
#define GPIO_MODE_EVT_RISING_FALLING (0x10320000u) /*外部事件,上升和下降双沿触发检测*/
(2)Pull
#define GPIO_NOPULL 0x00000000u /*无上下拉 */
#define GPIO_PULLUP 0x00000001u /*上拉*/
#define GPIO_PULLDOWN 0x00000002u /*下拉*/
(3)Speed
#define GPIO_SPEED_FREQ_LOW (GPIO_CRL_MODE0_1) /*低速 */
#define GPIO_SPEED_FREQ_MEDIUM (GPIO_CRL_MODE0_0) /*中速 */
#define GPIO_SPEED_FREQ_HIGH (GPIO_CRL_MODE0) /*高速 */
2、步骤
void key_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOE_CLK_ENABLE(); /* IO口PE时钟使能 */
gpio_init_struct.Pin=GPIO_PIN_3;
gpio_init_struct.Mode=GPIO_MODE_INPUT; /*输入模式*/
gpio_init_struct.Pull=GPIO_PULLUP; /*上拉电阻*/
gpio_init_struct.Speed=GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOE, &gpio_init_struct);
//return HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3);
}
3、函数
HAL库自带的api,直接使用即可
(1)读回pin脚电平
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
GPIO_PinState bitstatus;
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
{
bitstatus = GPIO_PIN_SET;
}
else
{
bitstatus = GPIO_PIN_RESET;
}
return bitstatus;
}
/*ex:HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3);返回1或者0*/
(2)设置pin脚电平
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
assert_param(IS_GPIO_PIN_ACTION(PinState));
if (PinState != GPIO_PIN_RESET)
{
GPIOx->BSRR = GPIO_Pin;
}
else
{
GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;
}
}
/*ex:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);*/
(3)翻转电平
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
uint32_t odr;
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
/* get current Ouput Data Register value */
odr = GPIOx->ODR;
/* Set selected pins that were at low level, and reset ones that were high */
GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
}
2万+

被折叠的 条评论
为什么被折叠?



