stm32 串口中断总结

合集下载

关于STM32串口空闲中断IDEL的问题

关于STM32串口空闲中断IDEL的问题

关于STM32串口空闲中断IDEL的问题1.空闲中断是接受数据后出现一个byte 的高电平(空闲)状态,就会触发空闲中断.并不是空闲就会一直中断,准确的说应该是上升沿(停止位)后一个byte,如果一直是低电平是不会触发空闲中断的(会触发break 中断)。

2.关于第二点有要铺垫的三个情况,datasheet 中”当一空闲帧被检测到时,其处理步骤和接收到普通数据帧一样,但如果IDLEIE 位被设置将产生一个中断”“空闲符号被视为完全由'1'组成的一个完整的数据帧,后面跟着包含了数据的下一帧的开始位'1'的位数也包括了停止位的位数”空闲符号的配图后面跟这一个低电平.有人理解为只有收到下一个数据的起始位才会触发中断,这样理解是不对的,应该是数据后有空闲了一帧就会触发.3.清中断的方式感觉奇怪,使用函数USART_ClearITPendingBit( USART1,USART_IT_IDLE )清除不了中断的.我用的是3.5 的库,查看函数说明,里面的@param 参数并没有IDLE,后面的@note 中,这样说:”PE(Parity error),FE(Framingerror),NE(Noise error),ORE(OverRun error) and IDLE(Idle line detected) pendingbits are cleared by software sequence: a read operation to USART_SR register(USART_GetITStatus()) followed by a read operation to USART_DR register(USART_ReceiveData()).”我是通过语句”USART1->DR;”来清除IDLE 中断的.现在有很多数据处理都要用到不定长数据,而单片机串口的RXNE 中断一次只能接收一个字节的数据,没有缓冲区,无法接收一帧多个数据,现提供两种利用串口IDLE 空闲中断的方式接收一帧数据,方法如下:方法1:实现思路:采用STM32F103 的串口1,并配置成空闲中断IDLE 模式且使能DMA 接收,并同时设置接收缓冲区和初始化DMA。

stm32cubemx 串口中断和回调函数运行机制

stm32cubemx 串口中断和回调函数运行机制

stm32cubemx 串口中断和回调函数运行机制在STM32CubeMX 中配置串口中断和回调函数的运行机制涉及到STM32 微控制器的中断系统和HAL 库的使用。

下面是一个简要的概述:1. 配置串口硬件:首先,在STM32CubeMX 中,你需要配置串口硬件,选择串口的引脚、波特率等参数。

在配置过程中,你还可以选择是否启用串口的中断。

2. 生成代码:完成硬件配置后,通过STM32CubeMX 生成初始化代码。

这将生成包含初始化串口的HAL 库函数调用的 C 代码文件。

3. 中断配置:如果启用了串口中断,STM32CubeMX 将生成相应的中断处理函数的框架,但并不会直接实现中断处理的代码。

在生成的代码中,你会看到像`USARTx_IRQHandler` 这样的中断处理函数,其中`x` 是你所配置的串口号。

你需要在这个函数中实现具体的中断处理逻辑。

4. HAL_UART_IRQHandler 函数:在中断处理函数中,通常会调用HAL 库的相应函数,如`HAL_UART_IRQHandler`。

这个函数实际上是一个通用的串口中断处理函数,它会检查串口中断的原因并调用相应的回调函数。

5. 回调函数:在HAL 库中,你可以注册一个回调函数,该函数将在串口中断发生时被调用。

回调函数的注册通常在初始化串口时完成,使用的函数是`HAL_UART_Receive_IT` 或`HAL_UART_Transmit_IT`。

这两个函数中的`_IT` 表示启用中断。

以下是一个伪代码示例,演示了串口中断和回调函数的配置:```c// 串口接收缓冲区uint8_t rxBuffer[BufferSize];// 串口中断回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {// 处理接收完成中断// 处理完后重新启动接收HAL_UART_Receive_IT(&huart1, rxBuffer, BufferSize);}int main() {// STM32CubeMX 生成的初始化代码// 启动串口接收中断HAL_UART_Receive_IT(&huart1, rxBuffer, BufferSize);while (1) {// 主循环}}```在这个例子中,`HAL_UART_RxCpltCallback` 函数是串口接收完成中断的回调函数。

关于STM32的串口溢出中断

关于STM32的串口溢出中断

