帮我写一段代码C语言32单片机,单片机型号为stm32G431RBT6,实现该按键B1作为输出信号通道切换,每次按下该按键B1,输出通道进行切换一次,每按一次只允许切换一次。通道切换规律如下: PA1→PA2→PA3→PA1→PA2→PA3...重点解释按键按下的代码
时间: 2024-05-12 10:15:09 浏览: 73
好的,以下是基于STM32CubeIDE的C语言代码,实现了按键B1作为输出信号通道切换的功能,每按一次只允许切换一次,通道切换规律为PA1→PA2→PA3→PA1→PA2→PA3...:
``` C
#include "main.h"
int main(void)
{
/* 初始化HAL库 */
HAL_Init();
/* 初始化系统时钟 */
SystemClock_Config();
/* 初始化GPIO */
MX_GPIO_Init();
/* 初始化按键B1 */
MX_GPIO_Init_B1();
/* 定义变量channel表示当前输出通道 */
uint8_t channel = 1;
while (1)
{
/* 检测按键B1是否按下 */
if (HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == GPIO_PIN_RESET)
{
/* 延时一段时间,防止抖动 */
HAL_Delay(50);
/* 检测按键B1是否仍处于按下状态,避免误操作 */
if (HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin) == GPIO_PIN_RESET)
{
/* 判断当前输出通道 */
switch (channel)
{
case 1:
/* 切换到通道2 */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
channel = 2;
break;
case 2:
/* 切换到通道3 */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
channel = 3;
break;
case 3:
/* 切换到通道1 */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
channel = 1;
break;
default:
break;
}
/* 延时一段时间,防止连续多次切换 */
HAL_Delay(500);
}
}
}
}
/* 初始化GPIO */
void MX_GPIO_Init(void)
{
/* GPIO初始化结构体定义 */
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* 开启GPIOA时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/* 配置PA1、PA2、PA3为推挽输出模式 */
GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/* 初始化按键B1 */
void MX_GPIO_Init_B1(void)
{
/* GPIO初始化结构体定义 */
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* 开启GPIOC时钟 */
__HAL_RCC_GPIOC_CLK_ENABLE();
/* 配置PC13为输入模式,带上拉 */
GPIO_InitStruct.Pin = B1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
}
/* 初始化系统时钟 */
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** 配置内部时钟源为HSI48 */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48;
RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** 配置HCLK、PCLK1和PCLK2 */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI48;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler();
}
}
```
其中,`MX_GPIO_Init()`函数和`MX_GPIO_Init_B1()`函数用于初始化GPIO和按键B1,`SystemClock_Config()`函数用于初始化系统时钟。在`main()`函数中,通过while循环来持续检测按键B1是否被按下,通过判断当前输出通道,来切换到下一个输出通道,并且在每次按下按键B1后都需要延时一段时间,避免抖动和连续多次切换。
阅读全文