STM32中断程序

合集下载

stm32单片机中断原理

stm32单片机中断原理

STM32单片机中断原理1. 什么是中断?在计算机系统中,中断是一种硬件或软件的事件,它打断了正在执行的程序,使CPU能够立即响应某个特定的事件。

中断机制是一种实现多任务处理的重要技术,它能够提高系统的响应速度和处理效率。

2. 中断的基本原理中断的基本原理是通过打断正在运行的程序,跳转到一个中断服务程序(ISR,Interrupt Service Routine)来处理特定的事件。

当发生中断时,CPU会暂停当前的任务,保存上下文(包括程序计数器、寄存器等),然后跳转到中断服务程序执行。

中断服务程序完成后,CPU会恢复之前的任务继续执行。

3. STM32中断的分类在STM32单片机中,中断可以分为两类:外部中断和内部中断。

•外部中断:是由外部设备(如按键、传感器等)触发的中断。

STM32单片机通常具有多个外部中断引脚,可以通过配置外部中断触发源来响应外部设备的事件。

•内部中断:是由单片机内部的事件触发的中断。

例如,定时器溢出、串口接收完成等。

4. STM32中断的基本原理为了使用中断功能,需要进行以下几个步骤:步骤1:中断向量表的配置中断向量表是一个存储中断服务程序地址的表格,用于指示中断发生时应该跳转到哪个中断服务程序执行。

在STM32单片机中,中断向量表位于Flash的起始地址处。

需要在代码中定义中断向量表,并将每个中断的中断服务程序地址写入相应的中断向量表项。

步骤2:中断优先级的配置每个中断都有一个优先级,用于确定中断的相对重要性。

在STM32单片机中,中断优先级可以通过设置优先级分组和优先级子组来进行配置。

优先级分组决定了中断优先级的位数和分配方式,优先级子组决定了同一分组内部的优先级划分。

步骤3:中断源的配置在STM32单片机中,可以通过配置寄存器来选择特定的中断源。

例如,可以通过配置GPIO的寄存器来选择某个引脚触发的外部中断源。

步骤4:中断服务程序的编写中断服务程序是中断发生时需要执行的代码。

奋斗STM32V3版按键中断_EXTI_例程

奋斗STM32V3版按键中断_EXTI_例程
奋斗版 STM32 开发板例程详解———按键中断实验

按键中断(EXTI)例程实验
实验平台:奋斗版STM32开发板V2、V2.1、V3 实验内容:板子加电后,按动板子上K1-K3按键,可控制对应的LED1-LED3的亮 灭,该实验学习了外部中断(EXTI)程序的编制及控制流程。
4.2 硬件电路设计
在开发板上V6、V7、V8分别与MCU的PB5、PD6、PD3相连,如下图所示
淘宝店铺:
11
奋斗版 STM32 开发板例程详解———按键中断实验

键盘部分如下图所示: 例程所用到的列扫描线:PC5,PC2,PC3。 例程所用到的行扫描线(EXTI中断线):PE2。
上升沿触发选择寄存器(EXTI_RTSR) 偏移地址:08H 复位值:0000 0000h
注意: 外部唤醒线是边沿触发的,这些线上不能出现毛刺信号。 在写EXTI_RTSR 寄存器时在外部中断线上的上升沿信号不能被识别,挂起位不会被置 位。在同一中断线上,可以同时设置上升沿和下降沿触发。即任一边沿都可触发中断。
1.2 外部中断配置寄存器2(AFIO_EXTICR2)
地址偏移:0Ch 复位值:0000h
淘宝店铺:
1
奋斗版 STM32 开发板例程详解———按键中断实验

1.3 外部中断配置寄存器3(AFIO_EXTICR3)
地址偏移:10h 复位值:0000h
1.4 外部中断配置寄存器4(AFIO_EXTICR4)
地址偏移:14h 复位值:0000h
淘宝店铺:
2
奋斗版 STM32 开发板例程详解———按键中断实验

