按键串口中断,三种模式切换

 要求通过单片机实现以下功能:

    1,单片机有三种工作模式(定义全局变量MM表示模式,MM=1,2,3表示三种不同的模式)LED控制模式风扇控制模式蜂鸣器控制模式

   2.可以在某一个模式下通过拓展板KEY1按键控制设备按键按下一次,设备打开,按键再按下一次,设备关闭(设备管脚输出反向电平)

   3.关于模式的切换可以通过以下两种方式:通过串口通信,

        电脑端发送当前模式(设置串口接收中断,接收到的字符串进行比较)

                电脑发送LED,进入LED模式

                电脑发送FAN,进行风扇控制模式

                电脑发送BEE,进入蜂鸣器控制模式。
        通过底板用户自定义按键进行模式切换按键按下一次进入LED模式,再按一次,进入风扇模式,再按一下,进入蜂鸣器模式

对应控制管脚

中断部分:

        user(PA12)

        KEY1(PC9)

        串口中断(PA9)(PA10)

输出部分:

        LED ( PC4)

        FAN ( PC6)

        BEEP (PA15 )

 main.c

#include "main.h"
#include "icache.h"
#include "usart.h"
#include "gpio.h"



/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void SystemPower_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#include "stdio.h"
#include "string.h"
//printf重映射
int fputc(int ch,FILE* F)
{
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1 , 10);
	return ch;
}
//user实现
int M=0;
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_12)
	{
			M++;
	}
	switch(M%3)
	{
		case 0://LED
			if(GPIO_Pin == GPIO_PIN_9)
			{
				HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4);
			}
		break;
		case 1://FAN
			if(GPIO_Pin == GPIO_PIN_9)
			{
				HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6);
			}
		break;
		case 2://BEE
			if(GPIO_Pin == GPIO_PIN_9)
			{
				HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15);
			}
		break;
	}	
	
}
//串口实现
char buf[32];//记录串口数据
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(strncmp(buf,"LED", 3)==0)
	{
		M=0;
		printf("buf::%s", buf);
	}
	else if(strncmp(buf, "FAN", 3)==0)
	{
		M=1;
		printf("buf::%s", buf);
	}
	else if (strncmp(buf,"BEE", 3)==0)
	{
		M=2;
		printf("buf::%s", buf);
	}else{
		printf("error\n\r");
		printf("buf::%s", buf);
	}
		HAL_UART_Receive_IT(&huart1,(uint8_t*)buf, 3);
}

/* USER CODE END 0 */

/**
  * @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();

  /* Configure the System Power */
  SystemPower_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ICACHE_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

  while (1)
  {
    /* USER CODE END WHILE */
			HAL_UART_Receive_IT(&huart1,(uint8_t*)buf, 3);
    /* USER CODE BEGIN 3 */
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值