STM32开发(CubeMX+HAL)——点灯(轮询、中断)

news2024/11/27 8:24:52

目录

1.CubeMX生成工程文件

2.点灯1——轮询

3.点灯2——中断

3.1CubeMX配置时钟

3.2中断和事件简介

3.3配置GPIO口

3.4使能中断

3.5配置工程

3.6中断函数编写


1.CubeMX生成工程文件

1.1新建工程

1.2输入STM32C8T6选择芯片

 

 1.3双击芯片

 1.4 选择System Core—SYS——Debug设置为Serial Wire

 1.4点击引脚PA0、PA1设置为IO输入

PB8、PB9设置为输出引脚

 1.5设置IO口的默认电平

将PB8、PB9的电平设置为默认高电平,不亮灯

 1.6项目输出设置

注意:文件路径不能有中文-图中3路径是错误的案例。

 1.7代码生成设置

 1.8生成代码

 1.9成功生成代码-打开代码

2.点灯1——轮询

1.User/Core下有main函数

 2.在gpio口函数中可以看到如何对IO口进行操作

F12进入对应的函数段。

主函数F12 ——MX_GPIO_Init();——进入gpio相关函数
gpio函数F12——HAL_GPIO_Init——进入HAL-gpio函数相关操作

编写主函数:

这里都喜欢宏定义,不喜直接用数字

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define Key_on 0
#define Key_off 1
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

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

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t Key_state(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
	if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin)== GPIO_PIN_RESET){
	//按键被按下
		while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin)==0);  //被按下时一直停在这里
		return Key_on;
	}else{
		return Key_off;
	}
}
/* 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();

  /* 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)
  {
    /* USER CODE END WHILE */
		//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);
		if(Key_state(GPIOA, GPIO_PIN_0)==Key_on){
			//按键被按下
			HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);
		}
		if(Key_state(GPIOA, GPIO_PIN_1)==Key_on){
			//按键被按下
			HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
		}
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  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_0) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

3.点灯2——中断

  1. 配置时钟
  2. 配置GPIO口
  3. 使能中断
  4. 配置工程

3.1CubeMX配置时钟

作用:改变芯片的运行频率,频率高功耗大,速度快。

1.首先新建项目-找到芯片

SYS设置为Serial Wire
RCC中的High Speed Clock设置为Crystal/Ceramic Resonator

 2.设置Clock Configration

 

3.2中断和事件简介

中断优先级中的级别

  • 抢占优先级:高抢占可以打断低抢占
  • 响应优先级:高响应不可以打断低响应

中断是软件级别的事
事件是硬件级别的事

EXTI初始化结构体:

typedef struct
{
//中断/事件线
uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or
disabled.
This parameter can be any combination value
of @ref EXTI_Lines */
//EXTI 模式
EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines.
This parameter can be a value of @ref
EXTIMode_TypeDef */
//触发类型
EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for
the EXTI lines.
This parameter can be a value of @ref
EXTITrigger_TypeDef */
//EXTI 控制
FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI
lines.
This parameter can be set either to ENABLE or
DISABLE */
}EXTI_InitTypeDef;

中断/事件线:

#define EXTI_Line0 ((uint32_t)0x00001) /*!< External interrupt line 0 */
#define EXTI_Line1 ((uint32_t)0x00002) /*!< External interrupt line 1 */
#define EXTI_Line2 ((uint32_t)0x00004) /*!< External interrupt line 2 */
#define EXTI_Line3 ((uint32_t)0x00008) /*!< External interrupt line 3 */
#define EXTI_Line4 ((uint32_t)0x00010) /*!< External interrupt line 4 */
#define EXTI_Line5 ((uint32_t)0x00020) /*!< External interrupt line 5 */
#define EXTI_Line6 ((uint32_t)0x00040) /*!< External interrupt line 6 */
#define EXTI_Line7 ((uint32_t)0x00080) /*!< External interrupt line 7 */
#define EXTI_Line8 ((uint32_t)0x00100) /*!< External interrupt line 8 */
#define EXTI_Line9 ((uint32_t)0x00200) /*!< External interrupt line 9 */
#define EXTI_Line10 ((uint32_t)0x00400) /*!< External interrupt line 10 */
#define EXTI_Line11 ((uint32_t)0x00800) /*!< External interrupt line 11 */
#define EXTI_Line12 ((uint32_t)0x01000) /*!< External interrupt line 12 */
#define EXTI_Line13 ((uint32_t)0x02000) /*!< External interrupt line 13 */
#define EXTI_Line14 ((uint32_t)0x04000) /*!< External interrupt line 14 */
#define EXTI_Line15 ((uint32_t)0x08000) /*!< External interrupt line 15 */
#define EXTI_Line16 ((uint32_t)0x10000) /*!< External interrupt line 16
Connected to the PVD Output */
#define EXTI_Line17 ((uint32_t)0x20000) /*!< External interrupt line 17
Connected to the RTC Alarm event */
#define EXTI_Line18 ((uint32_t)0x40000) /*!< External interrupt line 18
Connected to the USB OTG FS Wakeup from suspend event */
#define EXTI_Line19 ((uint32_t)0x80000) /*!< External interrupt line 19
Connected to the Ethernet Wakeup event */
#define EXTI_Line20 ((uint32_t)0x00100000) /*!< External interrupt line 20
Connected to the USB OTG HS (configured in FS) Wakeup event */
#define EXTI_Line21 ((uint32_t)0x00200000) /*!< External interrupt line 21
Connected to the RTC Tamper and Time Stamp events */
#define EXTI_Line22 ((uint32_t)0x00400000) /*!< External interrupt line 22
Connected to the RTC Wakeup event */

