gd32 gpio 寄存器操作PB1 PB2为输入模式的代码
时间: 2024-09-15 13:12:10 浏览: 15
GD32是一款STM32系列的微控制器,GPIO模块用于控制数字输入输出。要将PB1和PB2设置为输入模式,你需要使用相应的GPIO寄存器操作。以下是GD32F4xx芯片上设置GPIO Pin B1(PB1)和Pin B2(PB2)为输入模式的基本步骤:
```c
#include "stm32f4xx_hal.h" // 包含HAL库
// 初始化GPIOB
GPIO_InitTypeDef GPIO_InitStruct;
// 设置GPIOB的时钟(如果你还没有做)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
// 配置PB1为输入模式
GPIO_InitStruct.Pin = GPIO_Pin_1; // 对应PB1
GPIO_InitStruct.Mode = GPIO_Mode_IN_FLOATING; // 输入浮空
GPIO_InitStruct.Pull = GPIO_NOPULL; // 无拉高拉低
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 初始化GPIOB
// 配置PB2为输入模式
GPIO_InitStruct.Pin = GPIO_Pin_2; // 对应PB2
HAL_GPIO_Init(GPIOB + GPIO_BASE address, &GPIO_InitStruct); // 加上偏移地址,因为GPIOB的配置是连续的
相关问题
GD32F3的GPIO寄存器操作宏定义
以下是 GD32F3 的 GPIO 寄存器操作宏定义示例:
```c
#define GPIO_BASE(port) (GPIOA_BASE + (port - GPIOA) * 0x0400U) // GPIO 基地址宏定义
#define GPIO_PIN(port, pin) (1U << (pin)) // GPIO 引脚宏定义
#define GPIO_MODER(port) (*(volatile uint32_t *)(GPIO_BASE(port) + 0x00U)) // GPIO 模式寄存器宏定义
#define GPIO_OTYPER(port) (*(volatile uint32_t *)(GPIO_BASE(port) + 0x04U)) // GPIO 输出类型寄存器宏定义
#define GPIO_OSPEEDR(port) (*(volatile uint32_t *)(GPIO_BASE(port) + 0x08U)) // GPIO 输出速度寄存器宏定义
#define GPIO_PUPDR(port) (*(volatile uint32_t *)(GPIO_BASE(port) + 0x0CU)) // GPIO 上下拉寄存器宏定义
#define GPIO_IDR(port) (*(volatile uint32_t *)(GPIO_BASE(port) + 0x10U)) // GPIO 输入数据寄存器宏定义
#define GPIO_ODR(port) (*(volatile uint32_t *)(GPIO_BASE(port) + 0x14U)) // GPIO 输出数据寄存器宏定义
#define GPIO_BSRR(port) (*(volatile uint32_t *)(GPIO_BASE(port) + 0x18U)) // GPIO 置位/复位寄存器宏定义
#define GPIO_LCKR(port) (*(volatile uint32_t *)(GPIO_BASE(port) + 0x1CU)) // GPIO 锁定寄存器宏定义
#define GPIO_AFRL(port) (*(volatile uint32_t *)(GPIO_BASE(port) + 0x20U)) // GPIO 复用功能低位寄存器宏定义
#define GPIO_AFRH(port) (*(volatile uint32_t *)(GPIO_BASE(port) + 0x24U)) // GPIO 复用功能高位寄存器宏定义
```
使用这些宏定义,可以方便地对 GD32F3 的 GPIO 寄存器进行操作,例如:
```c
// 设置 GPIOA 的第 1 个引脚为输出模式,推挽输出,最大输出速度为 50MHz
GPIO_MODER(GPIOA) |= (0x01U << (1U * 2U));
GPIO_OTYPER(GPIOA) &= ~(0x01U << 1U);
GPIO_OSPEEDR(GPIOA) |= (0x03U << (1U * 2U));
// 设置 GPIOA 的第 2 个引脚为输入模式,上拉输入模式
GPIO_MODER(GPIOA) &= ~(0x03U << (2U * 2U));
GPIO_PUPDR(GPIOA) &= ~(0x03U << (2U * 2U));
GPIO_PUPDR(GPIOA) |= (0x01U << (2U * 2U));
// 读取 GPIOA 的第 2 个引脚的输入数据
uint32_t input_data = GPIO_IDR(GPIOA) & GPIO_PIN(GPIOA, 2U);
```
STM32f103c8t6定义PB1为上拉输入,PB2和PB3为推挽输出的代码
以下是使用STM32CubeMX生成的代码示例,可以实现PB1为上拉输入,PB2和PB3为推挽输出:
```
/* Includes */
#include "main.h"
#include "stm32f1xx_hal.h"
/* Private function prototypes */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* Main function */
int main(void)
{
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* Infinite loop */
while (1)
{
/* Toggle PB2 and PB3 outputs every 100ms */
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2 | GPIO_PIN_3);
HAL_Delay(100);
}
}
/* GPIO Initialization function */
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
/* Configure PB1 as input pull-up */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* Configure PB2 and PB3 as output push-pull */
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/* System Clock Configuration */
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
```
在这段代码中,我们使用了HAL库的函数来进行GPIO的初始化,并且在主函数中设置了PB2和PB3的输出状态,每100ms翻转一次。