2.1 嵌套向量中断控制器(NVIC)
淘宝店铺:
7

stm32adc中断函数例程

stm32adc中断函数例程

stm32adc中断函数例程STM32是意法半导体(STMicroelectronics)推出的一系列32位微控制器系列。

STM32微控制器提供了丰富的外设支持,其中之一是ADC(模数转换器)。

ADC是一种将模拟信号转换为数字信号的设备。

在嵌入式系统中,ADC通常用来将传感器检测到的模拟信号转换为数字信号,以便处理和分析。

在STM32中,ADC外设具有完善的功能和配置选项。

为了实现ADC 的连续转换,并能够在转换完成时触发一个中断,我们需要配置ADC 中的一些寄存器,并编写相应的中断处理函数。

以下是一个在STM32中使用ADC中断的例程。

首先,我们需要确保已正确配置ADC外设和相应的GPIO引脚,以使其能够读取模拟信号。

这些配置通常在启动文件中完成,此处不再赘述。

接下来,我们需要定义一些全局变量和函数,用于处理ADC中断事件。

假设我们要使用ADC1外设,我们将设置全局变量以保存ADC转换结果,并在中断处理函数中更新该变量。

```cuint16_t adcValue;void ADC_IRQHandler(void){if(ADC1->SR & ADC_SR_EOC){adcValue = ADC1->DR;}}```在上述代码中,我们定义了一个名为`adcValue`的全局变量,用于存储ADC转换结果。

`ADC_IRQHandler`是我们编写的中断处理函数,我们将在接下来的步骤中将其配置为与ADC1外设的中断线相连。

我们还要在代码的某处初始化ADC,并配置相关的中断使能。

以下是一个示例:```cvoid ADC_Init(void){RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //启用ADC1时钟ADC1->CR2 |= ADC_CR2_CONT; //连续转换模式ADC1->CR2 |= ADC_CR2_DMA; //使用DMA传输ADC1->CR2 |= ADC_CR2_ADON; //启动ADCADC1->SMPR1 |= ADC_SMPR1_SMP16; //设置采样时间ADC1->SQR3 |= 16; //设置转换通道ADC1->CR1 |= ADC_CR1_EOCIE; //使能转换完成中断NVIC_EnableIRQ(ADC_IRQn); //使能对应中断向量的中断}void ADC_Start(void){ADC1->CR2 |= ADC_CR2_SWSTART; //启动转换}```在上述代码中,我们首先使能了ADC1的时钟,并配置了一些转换参数。

stm32中断程序

stm32中断程序

stm32中断程序STM32是一款非常强大的微控制器系列,它的应用范围非常广泛,包括智能家居、汽车电子、医疗器械等等。

在STM32中,中断是非常重要的一个概念。

本文将详细介绍STM32中的中断程序。

一、中断的基本概念中断是指在程序执行过程中,某些硬件或软件条件满足时,CPU通过改变程序的执行顺序,转去执行相应的处理程序,处理完毕后再返回原程序继续执行。

换句话说,中断是指CPU在执行主程序时,暂停执行当前的指令序列,执行一段中断处理程序,处理完毕后再返回原处继续执行主程序。

二、STM32的中断控制器STM32的中断控制器是NVIC(Nested Vectored Interrupt Controller),它集成在Cortex-M3内核中。

NVIC可以处理中断请求,也可以管理中断优先级,它可以同时处理256个中断请求,并支持嵌套中断。

三、中断向量表中断向量表是一个表格,它里面存放着中断处理程序的入口地址。

在STM32中,中断向量表是存放在Flash中的,被称为向量表区或者中断向量表区。

向量表区的大小是固定的,为48字节(即12个中断)或者1024字节(即256个中断),它的起始地址是0x08000000或者0x00000000(取决于Flash的底层硬件设计)。

四、中断服务程序的编写中断服务程序可以分为两个部分:中断处理和中断返回。

中断处理是指具体的中断处理代码,中断返回则是指恢复现场并退出中断的代码。

