stm32CubeMX中断模式编程点灯并实现串口点灯(中断方式)

2023-05-16

文章目录

  • 一、中断介绍
    • 1.基础知识
    • 2.中断向量表
    • 3.中断过程
  • 二、CubeMX中断方式点灯
    • 1.题目要求
    • 2.CubeMX设置
      • 设置管脚
      • 设置时钟源
      • 配置时钟优先级
      • 生成工程
    • 3.代码编写
    • 4.连接测试
  • 三、中断方式实现串口通信
    • 1.题目要求
    • 2.工程建立
    • 3.代码编写
    • 4.烧录测试
  • 四、参考

一、中断介绍

1.基础知识

1.cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断。(本文只介绍60个外部可屏蔽中断)

2.stm32只有84个中断,包括16个内核中断和68个可屏蔽中断

3.stm32f103上只有60个可屏蔽中断,f107上才有68个中断

4.先占优先级也就是抢占优先级,概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占优先级如果没有后触发的中断 先占优先级更高,就会先处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断先占优先级较低的中断。这是实现中断嵌套的基础。

次占优先级,也就是响应优先级,只在同一先占优先级的中断同时触发时起作用,先占优先级相同,则优先执行次占优先级较高的中断。次占优先级不会造成中断嵌套。 如果中断的两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。
在这里插入图片描述

5.NVIC是什么?
嵌套向量中断控制器;用于为中断分组,从而分配抢占优先级和响应优先级;
分组的方式有两种:
(1).Cortex-m3内核提供了一种3位宽度的PRIGROUP数据区,用于指示一个8位数据序列中的小数点的位置,从而表示中断优先级的分组。见下表:
在这里插入图片描述
(2).而实际上STM32并没有用到这么多中断,所以在分组上只分了5个组,并且表示方法有所不同;见下表:
在这里插入图片描述
中断示意图如图所示

在这里插入图片描述

2.中断向量表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此表在stm32使用手册中有记录。

3.中断过程

在这里插入图片描述
在这里插入图片描述

二、CubeMX中断方式点灯

1.题目要求

用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。

根据题目要求高电平亮灯,所以设计PB9接开关,PA5接LED。

因为是高电平触发,所以设计上升沿触发,即按键按下读高电平,按键释放读低电平。

2.CubeMX设置

对于CubeMX的介绍和新建工程参考我之前的博客: stm32CubeMX的安装和点亮流水灯

设置管脚

请添加图片描述
将PA5设置为GPIO_Output,将PB9设置成GPIO_EXIT

因为我们在右图配置了管脚,所以在左侧System Core对应的各项管脚已经设置好,例如PB9和PA5对应的如图:
请添加图片描述
请添加图片描述
同样不要忘记在SYS内设置成Serial Wire
请添加图片描述
在RCC设置成Crystal/Ceramic Resonator
在这里插入图片描述

设置时钟源

根据个人的需要设置时钟源,这里我设置成72MHz
请添加图片描述

配置时钟优先级

根据个人需要进行配置,本实验根据题目要求不需要设置,如图所示:
在这里插入图片描述

生成工程

根据我们上次实验的说明,这里同样进行这样设置,然后生成工程:
请添加图片描述

3.代码编写

打开Keil工程,在Drivers/STM32F1xx_HAL_Driver下找到gpio.c文件,打开找到中断服务函数,

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

在这里插入图片描述
在第561行看到此函数是个weak函数需要我们在别处重新书写。
所以我们在main函数内写入,
打开main.c文件,在main内找个地方编写如下代码:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if( GPIO_Pin == switch_interrupt_Pin)//判断外部中断源
	{
		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);//翻转PA5状态
	}
}

编译检查发现有错,原来是因为我们这里使用了switch_interrupt_Pin
没有定义,所以我们先进入main.h文件添加如下代码:

/* USER CODE BEGIN Private defines */
#define switch_interrupt_Pin GPIO_PIN_9
#define switch_interrupt_GPIO_Port GPIOB
#define switch_interrupt_EXTI_IRQn EXTI9_5_IRQn

/* USER CODE END Private defines */

这回我们再次编译查看:
在这里插入图片描述
发现没有错误,所以我们就可以进行烧录了。
在这里插入图片描述
烧录成功下面我们连接电路测试。

4.连接测试

具体的电路连接根据我上面提到的题目分析自行连接。
测试结果如下:
请添加图片描述

三、中断方式实现串口通信

1.题目要求

完成一个STM32的USART串口通讯程序,要求:
1)设置波特率为115200,1位停止位,无校验位;
2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。

2.工程建立

根据题目要求和上次实验的经验,我们这次同样在CubeMX中进行设置

  • 串口设置
    Connectivity——USART1——Mode中选择Asynchronous,意为异步通信,此时下面默认的波特率就为115200bit,传输数据长度为8bit,各项参数可以自行查看。

