STM32之中断控制LED灯、中断串口通信及DMA串口

目录

一、中断

1. 中断地址

2. 中断优先级

3. 中断响应过程

二、中断控制LED灯

1、新建工程

2、编写代码

3、进行烧录 

4、电路连接及运行

 三、中断串口通信

 1、新建工程

 2、编写代码

 3、进行烧录

 4、电路连接并打开串口运行

四、DMA串口

 1、新建工程

 2、编写代码 

 3、进行烧录

 4、电路连接并打开串口运行

 五、总结

 六、参考资料


一、中断

在处理器中,中断是一个过程,即CPU在正常执行程序的过程中,遇到外部/内部的紧急事件需要处理,暂时中止当前程序的执行,转而去为处理紧急的事件,待处理完毕后再返回被打断的程序处继续往下执行。

1. 中断地址

程序的执行无非就是寻找地址,中断也是程序的一部分,而它的地址却是由内核来确定的,而且是不允许修改的。NVIC控制器可以帮我们找到中断的地址

2. 中断优先级

优先级在中断里是一个非常重要的概念,如果同时产生多个中断,CPU会根据他们的优先级来选择这些中断的处理顺序。在CM4内核中,优先级用整数来表示,这个数越小代表级别越高。

在这里插入图片描述

已经有中断在工作。根据抢占优先级决定,新来的中断打不打断原有中断,打断就发生中断嵌套,不打断就挂起等着。
中断都在挂起等待的状态,先按抢占优先级排序,抢占优先级高的先行,抢占优先级相同,就按子优先级排序,子优先级高的先行,子优先级还相同,那就按IRQ编号小的先行
抢占优先级>子优先级>IRQ编号

3. 中断响应过程

  1. 中断源发出中断请求;
  2. 判断处理器是否允许中断,以及该中断源是否被屏蔽;
  3. 中断优先级排队;
  4. 处理器暂停当前程序,保护断点地址和处理器的当前状态,根据中断类型号,查找中断向量表,转到对应的中断服务程序;
  5. 执行中断服务程序;
  6. 恢复被保护的状态,执行中断返回指令,回到被中断的程序。

二、中断控制LED灯

1、新建工程

在STM32CubeMX中新建一个芯片为STM32F103C8T6的工程。

设置SYS

设置RCC

设置引脚:将A2引脚设置为GPIO_Output;B0引脚设置为GPIO_EXTI0

 设置B0如下:

设置NVIC: 

设置时钟树,输入72后回车: 

填写名称、选择路径等设置

 然后点击Open Project 

2、编写代码

 打开main.c文件,在main.c中编写回调函数

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	GPIO_PinState b0_pin = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);  // 读取b0的状态
	switch (GPIO_Pin)
    {
		case GPIO_PIN_0:
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, b0_pin);  // 将a2写入与b0相同的电位
			break;
	}
	
}

点击魔法棒,点击Output,选择Create HEX File

 然后进行编译

3、进行烧录 

 打开FlyMcu,选择刚编译的hex文件,点击读器件信息进行运行,然后点击开始编程进行烧录 

 从图中可以看到烧录成功,接着连接电路并运行

4、电路连接及运行

电路连接:

GND — GND
3v3 — 3v3
TXD — A10
RXD — A9

A2—灯的负引脚

3.3—灯的正引脚

B0相对于中断的开关,接高电位为开,接低电位为关

运行:

 

 三、中断串口通信

 1、新建工程

设置SYS 

设置RCC

设置USART1

设置NVIC

 设置时钟树,输入72后回车: 

 填写名称、选择路径等设置

然后点击Open Project 

2、编写代码

打开main.c文件,分别在main.c里面加入以下代码

char c;//指令 0:停止  1:开始
char message[]="hello Windows\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//标志 0:停止发送 1.开始发送

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	
	//当输入的指令为0时,发送提示并改变flag
	if(c=='0')
    {
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); 
	}
	
	//当输入的指令为1时,发送提示并改变flag
	else if(c=='1')
    {
		flag=1;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); 
	}
	
	//当输入不存在指令时,发送提示并改变flag
	else 
    {
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); 
	}

	//重新设置中断
		HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);  
}

 进行编译:

 3、进行烧录

打开FlyMcu,选择刚编译的hex文件,点击读器件信息进行运行,然后点击开始编程进行烧录 

 从图中可以看到烧录成功,接着连接电路并运行

4、电路连接并打开串口运行

电路连接:

GND — GND
3v3 — 3v3
TXD — A10
RXD — A9

打开串口运行:

四、DMA串口

 1、新建工程

设置SYS 

 设置RCC

设置USART1

 设置DMA

 设置时钟树,输入72后回车: 

填写名称、选择路径等设置

 然后点击Open Project 

2、编写代码 

