当前位置:首页 > 单片机 > 单片机
[导读]stm32共有19个外部中断:线0~15:对应外部I/O口的输入中断线16:连接到PVD输出。PVD(Programmable Votage Detector),即可编程电压监测器。作用是监视供电电压,在供电电压下降到给定的阀值以下时,产生一个中断,通

stm32共有19个外部中断:

线0~15:对应外部I/O口的输入中断

线16:连接到PVD输出。PVD(Programmable Votage Detector),即可编程电压监测器。作用是监视供电电压,在供电电压下降到给定的阀值以下时,产生一个中断,通知软件做紧急处理。当供电电压又恢复到给定的阀值以上时,也会产生一个中断,通知软件供电恢复。

线17:连接到RTC实时时钟产生闹钟事件。

线18:连接到USB唤醒事件

在stm32 NVIC中断和stm32 USART串口通信中已经介绍过stm32的中断和串口输出使用方法,本文运用外部中断嵌套,通过串口发送相应信息,验证外部中断嵌套。

按下PA0(按键按下时为低电平)时,打印出如下信息:

EXTI0 IRQHandler enter.

EXTI1 IRQHandler enter.

EXTI2 IRQHandler enter.

EXTI2 IRQHandler return.

EXTI1 IRQHandler return.

EXTI0 IRQHandler return.

直接操作寄存器

对于外部中断EXTI的控制寄存器,MDK定义了如下的结构体:

typedef struct

{

vu32 IMR;

vu32 EMR;

vu32 RTSR;

vu32 FTSR;

vu32 SWIER;

vu32 PR;

} EXTI_TypeDef;

IMR:中断屏蔽寄存器

这个32位的寄存器只有前19位有效。当位x设置为1时,则开启这个线上的中断。

EMR:事件屏蔽寄存器

只有前19位有效。当位x设置为1时,则开启这个线上的事件触发。

RTSR/FTSR:上升沿/下降沿触发选择寄存器

只有低19位有效,当位x设置为1时,则允许这个线上上升/下降沿触发中断/事件。下降上升沿可以同时设置,则为任意电平触发。

SWIER:软件中断事件寄存器

设置IMR开启某个外部中断后,可以通过向该寄存器对应此外部中断的位x写1,产生一个软件中断,效果通外部中断触发 。

PR:挂起寄存器

当在外部中断线上发生了选择的边沿事件,该位被置’1’。在该位中写入’1’可以清除它,也可以通过改变边沿检测的极性清除。外部中断发生时,相应位置被置1,可以用于查询中断。


stm32的I/O复用外部中断只有16个,但是引脚却有112(16*7)个之多。为了让每一个I/O口都可以设置为外部中断入口,stm32使用了4个EXTICR寄存器来实现分配。

EXTICR1~4寄存器描述类似,EXTICR1如下:

EXTIx[3:0]:EXTIx配置(x = 0 … 3) (EXTI x configuration) 这些位可由软件读写,用于选择EXTIx外部中断的输入源。

0000对应PA引脚 0001 对应 PB引脚 0010对应PC引脚 0011对应PD引脚

0100对应PE引脚0101对应PF引脚 0110对应PG引脚

需要注意的是:实际上 AFIO_EXTICR1 寄存器 对应的操作寄存器是 AFIO->EXTICR[0]

直接操作寄存器代码:

User/main.c

#include#include"system.h"#include"usart.h"#include"exti.h"voidGpio_Init(void);intmain(void){Rcc_Init(9);//系统时钟设置Usart1_Init(72,9600);//设置系统时钟和波特率Gpio_Init();Exti_Init(GPIO_A,0,FTIR);//设置PA0~3为下降沿触发,参数GPIO_x和FTIR在system.h中有定义Exti_Init(GPIO_A,1,FTIR);Exti_Init(GPIO_A,2,FTIR);Nvic_Init(2,1,EXTI0_IRQChannel,2);//设置抢占优先级为2,响应优先级为1,中断分组为2Nvic_Init(1,1,EXTI1_IRQChannel,2);//设置抢占优先级为1,响应优先级为1,中断分组为2Nvic_Init(0,1,EXTI2_IRQChannel,2);//设置抢占优先级为0,响应优先级为1,中断分组为2while(1);}voidGpio_Init(void){RCC->APB2ENR|=1<<2;//使能PORTA时钟GPIOA->CRL&=0x0000FFFF;//PA0~3设置为浮空输入,PA4~7设置为推挽输出GPIOA->CRL|=0x33334444;//USART1串口I/O设置GPIOA->CRH&=0xFFFFF00F;//设置USART1的Tx(PA.9)为第二功能推挽,50MHz;Rx(PA.10)为浮空输入GPIOA->CRH|=0x000008B0;}

