GPIO_InitTypeDef定义的是句柄吗?
时间: 2024-05-20 16:15:14 浏览: 14
是的,`GPIO_InitTypeDef` 定义的是 GPIO 句柄,用于配置 GPIO 的初始化参数。它包含了 GPIO 的各种配置选项,如引脚方向、输入输出模式、上下拉电阻等等。在使用 GPIO 前,需要先定义一个 `GPIO_InitTypeDef` 的结构体变量,然后填充相关参数,最后将其作为参数传递给相应的函数进行初始化。
相关问题
#include "RTE_Components.h" #include CMSIS_device_header #include "cmsis_os2.h" #include "cmsis_os.h" #include <stdio.h> #include "oled.h" #include "key.h" #include "led.h" #define SRC_KEY_PIN GPIO_Pin_0 #define POW_KEY_PIN GPIO_Pin_1 #define LED_PIN GPIO_Pin_13 void GPIO_Configuration(void); //定义任务句柄 osThreadId LEDTaskHandle; osThreadId OLEDTTaskHandle; osThreadId SpeedTaskHandle; //线程函数 void LEDTask(void const *argument); void OLEDTask(void const *argument); void SpeedTask(void const *argument); void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = SRC_KEY_PIN | POW_KEY_PIN; // PA0和PA1引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LED_PIN; // PC13引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); } void LEDTask(void const *argument) { while(1) { // 检测按键状态,如果需要进入测试,修改状态并尝试进入测试 // 如果是测试一或测试三,设置LED灯并进入相应状态 // 如果需要退出测试,修改状态,并且清除LED灯 // 通过osDelay(1)控制循环的时间延迟,CPU占用率降低 osDelay(1); } }用RTOS v1来补充代码
#includeRTE_Components.h"
#include <cmsis_os2.h>
#include "cmsis_os.h"
#include <stdio.h>
#include "oled.h"
#include "key.h"
#include "led.h"
#define SRC_KEY_PIN GPIO_Pin_0
#define POW_KEY_PIN GPIO_Pin_1
#define LED_PIN GPIO_Pin_13
//定义任务句柄
osThreadId_t LEDTaskHandle;
osThreadId_t OLEDTaskHandle;
osThreadId_t SpeedTaskHandle;
//线程函数
void LEDTask(void const *argument);
void OLEDTask(void const *argument);
void SpeedTask(void const *argument);
void GPIO_Configuration(void);
int main(void)
{
//初始化硬件
GPIO_Configuration();
LED_Init();
KEY_Init();
OLED_Init();
//创建线程
LEDTaskHandle = osThreadNew(LEDTask, NULL, NULL);
OLEDTaskHandle = osThreadNew(OLEDTask, NULL, NULL);
SpeedTaskHandle = osThreadNew(SpeedTask, NULL, NULL);
//启动操作系统
osKernelStart();
while(1);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = SRC_KEY_PIN | POW_KEY_PIN; // PA0和PA1引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LED_PIN; // PC13引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void LEDTask(void const *argument)
{
while(1)
{
// 检测按键状态,如果需要进入测试,修改状态并尝试进入测试
// 如果是测试一或测试三,设置LED灯并进入相应状态
// 如果需要退出测试,修改状态,并且清除LED灯
// 通过osDelay(1)控制循环的时间延迟,CPU占用率降低
osDelay(1);
}
}
void OLEDTask(void const *argument)
{
while(1)
{
// OLED显示任务
// 通过osDelay(1)控制循环的时间延迟,CPU占用率降低
osDelay(1);
}
}
void SpeedTask(void const *argument)
{
while(1)
{
// 速度检测任务
// 通过osDelay(1)控制循环的时间延迟,CPU占用率降低
osDelay(1);
}
}
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(uartHandle->Instance==USART1) { /* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE END USART1_MspInit 0 */ /* USART1 clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART1 interrupt Init */ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); /* USER CODE BEGIN USART1_MspInit 1 */ /* USER CODE END USART1_MspInit 1 */ }
这段代码是 USART1 的 MSP(MCU Support Package)初始化函数,用于初始化 USART1 的时钟、GPIO 引脚和中断。在该函数中,首先判断传入的 UART 句柄所对应的 USART 实例是否为 USART1,如果是,则执行 USART1 的初始化流程。
在该函数中,使用了 `__HAL_RCC_USART1_CLK_ENABLE()` 函数启用了 USART1 的时钟,并使用 `__HAL_RCC_GPIOA_CLK_ENABLE()` 函数启用了 GPIOA 的时钟。然后,通过 `GPIO_InitStruct` 结构体对 GPIO 引脚进行了配置,设置了 PA9 引脚为复用推挽输出模式,用于 USART1 的 TX 引脚;设置了 PA10 引脚为输入模式,用于 USART1 的 RX 引脚。接下来,使用 `HAL_GPIO_Init()` 函数初始化 GPIO 引脚。
最后,使用 `HAL_NVIC_SetPriority()` 函数设置 USART1 中断的优先级为最高,并使用 `HAL_NVIC_EnableIRQ()` 函数使能 USART1 中断。