EXTI模式:

typedef enum
{
EXTI_Mode_Interrupt = 0x00, //产生中断
EXTI_Mode_Event = 0x04 //产生事件
}EXTIMode_TypeDef;

触发类型:

typedef enum
{
EXTI_Trigger_Rising = 0x08, //上升沿
EXTI_Trigger_Falling = 0x0C, //下降沿
EXTI_Trigger_Rising_Falling = 0x10 //上升沿和下降沿都触发
}EXTITrigger_TypeDef;

EXTI控制:
使能 EXTI  ,一般都是使能, ENABLE
FunctionalState EXTI_LineCmd;  设置为ENABLE

中断优先级设置

STM32通过中断控制器NVIC(Nested Vectored Interrupt Controller)进行中断的管理 。
NVIC是属于Cortex内核的器件,不可屏蔽中断(NMI)和外部中断都由它来处理,但是SYSTICK
不是由NVIC控制的。

typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority; //抢断优先级
uint8_t NVIC_IRQChannelSubPriority; //响应优先级
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;

3.3配置GPIO口

SYS、RCC和之前一样的设置

PA0和PA1设置为外部中断

 PB8、PB9设置为输出端口

 

 

3.4使能中断

NVIC中使能中断打开

3.5配置工程

Project和Code Generator 和以前一样的设置

记得Toolchain/IDE也要改为MDK-ARM,图中是错误示范

 然后Generate Code然后打开

3.6中断函数编写

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	
	switch(GPIO_Pin){
		HAL_Delay(50);
		case GPIO_PIN_0:
			if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==GPIO_PIN_RESET){
				HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);
			}
			break;
		case GPIO_PIN_1:
			if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1)==GPIO_PIN_RESET){
				HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
			}
			break;
	}
}

在main.c——USER CODE BEGAIN中编写中断函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/615709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DAY09_JQueryBootStrap实现省略号效果

目录 1 JQuery简介2 引入JQuery方式3 JS与JQ之间的转换4 选择器4.1 基本选择器4.2 层级选择器4.2.1 层级选择器相关方法 4.3 过滤选择器4.4 内容选择器4.5 可见选择器4.6 隐藏显示的相关方法4.7 属性选择器4.8 子元素选择器4.9 表单选择器 5 JQ中新增的遍历方式6 JQ中相关方法7…

vue解决浏览器中跳转新页面缓存上一页表单等内容方法

在工作中&#xff0c;有可能会遇到需要缓存页面或组件的功能。 情况1&#xff1a;比如在h5中有个一个50个表单&#xff0c;在填到第40个表单时&#xff0c;需要你去另一个新页面去选择列表项&#xff0c;然后把数据带回来。需要我们不仅把数据带回来还要保留前面已经填好的40个…

GIS地图:解读未知的地理空间之谜

在这个信息爆炸的时代&#xff0c;如何有效地理解和利用地理空间数据成为各行各业追求的目标。而GIS地图作为一种强大的工具&#xff0c;能够帮助我们连接世界的空间智慧。 GIS地图的魅力在于它能够将庞大的地理数据转化为直观、可视化的地图表达。通过GIS地图&#xff0c;我们…

管理平台|智慧工地将成为施工界的“扛把子”!

大家都知道&#xff0c;建筑业是一个安全事故频发的高危行业&#xff0c;特别在施工环节&#xff0c;由于施工现场人员复杂、环境混乱、地点分散、多工序交叉等现象&#xff0c;如何进行现场施工管理就显得格外重要。 但是&#xff0c;依赖于现场管理的施工模式总是存在着很多…

数据结构-图结构

图是最为复杂的数据结构。如果数据元素之间存在一对多或者多对多的关系&#xff0c;那么这种数据的组织结构就叫作图结构。 图的基本概念 图的定义 图Graph是由顶点&#xff08;图中的节点被称为图的顶点&#xff09;的非空有限集合V与边的集合E&#xff08;顶点之间的关系&a…

什么AC+AP组网?什么是mesh组网?

一、什么是ACAP组网&#xff1f; ACAP组网是一种基于集中式管理的无线局域网&#xff08;WLAN&#xff09;组网架构&#xff0c;主要由AC&#xff08;Access Controller&#xff09;和多个AP&#xff08;Access Point&#xff09;组成。AC作为网络管理中心&#xff0c;负责控制…

别乱分层,PO、VO、DAO、BO、DTO、POJO 到底应该用在哪里,你知道吗

