当前位置: 首页 > article >正文

基于SMT32U575RIT单片机-中断练习

练习要求:

1、通过扩展板按键key1,开/关元器件;

2、通过串口选择模式(通过中断实现):

        LED: 切换只控制LED;

        FAN: 切换只控制FAN;

        BEE: 切换只控制蜂蜜器;

3、通过底板的USER按键,切换工作模式,按一次切换一个模式,模式类型见2.

1、分析原理图得到以下结论

根据上表,通过CubeMax配置功能(略)

2、keil添加自定义my_prps.h和my_prps.c

封装以实现功能:

1)封装LED1、LED3、FAN和BEE的启动、关闭和切换

2)实现mode_set、mode_change(切换模式)

2.1 my_prps.h

#ifndef _MY_PRPS_H_
#define _MY_PRPS_H_

void led_on(int ledno);
void led_off(int ledno);
void led_toggle(int ledno);

void fan_on();
void fan_off();
void fan_toggle();

void bee_on();
void bee_off();
void bee_toggle();

void mode_set(int mm);
void mode_change();
void mode_toggle();

#endif

2.2 my_prps.c

#include "my_prps.h"
#include "gpio.h"
#include <stdio.h>

static int mode=1;//1-LED, 2-FAN, 3-BEE

void led_on(int ledno){
	if(ledno == 1){
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
			return;
	}
	if(ledno == 3){
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
			return;
	}
}

void led_off(int ledno){
	if(ledno == 1){
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET);
			return;
	}
	if(ledno == 3){
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
			return;
	}
}
void led_toggle(int ledno){
	if(ledno == 1){
			HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4);
			return;
	}
	if(ledno == 3){
			HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
			return;
	}
}

void fan_on(){
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
}

void fan_off(){
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
}

void fan_toggle(){
	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6);
}

void bee_on(){
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
}

void bee_off(){
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
}

void bee_toggle(){
	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15);
}

void mode_set(int mm){
	printf("即将设置模式为[%d]\n\r", mm);
	mode = mm;
	led_off(1);
	led_off(3);
	fan_off();
	bee_off();
}

void mode_change(){
	mode++;
	mode=(mode%3)+1;
	mode_set(mode);
}
	
void mode_toggle(){
	switch(mode){
		case 1:
			led_toggle(1);
			led_toggle(3);
			break;
		case 2:
			fan_toggle();
			break;
		case 3:
			bee_toggle();
			break;
	}
}

3、在main.c中 重写uart1、按键key1和按键User的中断回调函数

main.c

char buf[32]={0};
//int bufIndex=0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	printf("buf=[%s]\n\r", buf);
	HAL_UART_Receive_IT(&huart1, (uint8_t*)&buf, 3);
	if(strcmp(buf, "LED")==0){
		printf("即将切换至[LED]模式\n\r");
		mode_set(1);
		return;
	}
	if(strcmp(buf, "FAN")==0){
		printf("即将切换至[FAN]模式\n\r");
		mode_set(2);
		return;
	}
	if(strcmp(buf, "BEE")==0){
		printf("即将切换至[BEE]模式\n\r");
		mode_set(3);
		return;
	}
}

int fputc(int ch, FILE * fp){
	HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 10);
	return ch;
}

//KEY1和USER button interrupt
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin){
	printf("rising callback:[%d]\n\r", GPIO_Pin);
	if(GPIO_Pin == GPIO_PIN_9){
		//KEY1 Button pressed
		mode_toggle();
		return;
	}
	if(GPIO_Pin == GPIO_PIN_12){
		//User Button pressed
		mode_change();
		return;
	}
}

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 */
	HAL_UART_Receive_IT(&huart1, (uint8_t*)&buf, 3);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	/*
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
	
	HAL_Delay(2000);
	
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
	*/
	
	
  while (1)
  {
		//printf("hello world\n\r");
		//HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


http://www.kler.cn/a/471302.html

相关文章:

  • Android NDK开发实战之环境搭建篇(so库,Gemini ai)
  • 【问题】配置 Conda 与 Pip 源
  • TCP 如何获取端口信息
  • 对话|全年HUD前装将超330万台,疆程技术瞄准人机交互“第一屏”
  • STM32U575按键转换及设备驱动
  • 批量写入数据到数据库,卡顿怎么解决
  • 【蓝桥杯——物联网设计与开发】Part2:OLED
  • 债券回购简述
  • HTTP 协议中,GET、PUT、POST、DELETE、OPTIONS 和 PATCH 区别
  • Git 常用命令及其使用场景
  • RabbitMQ ubuntu 在线安装
  • _decl_class_registry 与 metadata.sorted_tables的区别
  • 以柔资讯-D-Security终端文件保护系统 logFileName 任意文件读取漏洞复现
  • 机器学习——线性回归
  • 运动相机拍摄的视频打不开怎么办
  • 如何解决Redis中的热点key问题
  • Microsoft Azure Cosmos DB:全球分布式、多模型数据库服务
  • 设计模式--享元模式【结构型模式】
  • 【python】字符串元素的访问与截取
  • QT c++ 自定义按钮类 加载图片 美化按钮
  • LeetCode 3019.按键变更的次数:遍历(转小写)
  • selenium找不到元素解决方案-切换iframe
  • Bash语言的文件操作
  • HTML5-标签
  • Swin-Transformer
  • Web渗透测试之XSS跨站脚本攻击分类 详解