在这里插入图片描述

在点击NVIC Settings中勾选使能,此时就可以在右侧预览中看到已经分配了PA9和PA10管脚为输入输出。
在这里插入图片描述
但此时看到我们设置的另外两个管脚为黄色表示不可用,这是因为我们的时钟源没有设置。

  • 时钟源设置:
    在RCC中选择高速时钟源Crystal/Ceramic Resonator并在Clock Configuration中选择72Mhz
    在这里插入图片描述
    可以看到此时的预览引脚变成了绿色表示配置正确:
    请添加图片描述

3.代码编写

首先我们要在main.c和usart.c中添加头文件#include "stdio.h"进行调用。
关于stdio.h文件的内容可以在文件夹内查看。

  • 然后我们要在usart.c中定义相关函数方便在main中的使用,下面是usart.c的编写
    usart.c
/* USER CODE BEGIN 1 */

//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
//#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)	
#if 1
//#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{ 	
	 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0x0001);  
	return ch;
}
#endif 

/* USER CODE END 1 */


可以看到这里我们只要是重新定义了fputc函数。

  • 在书写完usart.c文件后我们就要对main函数进行操作,添加中断指令

我们首先在循环中添加一段数据主体,即我们的实验内容,不断发送Hello Windows,

    /* USER CODE END WHILE */
	  	printf("Hello windows!\r\n");
		HAL_Delay(500);
    /* USER CODE BEGIN 3 */

可以看到主函数体循环的内容是printf输出hello windows换行,并延时500ms。

接着我们需要在main.c中添加如下定义,用来接收串口数据

uint8_t aRxBuffer;			//接收中断缓冲
uint8_t Uart1_RxBuff[256];		//接收缓冲
uint8_t Uart1_Rx_Cnt = 0;		//接收缓冲计数
uint8_t	cAlmStr[] = "数据溢出(大于256)\r\n";

添加接收中断的语句,在main.c用户代码段2书写

HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);

然后在main.c下部添加中断回调函数。