关于STM32的串口溢出中断
之前遇到奇怪的问题:
串口中断处理函数中加了溢出中断处理:
if(USART_GetITStatus(USART1,USART_IT_ORE) != RESET) //产生溢出中断{
Utemp = USART_ReceiveData(USART1); //扔掉接收的数据
USART_ClearITPendingBit(USART1, USART_IT_ORE); //清溢出中断标志位}
参考手册ISR 寄存器:
位3 ORE: 溢出错误
在RXNE=1 的的条件下(也就是上次数据还没有读走),串口接收寄存器又接收好
了一个字节的数据并准备往RDR 寄存器去转移的时候,会由硬件将这个位置1。

由软件向USART_ICR 寄存器的ORECF 位写1,可以清除这个标志。

如果USART_CR1 寄存器中的RXNEIE 位或EIE 位是1,就会产生中断请求。

0: 没有溢出错误
1: 检测到溢出错误
CR1 中的RXNEIE 已经使能,实际溢出发生时keil 中观察ORE 的确被置位为1。

然鹅,,,,,,,,
就算ORE 置位为1,这个if 语句也不通过。

stm32f407串口的中断接收函数

stm32f407串口的中断接收函数

stm32f407串口的中断接收函数在stm32f407单片机中,串口通信是一种常见且重要的通信方式。

通过串口通信,可以方便地与外部设备进行数据交互。

而中断是一种常用的编程技术,可以有效提高系统的响应速度和效率。

因此,使用中断来接收串口数据可以更好地利用系统资源,提高数据接收的实时性和可靠性。

我们需要在stm32f407单片机上配置串口模块。

在配置串口模块时,需要设置波特率、数据位、停止位、校验位等参数。

具体的配置方法可以参考stm32f407单片机的相关文档或开发工具的使用手册。

在配置完串口模块后,我们需要编写中断服务函数来处理串口接收中断。

中断服务函数是一种特殊的函数,它会在中断事件发生时被自动调用。

在stm32f407单片机中,串口接收中断对应的中断向量是USARTx_IRQHandler,其中x表示串口模块的编号。

例如,如果我们使用的是USART1串口模块,那么对应的中断向量就是USART1_IRQHandler。

在中断服务函数中,我们首先需要判断中断事件的来源。

对于串口接收中断,我们可以通过检查状态寄存器的接收标志位来判断是否有数据接收到。

如果接收标志位被置位,说明有数据接收到,我们可以通过读取数据寄存器来获取接收到的数据。

接下来,我们可以根据接收到的数据进行相应的处理。

例如,我们可以将接收到的数据存储到缓冲区中,或者根据接收到的数据进行一些特定的操作。

在处理完数据后,我们可以清除接收标志位,以便下一次接收。

除了处理接收数据外,我们还可以在中断服务函数中进行其他一些操作。

例如,我们可以检查数据的完整性和正确性,对接收到的数据进行校验。

如果数据不符合要求,我们可以进行相应的处理,例如丢弃数据或者发送错误信息。

需要注意的是,在中断服务函数中,我们需要尽量减少耗时操作。

因为中断服务函数需要尽快地完成,以便系统能够尽快地响应其他中断事件。

如果中断服务函数执行的时间过长,可能会导致系统的响应速度下降,甚至影响系统的正常运行。

STM32串口通信学习总结

STM32串口通信学习总结

STM32串口通信学习总结STM32是STMicroelectronics推出的一款32位单片机系列,具有高性能、低功耗、丰富的外设等特点,广泛应用于工业控制、消费电子、汽车电子等领域。

其中,串口通信是单片机中常用的通信方式之一,本文将对STM32串口通信学习进行总结。

1.串口通信原理及基础知识在STM32中,USART(通用同步/异步收发器)是负责串口通信的外设。

USART提供了多种模式的串口通信,包括异步模式(Asynchronous)、同步模式(Synchronous)以及单线模式(Single-wire)等。

2.STM32串口通信配置步骤(1)GPIO配置:首先需要配置串口通信所涉及的GPIO引脚,通常需要配置为复用功能,使其具备USART功能。

(2)USART配置:根据需要选择USART1、USART2、USART3等串口进行配置,设置通信模式、波特率等参数。

在配置时需要注意与外部设备的通信标准和参数保持一致。

(3)中断配置(可选):可以选择中断方式来实现串口数据的收发。

通过配置中断,当接收到数据时会触发中断,从而实现接收数据的功能。

(4)发送数据:通过USART的发送寄存器将数据发送出去,可以通过查询方式或者中断方式进行发送。