在STM32中,中断服务程序的函数原型如下:void EXTIx_IRQHandler(void)其中,x表示中断源的编号,范围从0到15。

EXTI表示是外部中断。

在开发STM32中断程序之前,需要实现中断控制器的配置。

步骤如下:(1)设置中断向量表的首地址在开发环境中,中断向量表的首地址已经被定义好了。

如果在自定义的应用程序中需要重新设置中断向量表的首地址,可以使用以下代码:NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x10000);其中,NVIC_VectTab_FLASH表示中断向量表的首地址存储在Flash中,0x10000表示中断向量表的起始地址。

STM32HAL库关于串口中断烧录程序后可以正常运行,断电重启后无法进入中断的问题分析以及解决方法

STM32HAL库关于串口中断烧录程序后可以正常运行,断电重启后无法进入中断的问题分析以及解决方法

STM32HAL库关于串⼝中断烧录程序后可以正常运⾏,断电重启后⽆法进⼊中断的问题分析以及解决⽅法1、情景描述: 最近在做⼀个项⽬,X86的上位机通过串⼝控制MCU,使⽤串⼝中断接收上位机数据时,MCU在上电的情况下烧录程序,可以正常接收上位机的数据,在断电重启后,⼀直进⼊不了中断回调函数,上电的情况是X86上电,MCU也同时上电。

2、原因分析: 造成这个的原因是因为硬件上电的时候,因为X86跟MCU是同时上电的,上电后会把串⼝的电平拉⾼,这个⾼电平触发了MCU的串⼝中断,导致MCU的串⼝中断误以为接收到了⼀个数据,例如 HAL_UART_Receive_IT(&huart1, (uint8_t *)Rx_buff, 5) 这⾥,上电后MCU误以为接收了⼀个数据,还剩下4个数据没有接收,然后上位机每次发送5个数据过来后MCU中断数据接收个数错误,所以⼀直⽆法进⼊中断回调函数。

我们看到 HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart) ,⾥⾯的 RxXferCount 是告诉我们中断要接收的剩余数据量⼤⼩,根据上⾯举例⼦的话,上电时因为那个⾼电平的原因导致 RxXferCount 变成了4,如下图打印信息所⽰ 接着我们重新看回 HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart) 函数⾥的调⽤回调函数部分,下图所⽰,发现RxXferCount要为0的时候才会调⽤中断回调函数,依旧以上⾯例⼦说明,当MCU误以为上电时的⾼电平为数据时,上位机再发送5个数据下来,RxXferCount 就永远⽆法变成0,所以导致⼀直进⼊不了中断回调函数。

