本文共 7471 字,大约阅读时间需要 24 分钟。
1. 打开 STM32CubeMX 软件,点击“新建工程”
2. 选择 MCU 和封装
3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)4. 配置调试模式
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器 SYS 设置,选择 Debug 为 Serial Wire在 System Core
中选择 GPIO
设置。
GPIO_Output
。 GPIO output level
中选择 Low
输出低电平点亮,可以添加自定义标签(这样生成代码也会根据标签设置引脚的宏定义)。 输入项目名和项目路径
’.c/.h’
文件 不勾:所有初始化代码都生成在 main.c 勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。 STM32CubeMX 使用 HAL 库生成的代码:
#define LED_G_Pin GPIO_PIN_0#define LED_G_GPIO_Port GPIOB#define LED_B_Pin GPIO_PIN_1#define LED_B_GPIO_Port GPIOB/** * @brief GPIO Initialization Function * @param None * @retval None */static void MX_GPIO_Init(void){ /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStruct = { 0}; /* GPIO Ports Clock Enable */ /*开启LED相关的GPIO外设时钟*/ __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ /* 关闭所有led灯 */ HAL_GPIO_WritePin(GPIOB, LED_G_Pin|LED_B_Pin, GPIO_PIN_SET); /*Configure GPIO pins : LED_G_Pin LED_B_Pin */ GPIO_InitStruct.Pin = LED_G_Pin|LED_B_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}HAL_GPIO_WritePin(GPIOB, LED_G_Pin|LED_B_Pin, GPIO_PIN_SET); // 输出高电平HAL_GPIO_WritePin(GPIOB, LED_G_Pin|LED_B_Pin, GPIO_PIN_RESET); // 输出低电平HAL_GPIO_TogglePin(GPIOB, LED_G_Pin); // 反转
使用 STM32 标准库的代码:
// R-红色#define LED1_GPIO_PORT GPIOA /* GPIO端口 */#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */#define LED1_GPIO_PIN GPIO_Pin_8 /* 连接到SCL时钟线的GPIO */// G-绿色#define LED2_GPIO_PORT GPIOB /* GPIO端口 */#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */#define LED2_GPIO_PIN GPIO_Pin_0 /* 连接到SCL时钟线的GPIO *//** * @brief 初始化控制LED的IO * @param 无 * @retval 无 */void LED_GPIO_Config(void){ /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /*开启LED相关的GPIO外设时钟*/ RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK, ENABLE); /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIO*/ GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure); /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN; /*调用库函数,初始化GPIO*/ GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure); /* 关闭所有led灯 */ GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN); GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN); }GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN); // 输出高电平GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN); // 输出低电平
__HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE();
对应 RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK, ENABLE);
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
对应 GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
HAL_GPIO_WritePin(GPIOB, LED_G_Pin|LED_B_Pin, GPIO_PIN_SET);
对应 GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
LED 灯闪烁
/** * @brief The application entry point. * @retval int */int main(void){ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN); // 输出高电平 HAL_Delay(1000); // 1秒 GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN); // 输出低电平 /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */}
在 System Core
中选择 GPIO
设置。
GPIO_Input
。 输入项目名和项目路径
STM32CubeMX 使用 HAL 库生成的代码:
#define KEY2_Pin GPIO_PIN_13#define KEY2_GPIO_Port GPIOC#define KEY1_Pin GPIO_PIN_0#define KEY1_GPIO_Port GPIOA/** * @brief GPIO Initialization Function * @param None * @retval None */static void MX_GPIO_Init(void){ GPIO_InitTypeDef GPIO_InitStruct = { 0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin : KEY2_Pin */ GPIO_InitStruct.Pin = KEY2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(KEY2_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : KEY1_Pin */ GPIO_InitStruct.Pin = KEY1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);}HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin); // 读取按键状态
使用 STM32 标准库的代码:
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA#define KEY1_GPIO_PORT GPIOA #define KEY1_GPIO_PIN GPIO_Pin_0#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC#define KEY2_GPIO_PORT GPIOC #define KEY2_GPIO_PIN GPIO_Pin_13/** * @brief 配置按键用到的I/O口 * @param 无 * @retval 无 */void Key_GPIO_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; /*开启按键端口的时钟*/ RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE); //选择按键的引脚 GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN; // 设置按键的引脚为浮空输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键 GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure); //选择按键的引脚 GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN; //设置按键的引脚为浮空输入 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //使用结构体初始化按键 GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure); }GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_GPIO_PIN);
__HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE();
对应 RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
对应 GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin);
对应 GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_GPIO_PIN);
读取引脚电平
/** * @brief The application entry point. * @retval int */int main(void){ /* USER CODE BEGIN 1 */ uint8_t status = 0; /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { // 可以加打印看'status'数值判断高低电平 status = HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin); // 读取按键状态 HAL_Delay(1000); // 1秒 /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */}
用户代码要加在 USER CODE BEGIN N
和 USER CODE END N
之间,否则下次使用 STM32CubeMX 重新生成代码后,会被删除。
• 由 写于 2021 年 1 月 11 日
• 参考:
转载地址:http://whbq.baihongyu.com/