(5)接收数据:通过读取USART的接收寄存器,获取接收到的数据。

同样可以通过查询方式或者中断方式进行接收。

3.常见问题及解决方法(1)波特率设置错误:在进行串口通信时,波特率设置错误可能会导致通信失败。

需要根据外设的要求,选择适当的波特率设置,并在STM32中进行配置。

(2)数据丢失:在高速通信或大量数据传输时,由于接收速度跟不上发送速度,可能会导致数据丢失。

可以通过增加接收缓冲区大小、优化接收中断处理等方式来解决该问题。

(3)数据帧错误:在数据传输过程中,可能发生数据位错误、校验错误等问题。

可以通过对USART的配置进行检查,包括校验位、停止位、数据位等的设置是否正确。

STM32串口接收中断溢出问题解决

STM32串口接收中断溢出问题解决

STM32串口接收中断溢出问题解决在使用一个串口发数据的传感器过程中,发现程序第一次进入串口中断之后不再执行主函数的内容,中断中的内容也不执行。

查询大量资料后发现:串口在接收数据过多时,会出现串口溢出错误,并进入溢出中断(ORE中断)。

接下来是错误产生原因以及解决方法。

(1)什么是ORE中断?为什么会产生?产生原因如上所述。

ORE标志位在USART_SR寄存器,但值得注意的是,当我们打开串口接收中断时,同时也就打开了ORE中断。

(2)如何解决?看了上面的资料之后,我知道程序是死在了串口溢出中断。

处理中断时,我首先想到的是清除这个中断标志位,但是遇到了很多麻烦。

清除ORE位的方法:顺序执行对USART_SR和USART_DR寄存器的读操作。

注意:在此使用USART_ClearITPendingBit(USART1, USART_IT_ORE);清除ORE位是没有任何作用的。

还有ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时) 这些都是在这个帖子里读到的/love_maomao/article/details/8234039帖子还指出了手册的翻译错误,哈哈,很厉害的博主(在此表白)。

最后附上解决方案:中断服务函数:if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET){USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中断}if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {USART_ClearITPendingBit(USART2, USART_IT_RXNE);//rebuf[num++] = USART_ReceiveData(USART2); 读取串口数据}。

STM32 不断进入串口中断问题 解决方法

STM32 不断进入串口中断问题 解决方法

STM32 不断进入串口中断问题解决方法STM32 有时候会不断进入中断,解决方法如下1.串口初始化配置时,需要打开ORE 溢出中断,如下红色代码所示 [cpp] view plain copy1.void Usart_Init(void)2.{3.4.5. GPIO_InitTypeDef GPIO_InitStructure;6. NVIC_InitTypeDef NVIC_InitStructure;7. USART_InitTypeDef USART_InitStructure;8.9. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 开启串口时钟10.11. GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);12. GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);13.14. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;15. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;17. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;18. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;19. GPIO_Init(GPIOA,&GPIO_InitStructure);20.21.22.23. USART_ART_BaudRate = 57600; // 配置波特率为11520024. USART_ART_StopBits = USART_WordLength_8b; // 配置数据长度为825. USART_ART_StopBits = USART_StopBits_1; //设置停止位26. USART_ART_Parity = USART_Parity_No; // 配置奇偶校验为NONE27. USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None; // 配置硬件流为NONE 28. USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 打开Rx接收和Tx发送功能29.30. USART_Init(USART1,&USART_InitStructure); // 配置31.32.33. USART_Cmd(USART1,ENABLE);34.35. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; // 选择中断通道36. NVIC_InitStructure.NVIC_IRQChannelPriority = 2; // 抢断优先137. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断38.39. NVIC_Init(&NVIC_InitStructure);40.41.<span style="color:#ff0000;"> USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 打开中断42. USART_ITConfig(USART1, USART_IT_ORE, ENABLE);</span> // 打开中断43.44.45.}2.在中断中,检测溢出中断并作处理,代码如下所示[cpp] view plain copy1.void USART1_IRQHandler(void)2.{3. u8 dat;4.5.<span style="color:#ff0000;"> if (USART_GetITStatus(USART1, USART_IT_ORE) == SET)6. {7. USART_ClearITPendingBit(USART1,USART_IT_ORE);8. USART_ReceiveData( USART1 );9.10. }</span>11.if( USART_GetITStatus(USART1,USART_IT_RXNE) != RESET ) // 等价于if( !RI ) 检查串口数据是否已就位12. {13. USART_ClearITPendingBit(USART1,USART_IT_RXNE);14. dat = USART_ReceiveData( USART1 );15. uart_rec_buf[uart_len++]=dat;16. RX_TIM=UART_INIT_TIM;17.18. }19.20.}这样就可以解决,串口不断进入中断的问题。

