STM32+RT-Thread学习笔记1——GPIO
一、GPIO的初始化方式
1、 使用库函数进行初始化
可以直接定义函数进行初始化,使用方法和裸机编程没有区别
void My_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_10, GPIO_PIN_SET);
/*Configure GPIO pin : PH10 */
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
}
2、 使用rt设备进行初始化
使用这种方式进行初始化可能会存在一些问题,例如:
#define LED_RED_PIN GET_PIN(H,10)
#define LED_BLUE_PIN GET_PIN(H,11)
此时第一个编译通过,而第二个出现报错:
error: 'H' undeclared (first use in this function)
暂时还没有找到问题出现的原因,找到一种取代方法:
到drv_gpio.c
文件下找到对应管脚代码:
#if defined(GPIOH)
__STM32_PIN(112, H, 0),
__STM32_PIN(113, H, 1),
__STM32_PIN(114, H, 2),
__STM32_PIN(115, H, 3),
__STM32_PIN(116, H, 4),
__STM32_PIN(117, H, 5),
__STM32_PIN(118, H, 6),
__STM32_PIN(119, H, 7),
__STM32_PIN(120, H, 8),
__STM32_PIN(121, H, 9),
__STM32_PIN(122, H, 10),
__STM32_PIN(123, H, 11),
__STM32_PIN(124, H, 12),
__STM32_PIN(125, H, 13),
__STM32_PIN(126, H, 14),
__STM32_PIN(127, H, 15),
发现H,11管脚前面对应值为123,将代码改为:
#define LED_RED_PIN GET_PIN(H,10)
#define LED_BLUE_PIN 123
OK,编译通过功能正常
接着使用下面的rt设备命令进行初始化即可
#define LED_RED1_PIN GET_PIN(H,12)
void My_GPIO_Init(void)
{
rt_pin_mode(LED_BLUE_PIN, PIN_MODE_OUTPUT);
}
二、GPIO配置示例
1、 HAL库部分省略,可参考其他裸机编程
2、 rt设备库
类型 | 参数 | 值 | 含义 |
---|---|---|---|
rt_base_t | pin | \ | 之前通过#define定义的宏,本质是管脚编号 |
rt_base_t | mode | PIN_MODE_OUTPUT | 输出模式 |
PIN_MODE_INPUT | 输入模式 | ||
PIN_MODE_INPUT_PULLUP | 上拉电阻输入模式 | ||
PIN_MODE_INPUT_PULLDOWN | 下拉电阻输入模式 | ||
PIN_MODE_OUTPUT_OD | 开漏输出 | ||
rt_base_t | value | PIN_LOW | 低电平 |
PIN_HIGH | 高电平 |
void rt_pin_mode(rt_base_t pin, rt_base_t mode)
void rt_pin_write(rt_base_t pin, rt_base_t value)
int rt_pin_read(rt_base_t pin)