User/stm23f10x_it.c

#include"stm32f10x_it.h"#include"stdio.h"voidEXTI0_IRQHandler(void){printf("rnEXTI0IRQHandlerenter.rn");EXTI->SWIER=1<<1;//产生一个EXTI1上的软件中断,让此中断挂起printf("rnEXTI0IRQHandlerreturn.rn");EXTI->PR=1<<0;//清除中断标志位}voidEXTI1_IRQHandler(void){printf("rnEXTI1IRQHandlerenter.rn");EXTI->SWIER=1<<2;//产生一个EXTI2上的软件中断,让此中断挂起printf("rnEXTI1IRQHandlerreturn.rn");EXTI->PR=1<<1;}voidEXTI2_IRQHandler(void){printf("rnEXTI2IRQHandlerenter.rn");printf("rnEXTI2IRQHandlerreturn.rn");EXTI->PR=1<<2;}

Library/src/exti.c

#include#include"exti.h"//外部中断配置函数//只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个//参数:GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发//该函数一次只能配置1个IO口,多个IO口,需多次调用//该函数会自动开启对应中断,以及屏蔽线voidExti_Init(u8GPIOx,u8BITx,u8TRIM){u8EXTADDR;u8EXTOFFSET;EXTADDR=BITx/4;//得到中断寄存器组的编号EXTOFFSET=(BITx%4)*4;RCC->APB2ENR|=0x01;//使能io复用时钟AFIO->EXTICR[EXTADDR]&=~(0x000F<EXTICR[EXTADDR]|=GPIOx<IMR|=1<EMR|=1<FTSR|=1<RTSR|=1<

Library/inc/exti.h

#includevoidExti_Init(u8GPIOx,u8BITx,u8TRIM);

PS: 将Library下的exti.c加入MDK的工程

库函数操作

库函数操作代码:

main.c

#include"stm32f10x.h"#include"stdio.h"#definePRINTF_ON1voidRCC_Configuration(void);voidGPIO_Configuration(void);voidUSART_Configuration(void);voidNVIC_Configuration(void);voidEXTI_Configuration(void);intmain(void){RCC_Configuration();GPIO_Configuration();USART_Configuration();NVIC_Configuration();EXTI_Configuration();while(1);}voidNVIC_Configuration(void){NVIC_InitTypeDefNVIC_InitStructure;#ifdefVECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);#elseNVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);#endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//优先级数字越大,优先级越小NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}voidGPIO_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);}voidEXTI_Configuration(void){EXTI_InitTypeDefEXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line1|EXTI_Line2;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);}voidRCC_Configuration(void){/*定义枚举类型变量HSEStartUpStatus*/ErrorStatusHSEStartUpStatus;/*复位系统时钟设置*/RCC_DeInit();/*开启HSE*/RCC_HSEConfig(RCC_HSE_ON);/*等待HSE起振并稳定*/HSEStartUpStatus=RCC_WaitForHSEStartUp();/*判断HSE起是否振成功,是则进入if()内部*/if(HSEStartUpStatus==SUCCESS){/*选择HCLK(AHB)时钟源为SYSCLK1分频*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*选择PCLK2时钟源为HCLK(AHB)1分频*/RCC_PCLK2Config(RCC_HCLK_Div1);/*选择PCLK1时钟源为HCLK(AHB)2分频*/RCC_PCLK1Config(RCC_HCLK_Div2);/*设置FLASH延时周期数为2*/FLASH_SetLatency(FLASH_Latency_2);/*使能FLASH预取缓存*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*选择锁相环(PLL)时钟源为HSE1分频,倍频数为9,则PLL输出频率为8MHz*9=72MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/*使能PLL*/RCC_PLLCmd(ENABLE);/*等待PLL输出稳定*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);/*选择SYSCLK时钟源为PLL*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*等待PLL成为SYSCLK时钟源*/while(RCC_GetSYSCLKSource()!=0x08);}/*打开APB2总线上的GPIOA时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);}voidUSART_Configuration(void){USART_InitTypeDefUSART_InitStructure;USART_ClockInitTypeDefUSART_ClockInitStructure;USART_ClockInitStructure.USART_Clock=USART_Clock_Disable;USART_ClockInitStructure.USART_CPOL=USART_CPOL_Low;USART_ClockInitStructure.USART_CPHA=USART_CPHA_2Edge;USART_ClockInitStructure.USART_LastBit=USART_LastBit_Disable;USART_ClockInit(USART1,&USART_ClockInitStructure);USART_InitStructure.USART_BaudRate=9600;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(USART1,&USART_InitStructure);USART_Cmd(USART1,ENABLE);}voidTIM_Configuration(void){}#ifPRINTF_ONintfputc(intch,FILE*f){USART_SendData(USART1,(u8)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);returnch;}#endif

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