STM32串口之空闲中断

STM32串口之空闲中断

STM32串⼝之空闲中断NBiot模块⼀般都是串⼝接⼝,使⽤AT指令集,对接中国移动onenet平台。

先⽤串⼝助⼿去测试,流程测试OK之后需要在MCU上重新写⼀遍。

STM32串⼝ IDLE中断IDLE其实是空闲的意思。

IDLE中断叫空闲中断,不叫帧中断。

那么什么叫空闲,怎么定义空闲呢?在实际发送数据的时候,⽐如⼀串字符串,我们会采⽤如下⽅式发送void uart1_putc(char dat){SBUF = dat;while (!TI);TI = 0;}void uart1_puts_n(char *str){while (*str)uart1_putc(*str++);}void uart1_puts_n("i am handsome");其实发送的两个字符之间间隔⾮常短,所以在两个字符之间不叫空闲。

空闲的定义是总线上在⼀个字节的时间内没有再接收到数据,空闲中断是检测到有数据被接收后,总线上在⼀个字节的时间内没有再接收到数据的时候发⽣的。

⽽总线在什么情况时,会有⼀个字节时间内没有接收到数据呢?⼀般就只有⼀个数据帧发送完成的情况,所以串⼝的空闲中断也叫帧中断。

要怎么开启帧中断呢?其实其他串⼝配置不⽤改变,只需要在开启串⼝接收中断的时候加上⼀句话就Ok。

USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串⼝接收中断USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//开启串⼝空闲中断然后中断函数如下void USART2_IRQHandler(void){ //串⼝1中断服务程序int clear;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){ //字符接收中断(接收到的数据必须是0x0d 0x0a结尾)USART2_RX_BUF[length++] = USART2->DR & 0x0FF;}else if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){//空闲帧中断if(USART2_RX_BUF[length - 1] == 0xff){clear = USART2->DR;clear = USART2->SR;length = clear;length = 0;USART2_RX_STA = 1;}else{;}}}在普通中断的时候仅仅保存数据,在帧中断的时候需要执⾏相应处理函数。

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

本文以USART1为例,叙述串口中断的编程过程。

1、先来讲述一下在应用串口中断时涉及到的一些库文件。

首先对于STM32外设库文件的应用编程,misc.c和stm32f10x_rcc.c是肯定要添加到。

接下来就是我们要用到的相关外设了。

毫无疑问,串口文件stm32f10x_usart.c是必须的。

串口通信是对通用GPIO端口引脚的功能复用,所以还需要stm32f10x_gpio.c文件。

另外,因为有中断的产生,所以中断文件stm32f10x_it.c也是必要的,当然这个文件一般和main.c 放在一个文件夹下(一般习惯为User文件夹),因为我们的中断响应函数是要在里面自己编写的。

当然还有其他的基本必须文件如系统配置文件等在这地方就不说了,这个是创建一个工程应该知道的。

2、初始化对于串口通信的初始化,不仅仅只是对串口的初始化(这个地方是比较烦人的,不像别的芯片那样简洁明了)。

●∙首先时钟使能配置。

STM32内部的时钟有很多,感兴趣的自己看看参考手册。

此处以USART1为例说明。

有USART1时钟、GPIOA时钟、GPIO复用(AFIO)时钟。

由于此处USART1和GPIOA、AFIO均在APB2上,所以可以一次配置完成。

如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1 ,ENABLE);●∙其次中断配置。

主要有优先级组设定、USART1中断使能、该中断的优先级,中断初始化。

程序如下:void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//选择分组方式0/* 使能 USART1中断 */NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}●∙然后GPIO复用功能配置。

一般情况下我们使用原始的外设和GPIO端口引脚的映射关系,如果要改变其映射的话,请另外查看参考手册上关于GPIO重映射部分。

对于GPIO的复用,其引脚的输入与输出模式都有要求,在参考手册上有详细说明。