一、PO :&#xff08;persistant object&#xff09;&#xff0c;持久对象 二、VO :&#xff08;value object&#xff09;&#xff0c;值对象 三、DAO :&#xff08;Data Access Objects&#xff09;&#xff0c;数据访问对象接口 四、BO :&#xff08;Business Object&…

30天从入门到精通TensorFlow1.x 第六天,可视化工具 TensorBoard

文章目录 一、接前一天二、TensorBoard&#xff08;1&#xff09;. 什么是TensorBoard&#xff08;2&#xff09;. TensorBoard有什么用&#xff08;3&#xff09;. TensorBoard怎么安装 三、tf.summary模块&#xff08;1&#xff09;.如何使用tensorboard&#xff08;2&#x…

数据结构之二叉树(Binary Tree)详解

目录 1、什么是二叉树&#xff1f; 2、二叉树的遍历&#xff1a;深度优先和广度优先 &#xff08;1&#xff09;深度优先搜索(DFS)算法 &#xff08;2&#xff09;广度优先搜索(BFS)算法 3、二叉树的性质详解 4、二叉树的类型 &#xff08;1&#xff09;满二叉树 &…

IT服务台追踪的关键故障指标

指标是 IT 服务管理的核心&#xff0c;可提供运营见解并帮助确定持续改进的领域。通常的服务台指标有助于展示内部运营效率。为 例如&#xff0c;衡量在指定时间内解决的工单数量的 SLA 是展示服务台效率的关键因素。另一方面&#xff0c;故障指标可帮助团队识别 IT 基础架构中…

Linux基本指令学习(入门)

Linux基本指令学习 0.在xshell中登录自己的虚拟机1. ls指令2. pwd命令3. cd 指令4. touch指令5.mkdir指令6.rmdir指令 && rm 指令7.man指令&#xff1a;8.cp指令9.mv指令&#xff1a;10.cat11.more指令12.less指令13.head指令14.tail指令15.时间相关的指令16.Cal指令17…

【Linux】Tomcat 部署及优化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Tomcat 部署及优化 一、Tomcat 概述1.Tomcat 介绍2.Tomcat 核心组件3.Tomcat 组件结构4.Tomcat 处理请求过程 二、Tomcat 部署步骤1.关闭防火墙2.安装JDK3.设置JDK环境变量4.…

SQL基础培训16-日期处理

进度16-日期处理-SQL基础培训 知识点(学习作业就是按示例练习一遍): 1、系统当前日期 select getdate() as 当前系统日期 --建表时&

Antd时间轴Timeline遍历数据

Antd时间轴遍历数据 <Timelineitems{data.map((item) > {return { children: item };})}/>

Java实现手动操作定时任务功能的简单例子(动态创建定时任务)

还记得在前公司与同事共同开发一个在页面上统一管理定时提醒任务的功能&#xff0c;实际业务可能会复杂一些&#xff0c;它需要结合小程序或公众号平台对各个用户进行周期性&#xff08;按季度、按月、按日等&#xff09;的消息推送。由于我当时负责的是小程序和公众号平台方面…

node18 + express + mongoose 开发后台服务踩坑记录

模块化 1、node 默认采用 common.js 模块化规范; 2、在 node 中使用 es module 时&#xff0c;需将 package.json 中的 type 改为 module。或者将 .js 文件改为 .mjs。 发布全局 npm cli &#xff08;自定义 npm 脚手架&#xff09; 3、创建一个 npm 脚手架&#xff0c;需创…

Delaunay三角剖分学习笔记

文章目录 Delaunay三角剖分学习笔记1 Voronoi \text{Voronoi} Voronoi图1.1 定义与性质 2 三角剖分2.1 定义与性质2.2 质量(quality)评定标准 3 Delaunay三角剖分3.1 定义3.2 准则与性质 4 Delaunay三角剖分算法4.1 Bowyer-Watson算法4.1.1 算法步骤&#xff1a;4.1.2 算法伪代…

学会这样写代码,一看就是资深工程师,代码简洁之道PHP版本

文章目录 一、前言二、规范2.1 整体结构规范2.1.1 类的括号前括号单独一行2.1.2 方法的前括号单独一行2.1.3 方法内部语句前括号不换行 2.2 变量与常量2.2.1 变量的命名尽量要有语义2.2.2 同一个实体要用相同的变量名2.2.3 尽量使用有语义的常量表述2.2.4 使用自解释型变量2.2.…

六面钻调试第八步Cam参数调试(一)之压轮压板 ,机械规格调试

Cam参数调试 &#xff08;1&#xff09;.压轮压板参数调试 注&#xff1a;压板的规格测量设置 压板的位置相对基准钻的位置设置 &#xff08;2&#xff09;机械规格调试 1.定位气缸的类型 2.活动式定位气缸的Y向宽度 4.定位杆与夹钳Y边缘的最小间隙 5.活动式定位气缸相对基准…

CVPR视频理解论文

Learning Transferable Spatiotemporal Representations from Natural Script Knowledge 时空TransformerCLIP的对比学习思路