/**
  * @brief  Rx Transfer completed callbacks.
  * @param  huart pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
 
	if(Uart1_Rx_Cnt >= 255)  //溢出判断
	{
		Uart1_Rx_Cnt = 0;
		memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
		HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);	
	}
	else
	{
		Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
	
		if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
		{
			HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
			Uart1_Rx_Cnt = 0;
			memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组
		}
	}
	
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
}

  • 编译执行检查有没有错误;
    在这里插入图片描述
    检查发现没有错误

4.烧录测试

在这里插入图片描述
烧录显示一切正常,下面进行串口测试。
打开串口助手
在这里插入图片描述

验证确实能正确接收,在键盘输入一串字符会开启中断,过后重新开始发送hello windows

四、参考

中断系统

STM32的NVIC和中断的总结

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32CubeMX中断模式编程点灯并实现串口点灯(中断方式) 的相关文章

  • STM32CubeMX在freeRTOS中使用printf函数

    在usart h中添加 inlcude 34 stdio h 34 Includes include 34 main h 34 USER CODE BEGIN Includes include 34 stdio h 34 USER CODE
  • STM32CubeMX生成STM32L073RZT6 BootLoader程序

    1 环境 xff1a Windows10 xff0c STM32CubeMX6 0 0 xff0c Keil5 25 单片机为STM32LRZT6 196KBytes Flash xff0c 20KBytes RAM 2 功能要求 设计Bo
  • STM32CubeMX 新建工程详细步骤

    STM32CubeMX 新建工程详细步骤 1 MPU CPU选择step1 打开CubeMX 软件 xff0c 在主页面上 点击如下按钮 xff0c 进入芯片选择界面step2 在Part Number Search 栏搜索我们需要用到的芯
  • STM32CubeMX使用方法及功能介绍

    摘自 xff1a https blog csdn net ybhuangfugui article details 52264403 utm medium 61 distribute pc relevant none task blog B
  • STM32CubeMx+freeRTOS的使用

    目录 第一步 xff0c 利用CubeMx创建工程并修改一些必要设置 第二步 xff0c 测试LED灯和HAL库延时 第三步 xff0c 选择和配置freeRTOS选项 3 1 选择RTOSV1版本 3 2 配置内核参数 3 3 设置Tas
  • STM32F767+STM32CubeMX I2C通信读写EEPROM数据(采用轮询、DMA、中断三种方式)

    STM32F767 43 STM32CubeMX I2C通信读写EEPROM数据 xff08 采用轮询 DMA 中断三种方式 xff09 摘要 前言 作为一名STM32的初学者 xff0c 在学习过程中会遇到很多问题 xff0c 解决过程中
  • 蓝桥杯嵌入式组环境配置(keil mdk+sdk+STM32cubemx)

    1 keil mdk下载 官网也可以下载 地址 MDK ARM Version 5 38a Evaluation Software Request keil com 没梯子速度太慢了 我已经把安装包放在了云盘里链接 xff1a 链接 xff
  • STM32CubeMX 下载和安装 详细教程

    HAL库 STM32CubeMX开发 STM32F407 目录 STM32CubeMX安装包 Win 6 6 1 下载链接 STM32CubeMX 下载 步骤1 xff1a 点击官网链接下载 官网下载地址 xff1a https www s
  • stm32cubeMX+FreeRTOS(4)—— main函数while循环

    0 发现 想在主函数中打印一下串口数据 xff0c 发现一直打印不出来 xff0c 试了下开关小灯 xff0c 发现没有进main函数的while循环 xff0c 阿西吧 xff0c 我大概要重新看一下CubeMX的rtos架构了 本来打算
  • STM32CubeMX驱动4x4键盘模块

    文章目录 1 4x4键盘模块简介2 4x4键盘模块原理2 1 独立按键的原理2 2 矩阵键盘的原理 3 移植源码到工程4 实验 1 4x4键盘模块简介 4x4键盘模块是一种常用的电子组件 xff0c 它由16个按钮或开关以矩阵方式排列而成
  • STM32CubeMX安装

    一 STM32CubeMX下载 官网地址 xff1a STM32CubeMX STM32Cube初始化代码生成器 意法半导体STMicroelectronics 官网下载需要注册账号 网盘链接 xff08 6 8 xff09 xff1a 链
  • STM32CubeMX的下载以及安装

    第一步 xff1a 安装应用软件 下载STM32CubeMX软件并安装 xff1b 第二步 xff1a 安装MCU固件包 在线安装用户所选的STM32微控制器对应的MCU固件包 具体操作步骤如下 xff1a 软件的下载地址 xff1a ht
  • 基于STM32CubeMX移植freeModbusRTU(从站)

    困惑了将近一年多的ModbusRTU在我昨天穷极无聊给自己定目标的情况下搞出来了 xff0c 以前移植不出来主要原因就是基本功不扎实 xff0c 没有进一步理解串口和定时器配置的原理 xff0c 一通操作 xff0c 移植完之后就Timeo
  • 【STM32CubeMX】STM32H7-RTOS-SPI-W5500

    工程源码下载 xff1a 基于裸机和Freertos的W5500网络通信工程 目录 1 移植W5500步骤 2 Cobemx配置步骤 2 1 时钟配置Clock Configuration 2 2 Trace and Debug配置 2 3
  • 查询方式/中断方式/DMA方式的区别及适用范围

    区别 xff1a 查询方式 xff1a CPU与设备串行工作 数据传送与主程序串行工作 xff1b 中断方式 xff1a CPU与设备并行工作 数据传送与主程序串行工作 xff1b DMA方式 xff1a CPU与设备并行工作 数据传送与主
  • STM32CubeIDE使用笔记(02):STM32CubeMX配置与代码生成

    文章目录 目的 用户界面 引脚输出和配置 时钟配置 项目管理 工具 代码生成 更换芯片 总结 目的 STM32CubeIDE中整合了STM32CubeMX用来配置芯片资源生成初始化代码 本篇将介绍STM32CubeMX使用方法 用户界面 界
  • STM32CubeMX学习一 之GPIO配置

    文章目录 前言 一 本地环境 二 开始 1 工程创建 2 GPIO配置 2 时钟配置 3 代码生成 3 编译工程 前言 记录一下STM32CubeMX的学习笔记 同时分享给初学的小白 希望一起进步 一 本地环境 编译环境 KEIL 代码生成
  • RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (二、无线温湿度传感器 之 CubeMX配置)

    应用篇 在STM32L051上使用RT Thread 第二篇 使用STM32CubeMX 进行对应外设配置 同时做一些简单测试 目录 前言 一 使用 STM32CubeMX 配置 1 1 基础步骤 1 2 修改配置 1 3 踩坑记录 二 初
  • STM32CUBEMX F103 HAL库开发 两路定时器的Encoder编码器模式

    机器人开发过程中 对于直流电机来说 编码器至关重要 它不仅可以使我们对电极进行精确的速度闭环 位置闭环 还可以通过时间积分 根据运动学关系 获得速度 位置等信息 STM32的定时器有编码器模式 大大的方便我们的开发 使用STM32cubeM
  • STM32CubeMX学习六 之ADC配置

    文章目录 前言 一 本地环境 二 开始 1 定时器配置 2 引脚配置 在这里插入图片描述 https img blog csdnimg cn e5b6f155a1b8468cb15046a0a9d031cd png 3 内部时钟配置 4 A

随机推荐