void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/* 配置 USART1 Rx 作为浮空输入 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);/* 配置 USART1 Tx 作为推挽输出 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);}串口初始化配置。

主要有串口基本参数配置(如波特率、数据位、工作方式等),串口中断使能,串口使能。

(1) 基本参数配置USART_InitTypeDef USART_InitStructure;USART_ART_BaudRate = 9600;//波特率USART_ART_WordLength = USART_WordLength_8b;//数据长度USART_ART_StopBits = USART_StopBits_1;//停止位USART_ART_Parity = USART_Parity_No;//校验USART_ART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制无USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;//发送与接受两种方式USART_Init(USART1, &USART_InitStructure);//用配置的参数惊喜串口初始化(2) 串口中断使能USART_ITConfig(USARTy, USART_IT_RXNE, ENABLE);//使能接受中断,在接受移位寄存器中有数据是产生USART_ITConfig(USARTy, USART_IT_TXE, ENABLE);//使能发送中断,在发送完数据后产生。

一般情况下,如果与PC通信的话,我们只用接受中断即可。

(3) 串口使能USART_Cmd(USART1, ENABLE);//USART1使能好了,经过以上不走之后呢,我们就可以进行数据的收发了。

3、发送数据使用函数USART_SendData(USART1, char data),一次只能发送一个字符。

当然我们可以用如下函数发送字符串。

void USART1_Puts(char * str){while(*str){USART_SendData(USART1, *str++); //发送一个字符while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完毕}}当然我们也可以循环发送字符串数组for(i = 0; TxBuf1 != '\0'; i++) // TxBuf1为定义好的字符串数组{USART_SendData(USART2 , TxBuf1);while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);}4、接收数据由于我们使用的是接受中断,所以当有数据需要接收时,会执相应的中断函数。

此处我们USART1的中断函数在stm32f10x_it.c文件中。

找到函数void USART1_IRQHandler(void),如果没有的话就自己加上吧,别忘了头文件中需要声明一下。

当然你也可以在其他文件中写下该中断函数。

当产生中断进入该函数之后,我们就可以进行自己的操作了。

void USARTy_IRQHandler(void){if(USART_GetITStatus(USARTy, USART_IT_RXNE) != RESET)//如果寄存器中有数据{/* Read one byte from the receive data register */RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);}/*************************************************************if(USART_GetITStatus(USARTy, USART_IT_TXE) != RESET){USART_SendData(USARTy, TxBuffer1[TxCounter1++]);}//这个地方那个之所以把这个写出来主要是想说发送中断和接受中断其实是共用一个//中断函数的,到底是那个中断发生了呢,这就需要我们读取中断状态标志来识别了。

*****************************************************************/}别忘了在接受完数据进行别的操作之前为了防止数据被覆盖最好先禁止一下接受中断/* 禁止 USART1接收中断 */USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);/* 禁止 USART1发送中断 */USART_ITConfig(USART1, USART_IT_TXE, DISABLE);5、main函数int main(void)//这个地方和特别,我们知道一般main函数是没有返回值的,但在STM32//的编程中其返回类型为int。

{RCC_Configuration();NVIC_Configuration();GPIO_Configuration();USART_ART_BaudRate = 9600;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No;USART_ART_HardwareFlowControl= USART_HardwareFlowControl_None;USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//USART_ITConfig(USART1, USART_IT_TXE, ENABLE);USART_Cmd(USART1, ENABLE);while (1)//等待中断{}}当然你也可以在main()中添加一些发送指令之类的东西。

以上内容为个人总结,转载请注明出处。

若有错误,本人概不负任何责任。

STM32 外部中断配NVIC_Configuration 函数实现配置嵌套向量中断中断优先级并使能中断。

其中的NVIC_PriorityGroupConfig 函数配置中断优先级的组织方式,STM32 的嵌套向量中断控制器可以配置16 个可编程的优先等级,使用了4 位表示中断优先级(2 的 4 此方就是16),16 个可编程的优先等级又可以分为主优先级和次优先级,例如参数NVIC_PriorityGroup_1表示1bit 主优先级(pre-emption priority)3 bits 次优先级(subpriority )。

一、配置中断1、分配中断向量表:/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);2、设置中断优先级:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置中断优先级3、初始化外部中断:/*允许EXTI4中断*/NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel; //中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= PreemptionPriorityValue; //占先优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应(次级)优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中断使能NVIC_Init(&NVIC_InitStructure); //初始化中断注意:如果我们配置的外部针脚为PA4,或PB4,或PC4,PD4等,那么采用的外部中断也必须是EXTI4,同样,如果外部中断针脚是PA1,PB1,PC1,PD1 那么中断就要用EXTI1,其他类推。

相关文档
最新文档