3、解决⽅法: 3.1软件解决⽅法 软件解决的时候,我们要知道导致这个问题的根源是 RxXferCount 这个值被误判了,所以我们只需要在上电的时候,对这个值进⾏修正即可; ⾸先我们定义⼀个标志位,⽤来标志MCU的状态是刚上电的状态 char uart_error_flag=0; 接着我们编写函数对 RxXferCoun 值进⾏处理/***函数名:void uart_error(void)说明:解决刚上电时,由于串⼝电平拉⾼,导致串⼝中断误以为接收到了⼀个字节,导致后⾯接收数据个数⼀直错误,⽆法进⼊中断回调函数问题传⼊值:⽆传出值:⽆**/void uart_error(void){if( (huart1.RxXferCount < Rxdsize) && (uart_error_flag==0) ){/*RxXferCount 告诉我们剩余空间⼤⼩,如果剩余空间和总空间不⼀样,则说明中断收到数据了*/printf("huart1.RxXferCount = %d\r\n",huart1.RxXferCount);uart_error_flag = 1;huart1.RxXferCount = 5; //修改回原来你需要接收数据⼤⼩的剩余空间,防⽌⽆法进⼊回调}} 最后我们在 main 函数⾥的 while 循环前调⽤即可int main(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART2_UART_Init(); //初始化打印信息串⼝MX_USART1_UART_Init(); //初始化中断接收串⼝HAL_UART_Receive_IT(&huart1, (uint8_t *)Rx_buff, Rxdsize); //打开串⼝中断接收uart_error(); //处理上电时串⼝中断误判的问题while (1){/* 注意要在中断回调函数⾥重新打开串⼝中断接收,否则串⼝中断接收只能接收⼀次 */}} 3.2 硬件解决⽅法 硬件解决⽅法⽐较粗暴,就是做⼀个电源延时电路,等X86重新上电后,再给MCU上电。

STM32外部中断处理流程

STM32外部中断处理流程

STM32外部中断处理流程外部中断是指引发中断的事件来自于MCU外部的输入引脚或外设,需要通过配置寄存器和中断服务程序来处理外部中断。

在STM32系列MCU中,外部中断处理可分为以下几个步骤。

1.配置中断引脚要使用外部中断功能,首先需要配置中断引脚。

对于STM32,外部中断引脚由GPIO口提供,需要通过GPIO配置寄存器设置相关引脚的工作模式、上下拉和中断触发方式等。

具体配置方法可以参考芯片手册。

2.配置中断控制器外部中断的中断源需要连接到中断控制器(NVIC),通过配置NVIC的相关寄存器来使能外部中断。

NVIC是位于ARM Cortex-M内核内部的外设,用于管理和分配中断优先级。

3.编写中断服务程序(ISR)中断服务程序(Interrupt Service Routine, ISR)是用于处理中断事件的函数,当外部中断引发时,MCU会跳转到相应的ISR进行处理。

在编写ISR时,需要注意以下几点:-确定中断源:可以通过读取中断状态寄存器来判断是哪个外部中断引起的中断。

-处理中断事件:根据中断源的不同,进行相应的处理。

例如,可以读取输入引脚状态、处理外设状态等。

-清除中断标志位:要在ISR内部清除中断标志位,以允许MCU再次响应该外部中断。

具体方法是通过读取相应的寄存器或调用相关函数清除中断标志位。

4.配置中断优先级中断优先级用于确定ISR的响应顺序,优先级较高的中断先被处理。

在STM32中,中断优先级可以通过配置中断控制器的相关寄存器进行设置。

5.启用中断在完成上述步骤后,需要启用相应的中断引脚和中断控制器。

具体方法是通过设置GPIO寄存器来使能中断引脚,并通过设置NVIC寄存器来使能相关中断。

6.处理中断请求一旦发生外部中断事件,MCU就会跳转到相应的ISR进行中断处理。

在ISR中,可以根据需要调用其他的函数或执行其他的操作。

处理完成后,可以通过清除中断标志位和退出中断函数来结束中断处理。

stm32外部中断的使用(含实例)

stm32外部中断的使用(含实例)

stm32外部中断的使⽤(含实例)中断对于开发嵌⼊式系统来讲的地位绝对是⽏庸置疑的,在C51单⽚机时代,⼀共只有5个中断,其中2个外部中断,2个定时/计数器中断和⼀个串⼝中断,但是在STM32中,中断数量⼤⼤增加,⽽且中断的设置也更加复杂。

今天就将来探讨⼀下关于STM32中的中断系统。

1 基本概念ARM Coetex-M3内核共⽀持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。

STM32⽬前⽀持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使⽤中断优先级设置8bit中的⾼4位。

STM32可⽀持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备⾃⼰的中断优先级控制字节PRI_n(8位,但是STM32中只使⽤4位,⾼4位有效),每4个通道的8位中断优先级控制字构成⼀个32位的优先级寄存器。

68个通道的优先级控制字⾄少构成17个32位的优先级寄存器。

4bit的中断优先级可以分成2组,从⾼位看,前⾯定义的是抢占式优先级,后⾯是响应优先级。

按照这种分组,4bit⼀共可以分成5组第0组:所有4bit⽤于指定响应优先级;第1组:最⾼1位⽤于指定抢占式优先级,后⾯3位⽤于指定响应优先级;第2组:最⾼2位⽤于指定抢占式优先级,后⾯2位⽤于指定响应优先级;第3组:最⾼3位⽤于指定抢占式优先级,后⾯1位⽤于指定响应优先级;第4组:所有4位⽤于指定抢占式优先级。

所谓抢占式优先级和响应优先级,他们之间的关系是:具有⾼抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当⼀个中断到来后,如果正在处理另⼀个中断,这个后到来的中断就要等到前⼀个中断处理完之后才能被处理。

如果这两个中断同时到达,则中断控制器根据他们的响应优先级⾼低来决定先处理哪⼀个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪⼀个。

简述stm32f1单片机中断管理过程

简述stm32f1单片机中断管理过程

简述stm32f1单片机中断管理过程
STM32F1 单片机是一种常用的嵌入式系统芯片,其中断管理过程如下:
1. 中断控制器 (INTC)
STM32F1 单片机内置一个 8 位的中断控制器 (INTC),用于管理中断请求。

INTC 由一个中断向量表和四个中断源寄存器组成。

其中,中断向量表中包含了所有可用的中断源及其对应的中断号,而四个中断源寄存器则分别记录了当前中断源的启用状态。

2. 中断请求的发送和响应
当外部设备需要使用中断时,会通过中断线向 INTC 发送中断请求信号。

INTC 接收到中断请求信号后,会将中断请求信息写入相应的中断源寄存器中,告知 CPU 中断请求已经发生。

然后,CPU 会暂时停止当前程序的执行,转向执行中断处理程序 (ISR)。

3. 中断处理程序 (ISR)
ISR 是中断处理程序的缩写,用于处理中断请求。

ISR 通常会将当前程序的状态保存到堆栈中,然后将中断请求信号清除,以便下一次中断发生时能够正常响应。

此外,ISR 还可能执行一些与中断请求无关的操作,例如读写外部存储器等。

4. 中断请求的撤销
在中断处理程序执行完毕后,CPU 会恢复中断请求信号,并继续执行被中断的程序。

如果需要在中断处理程序结束后撤销中断请求,可以通过向 INTC 发送特定的中断撤销信号来实现。

STM32F1 单片机的中断管理过程是一个复杂的过程,需要 CPU 和中断控制
器的协同工作。

通过中断机制,STM32F1 单片机可以实现对外部设备的高效管理和控制,提高系统的性能和响应速度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32中断程序前段时间用STM32F103VBT6写了一个中断的函数,借此机会想了解下STM32的中断机制,用过之后发现STM32的中断配置相当灵活,稳定行很高,测试发现几乎没出过什么差错。

我在程序里开了三个中断,一个计数器用于精确延时用,另外两个为外部事件处理中断,下面一一详细介绍,方便初学者入门。

在进行STM32中断配置之前首先需要了解下它的中断部分:一、Cortex-M3中断机制在STM32处理器中有43个可屏蔽中断通道(?包含16个Cortex?-M3的中断线)。

共设置了16个可编程的优先等级(使用? 4位中断优先级);它的嵌套向?中断控制器(NVIC)和处?器核的接口紧密相连,可以实现低延迟的中断处?和有效处?地处?晚到的中断。

嵌套向?中断控制器管?着包括核异常等中断。

Cortex—M3是一个32位的核,在传统的单片机领域中,有一些不同于通用32位CPU应用的要求。

比如在工控领域,用户要求具有更快的中断速度,Cortex-M3采用了Tail-Chaining中断技术,完全基于硬件进行中断处理,最多可减少12个时钟周期数,在实际应用中可减少70%中断。

异常或者中断是处理器响应系统中突发事件的一种机制。

当异常发生时,Cortex—M3通过硬件自动将编程计数器(PC)、编程状态寄存器(XPSR)、链接寄存器(LR)和R0~R3、R12等寄存器压进堆栈。

在Dbus(数据总线)保存处理器状态的同时,处理器通过Ibus(指令总线)从一个可以重新定位的向量表中识别出异常向量,并获取ISR函数的地址,也就是保护现场与取异常向量是并行处理的。

一旦压栈和取指令完成,中断服务程序或故障处理程序就开始执行。

执行完ISR,硬件进行出栈操作,中断前的程序恢复正常执行。

图1为Cortex—M3处理器的异常处理流程。

二、STM32 SysTick 介绍Cortex-M3的内核中包含一个SysTick时钟。

SysTick为一个24位递减计数器,SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1 。

计数到0时SysTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG 标志会置位,触发中断( 如果中断使能情况下) 。

对于STM32系列微处理器来说,执行一条指令只有几十个ns ,进行for 循环时,要实现N毫秒的x值非大,而且由于系统频率的宽广,很难计算出延时N毫秒的精确值。

针对STM32微处理器,需要重新设计一个新的方法去实现该功能,因此,在STM32的应用中,使用Cortex-M3内核的SysTick 作为定时时钟,设定每一毫秒产生一次中断,在中断处理函数里对N减一,在Delay(N)函数中循环检测N是否为0,不为0则进行循环等待;若为0 则关闭SysTick 时钟,退出函数,这种延时函数的做法能很高效地实现精确定时。

三、SysTick编程实现Delay(N)函数思路:利用systick定时器为递减计数器,设定初值并使能它后,它会每个系统时钟周期计数器减 1 ,计数到0 时,SysTick 计数器自动重装初值并继续计数,同时触发中断。

那么每次计数器减到0 ,时间经过了:T = 系统时钟周期x计数器初值比如使用72M 作为系统时钟,那么每次计数器减1 所用的时间是1/72M ,计数器的初值如果是72000 ,那么每次计数器减到0 ,时间经过(1/72M) * 72000 =0.001s ,即1ms.有了以上思路做铺垫后,为了实现首先我们需要一个72MHz的SysTick时钟。

第一步配置RCC寄存器和SysTick寄存器由于系统时钟(SysTick)可选择为PLL输出、HSI或者HSE,在这里选择9倍频的PLL作为SysTick的时钟源,同时HCLK(AHB Clock)时钟也相应的配置成72MHz了,因为最终SysTick是需要通过AHB后输出的,所以在配置的同时也需要选择AHB 时钟,这里选择为RCC_SYSCLK_Div1(咖啡色部分)表示AHB 时钟= 系统时钟,相关配置见下面函数(RCC_Configuration)红色字体部分。

这里需要特别强调一点,有关书籍里常提到"SysTick的最高频率为9MHz (最大为HCLK/ 8),在这个条件下,把SysTick重装载值设置为9000,将SysTick时钟设置为9MHz,就能够产生1ms 的时间基值"刚开始对这句话感到很迷惑,因为,有的地方介绍SysTick没有说最大频率智能9MHz,这里却指出会被8分频,两者出现了矛盾!相信有过我这种疑惑的人不在少数!究其原因我猜想是原文作者没有说明这点,转载的人见到有相关的知识便直接转载了,自己也没去想,估计也没弄明白过,这样便一个个都转开了,所以我建议在吸取别人精华时要多多思考,只有注入了自己的新元素知识才是被真正吸收了,否则即使涉猎的再多,也只是收藏!现在再来分析下上面的那个矛盾点,其实应该这么理解的,在STM32中,SysTick的架构其实是这么回事的:首先选择时钟源-->AHB-->这里便分走两路,其一被8分频,也便出现了最高频率9MHz的结果;其二作为FCLK(CM3上的自由运行时钟)直接从AHB输出,这里却是没有再分频的,其频率就是AHB时钟频率,最大可以达到72MHz,下面程序对其设置也是在72MHz的的情况下的,具体可以参考STM32时钟架构这幅图,如下:void RCC_Configuration(void){RCC_DeInit();RCC_HSEConfig(RCC_HSE_ON);HSEStartUpStatus=RCC_WaitForHSEStartUp(); if(HSEStartUpStatus==SUCCESS){RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK2Config(RCC_HCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);FLASH_SetLatency(FLASH_Latency_2);FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);RCC_PLLCmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while(RCC_GetSYSCLKSource()!=0x08){}}RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ GPIOE|RCC_APB2Periph_AFIO,ENABLE);}配置完了RCC后,接下来便是需要配置SysTick了,使用ST 的函数库使用systick 的方法一般步骤如下所示:1 、调用SysTick_CounterCmd() -- 失能SysTick 计数器2 、调用SysTick_ITConfig () -- 失能SysTick 中断3 、调用SysTick_CLKSourceConfig() -- 设置SysTick 时钟源。