ST于近期发布了“STM32WBA”无线MCU、“STM32U0”超低功耗入门级MCU、“STM32H7R/S”高性能MCU和“STM32MP2”四大重磅新品,还透露将会在今年推出18nm的STM32新品。

关键字: STM32 MCU NPU AI 超低功耗

在微控制器领域,MSP430与STM32无疑是两颗璀璨的明星。它们各自凭借其独特的技术特点和广泛的应用领域,在市场上占据了重要的位置。本文将深入解析MSP430与STM32之间的区别,探讨它们在不同应用场景下的优势和局限...

关键字: MSP430 STM32 单片机

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

STM32与51单片机之间有什么差异呢?两者可以说是一场科技与性能的较量了。在科技飞速发展的今天,微控制器(MCU)已广泛应用于各类电子设备和系统中,发挥着举足轻重的作用。其中,STM32和51单片机作为两种常见的微控制...

关键字: STM32 51单片机 MCU

电磁铁是一种利用电流产生磁场的装置,具有快速响应、易于控制等特点,在工业自动化、电子设备、科学实验等领域有着广泛的应用。STM32是一款功能强大的微控制器,具有高性能、低功耗、易于编程等优点,是控制电磁铁的理想选择。本文...

关键字: 电磁铁 微控制器 STM32

边缘人工智能的实现涉及到三个基本 要素:安全性,连接性、自主性,而其中自主性是AI能力的体现,也是边缘AI有别于其他传统的物联网的关键。而通过ST Edge AI套件,就可以帮助各种不同类型的开发者实现覆盖全硬件平台的全...

关键字: 边缘人工智能 AI STM32

今天,小编将在这篇文章中为大家带来STM32单片机最小系统的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 单片机最小系统 STM32

STM32是一款由STMicroelectronics生产的微控制器系列,具有高性能、低功耗和丰富的外设资源。其中,串口通信是一种常用的通信方式,可以实现与其他设备之间的数据传输。

关键字: STM32 串口通信 微控制器

STM32是一种广泛使用的微控制器,具有丰富的通信接口。其中,串口通信是STM32与其他设备或系统进行数据交换的重要方式之一。本文将详细介绍STM32串口通信的原理、应用及常见故障。

关键字: STM32 串口通信

由于目前缺乏相应的监测技术,地下电缆线路出现异常运行状态无法被及时发现,久而久之易演变成大故障,最终只能通过更换地下电缆进行修复,耗费大量的人力、物力。鉴于此,开发了一种基于STM32的地下电缆异常状态检测系统,利用热传...

关键字: STM32 地下电缆
关闭
关闭