stm32中断及串口通信进阶

本文深入探讨了STM32的EXTI外部中断控制灯的亮灭,详细介绍了从GPIO到NVIC的中断流程,以及通过标准库在Keil中配置EXTI中断的步骤。此外,还讲解了如何利用串口中断实现STM32与电脑通信,包括配置串口、NVIC和编写中断函数。最后,文章讨论了如何使用DMA技术,让STM32通过串口连续向电脑发送数据,涉及DMA初始化和传输函数的编写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stm32中断及串口通信进阶

前言

软件版本:

keil5: 5.24.2.0

硬件:

STM32F103C8T6

ST-Link V2

USB TO TTL

一、EXTI外部中断控制灯的亮灭

1、EXTI基本结构(也即中断流程
1)GPIO到AFIO

通过GPIO外设触发中断,进入AFIO中断引脚选择(注:不可以通过同一个GPIO_Pin引脚触发中断,如GPIOA-1与GPIOB-1只能选择同一个进入中断,虽然每个GPIO端都有16个接口到AFIO中断选择,但是一次只能选择一个进入,16的意思只是有16种可能性);

2)AFIO,以及四个其他通道到EXTI

一个引脚触发中断后会进入EXTI边沿检测及控制端,除引脚触发中断外还有4个通道进入EXTI,分别是PVD输出(将低功耗模式下的stm32唤醒),RTC闹钟(有时为了省电,定一个闹钟,stm32会进入停止模式,闹钟响时会借助外部中断,即PVD,唤醒stm32),USB唤醒(与RTC类似),ETH以太网唤醒(与RTC类似);

3)EXTI到NVIC,及其他外设

触发中断后,响应方式有中断响应(即申请中断,会进入NVIC排队)和事件响应(不会进入NVIC,会通向其他外设,触发其他外设操作);触发一般引脚中断后,进入NVIC,会根据响应优先级,将优先级高的先执行,一般抢占优先级优先于响应优先级,相同优先级根据取值排队,取值小的先响应。

在这里插入图片描述

2、使用标准库通过keil配置各端口
1)首先配置RCC时钟

注意GPIO与AFIO都是在APB2总线下

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

在这里插入图片描述

2)配置GPIO

GPIOB-14

    GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);

在这里插入图片描述

GPIOA-7

    GPIO_InitTypeDef GPIO_InitStructure2;
	GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure2);

在这里插入图片描述

3)配置AFIO
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);

在这里插入图片描述

4)配置EXTI
    EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTI_Init(&EXTI_InitStructure);

在这里插入图片描述

5)配置NVIC
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值