4 、调用SysTick_SetReload() -- 设置SysTick 重装载值。

5 、调用SysTick_ITConfig () -- 使能SysTick 中断6 、调用SysTick_CounterCmd() -- 开启SysTick 计数器SysTick_Configuration: 配置SysTickvoid SysTick_Configuration(void){SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTSysTick_ITConfig(ENABLE);}编写响应的中断服务子函数,这个先对比较简单,直接在stm32f10x_it.h的void SysTickHandler(void)函数里填充计数值便可:vu32 TimingDelay = 0;void SysTickHandler(void){TimingDelay--;}记住,在调用它的.C文件里记得申明TimingDelay这个变量为全局变量,否则无法使用这个计数值:extern vu32 TimingDelay;上面函数只是完成了前5步,接下来需要开启SysTick计数器以便让其工作,前面已经说过在SysTick一般多用于做精确延时用,故而对于这个延时函数它的生命周期便在调用开始到调用结束,所以第6部一般放在被调用的这个函数中(Delay(N)):void Delay(u32 nTime){SysTick_CounterCmd(SysTick_Counter_Enable);TimingDelay = nTime;while(TimingDelay != 0);SysTick_CounterCmd(SysTick_Counter_Disable);SysTick_CounterCmd(SysTick_Counter_Clear);}至此,一个小的时钟便算配置好了,接下来配置其他两个中断,道理是一样的,这两个为按键输入,作为外部中断事件,分为两个部分,其一为端口配置在GPIO_Configration函数中,选择工作模式为上拉输入,用作外部中断线路,下降沿触发void GPIO_Configration(void){GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource11);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource12);EXTI_InitStructure.EXTI_Line=EXTI_Line11|EXTI_Line12;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);}其二是NVIC嵌入式中断配置,包括中断源(中断向量)、优先级、使能等常规设置,具体在前一篇STM32中断机制中介绍得很详细了,这里就不多说了,具体配置在void NVIC_Configuration(void)函数里void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_RAM,0X0);//向量表位于RAM区#elseNVIC_SetVectorTable(NVIC_VectTab_FLASH,0X0);//向量表位于FLASH区 #endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//选择第一组//使能EXTI15_10中断,按键PA11NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;// 指定抢占式优先级别0NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;// 指定响应优先级别0 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//NVIC_Init(&NVIC_InitStructure);//使能EXTI15_10中断,按键PA12NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;// 指定抢占式优先级别0NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;// 指定响应优先级别0 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//NVIC_Init(&NVIC_InitStructure);}最后是相应的中断服务子函数,还是在stm32f10x_it.h中,该中断为EXTI15_10中断,故而其中断服务子函数在void EXTI15_10_IRQHandler(void)中惊醒执行,具体格式如下:void EXTI15_10_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line11)!=RESET)//判断标志,中断是否发生{...EXTI_ClearITPendingBit(EXTI_Line11); //清标志位}if(EXTI_GetITStatus(EXTI_Line12)!=RESET)//判断标志,中断是否发生{...EXTI_ClearITPendingBit(EXTI_Line12); //清标志位}}最后下载运行,主函数中让一个LED闪烁,按键1让其他四个LED连续闪烁三次,按键2让另外4个LED依次流水,下载运行,测试通过!详细代码可以直接下载如下压缩文件,编译环境为MDK350PRC,固件库在安装目录下的子文件夹中,版本差别不大。

相关文档
最新文档