打开main.c文件,在main.c里面加入以下代码:

 /* USER CODE BEGIN Init */
	uint8_t Senbuff[] = "Hello world!";  //定义数据发送数组
  /* USER CODE END Init */
  while (1)
  {
    /* USER CODE END WHILE */
			HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
	        HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

然后进行编译

 3、进行烧录

打开FlyMcu,选择刚编译的hex文件,点击读器件信息进行运行,然后点击开始编程进行烧录 

 从图中可以看到烧录成功,接着连接电路并运行

4、电路连接并打开串口运行

电路连接:

GND — GND
3v3 — 3v3
TXD — A10
RXD — A9

打开串口运行:

 

 五、总结

       实现中断控制LED灯时,应尽量减少线路连接,以免线路接触不良导致中断时接高电位或低电位灯都亮(悬空);其他的只要按照步骤慢慢来也是很简单的。

 六、参考资料

stm32外部中断模式控制灯亮灭_醉意丶千层梦的博客-CSDN博客_stm32外部中断控制led灯亮灭

HAL库中断方式进行串口通信_醉意丶千层梦的博客-CSDN博客_hal库串口接收中断

stm32hal库串口DMA收发 - Breezy-ye - 博客园

【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)_Z小旋的博客-CSDN博客_stm32cubemx dma

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,你需要连接一个LEDSTM32的一个引脚上,然后使用STM32串口模块来控制该引脚的电平状态。 下面是一个简单的示例代码: ```c #include "stm32f10x.h" #include "stdio.h" // 定义LED引脚 #define LED_PIN GPIO_Pin_13 #define LED_PORT GPIOC // 定义串口 #define USART USART1 #define USART_TX_PIN GPIO_Pin_9 #define USART_RX_PIN GPIO_Pin_10 void init_led(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 配置LED引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = LED_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_PORT, &GPIO_InitStructure); } void init_usart(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 使能USART1和GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置USART1的TX引脚为复用推挽输出 GPIO_InitStructure.GPIO_Pin = USART_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1的RX引脚为浮空输入 GPIO_InitStructure.GPIO_Pin = USART_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1的参数 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART, &USART_InitStructure); // 使能USART1 USART_Cmd(USART, ENABLE); } int main(void) { char ch; // 初始化LED和USART init_led(); init_usart(); while (1) { // 从串口读取一个字符 if (USART_GetFlagStatus(USART, USART_FLAG_RXNE) == SET) { ch = USART_ReceiveData(USART); // 如果收到字符 '1',则点亮LED if (ch == '1') { GPIO_SetBits(LED_PORT, LED_PIN); } // 如果收到字符 '0',则熄灭LED if (ch == '0') { GPIO_ResetBits(LED_PORT, LED_PIN); } } } } ``` 在该示例代码中,我们使用串口USART1来读取输入字符,并根据收到的字符控制LED的亮灭。当接收到字符 '1' 时,点亮LED;当接收到字符 '0' 时,熄灭LED。 需要注意的是,在使用串口时,需要先初始化串口的GPIO引脚,然后配置串口的参数,最后使能串口。除此之外,还需要使用USART_GetFlagStatus()函数判断是否有数据可读,然后使用USART_ReceiveData()函数读取数据。 ### 回答2: 要使用STM32串口控制LED的亮灭,可以按照以下步骤进行编程实现: 首先,在Keil等集成开发环境中创建一个新工程,并选择对应的STM32单片机型号。 然后,需要在代码中包含相应的头文件,包括对串口和GPIO的定义和配置。 接着,配置串口的波特率、数据位、停止位和校验位等参数,并初始化串口。 接下来,在代码中配置LED所连接的GPIO口,并设置该引脚为输出模式。 在主函数中,可以使用一个循环来不断接收串口数据并进行判断。当串口接收到特定的指令时,根据指令的内容控制LED的亮灭。 在接收到控制指令后,可以使用if语句或switch语句来判断指令的具体内容。例如,当接收到字符"A"时,可以将LED引脚置高从而使LED亮起;当接收到字符"B"时,可以将LED引脚置低从而使LED熄灭。 最后,记得在循环中加入延时函数,以便观察LED的亮灭效果。 需要注意的是,为了能够正确接收和发送串口数据,可能还需要配置中断DMA等相关功能。 以上是使用STM32串口控制LED亮灭的基本步骤,具体的代码实现可以根据自己的需求灵活调整。 ### 回答3: STM32是一种广泛应用于嵌入式系统的微控制器,它可以通过串口控制LED的亮灭。串口是一种通信接口,可用于将数据发送或接收到外部设备。以下是如何使用STM32控制器和串口实现LED控制: 首先,需要配置STM32串口。选择合适的串口引脚作为发送和接收端口,并配置串口的波特率、校验位和停止位。 然后,编写STM32控制器的程序。在主程序中,通过串口接收数据。当接收到特定的命令时,根据命令设置相应的IO口来控制LED的亮灭。 例如,当接收到字节“1”时,可以将LED所连接的IO口设置为高电平,从而使LED点亮。当接收到字节“0”时,将IO口设置为低电平,从而使LED熄灭。 程序定期检查串口是否有新的数据到达,并根据接收到的数据执行相应的操作。这样,当用户通过串口发送特定的命令时,可以实现对LED控制。 需要注意的是,通过串口控制LED亮灭的前提是正确连接STM32LED,并正确配置引脚。此外,还需要确保串口接收的数据正确且互不冲突,以避免误操作。 通过以上步骤,我们可以利用STM32控制器和串口实现对LED控制。这种方法不仅简洁高效,而且灵活性强,可以根据需要对LED的亮灭进行灵活的控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值