Questions tagged «interrupts»

一种控制计算机中程序流的机制。中断后,计算机将保存其当前的操作状态,并根据生成的中断更改代码的执行。中断可以是硬件来源的,也可以是软件来源的。来自软件的中断称为陷阱。它是轮询的另一种机制,是实现大多数I / O,多任务和控制的基础。

3
Cortex-M3的关键部分
我想知道在Cortex-M3上实现关键代码部分的情况,这些部分由于时序限制或并发问题而不允许例外。 就我而言,我正在运行LPC1758,板上装有TI CC2500收发器。CC2500具有可用作RX缓冲区中的数据和TX缓冲区中的可用空间的中断线的引脚。 例如,我想在我的MCU的SRAM中有一个TX缓冲区,而当收发器的TX缓冲区中有可用空间时,我想在其中写入此数据。但是,将数据放入SRAM缓冲区的例程显然不能被TX中的自由空间中断中断。因此,我想做的是在执行此过程以填充此缓冲区时临时禁用中断,但在此过程完成后执行此过程期间会发生任何中断。 在Cortex-M3上如何做到最好?

4
STM32:定时器中断立即起作用
这是我的STM32F429项目中的计时器代码: //timer initialization void timerInit() { uwPrescalerValue2 = (uint32_t) ((SystemCoreClock / 2) / 100000) - 1; RS485Timer.Instance = TIM5; RS485Timer.Init.Period = 67400000; // high value to notice interrupt even without debugging RS485Timer.Init.Prescaler = 400000; RS485Timer.Init.ClockDivision = 0; RS485Timer.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_Base_Init(&RS485Timer); } void timerReset() { HAL_TIM_Base_Stop_IT(&RS485Timer); HAL_TIM_Base_DeInit(&RS485Timer); HAL_TIM_Base_Init(&RS485Timer); HAL_TIM_Base_Start_IT(&RS485Timer); printf("%d …

5
微控制器中的中断处理和FSM示例
最初的问题 我对微控制器中的中断处理有一个一般性的问题。我正在使用MSP430,但我认为这个问题可能会扩展到其他uC。我想知道是否经常在代码中启用/禁用中断是一种好习惯。我的意思是,如果我有一部分对中断不敏感的代码(或者更糟糕的是,出于某种原因,一定不能监听中断),那么这样做会更好: 在关键部分之前禁用中断,然后在其后重新启用它们。 在相应的ISR中放置一个标志,并(而不是禁用该中断),在关键部分之前将标志设置为false,然后在紧要部分之前将其重置为true。防止执行ISR的代码。 两者都不提供,因此欢迎提出建议! 更新:中断和状态图 我将提供具体情况。让我们假设我们要实现一个状态图,该状态图由4个块组成: 过渡/效果。 退出条件。 进入活动。 做活动。 这就是教授在大学里教给我们的。遵循此方案可能不是最好的方法: while(true) { /* Transitions/Effects */ //---------------------------------------------------------------------- next_state = current_state; switch (current_state) { case STATE_A: if(EVENT1) {next_state = STATE_C} if(d == THRESHOLD) {next_state = STATE_D; a++} break; case STATE_B: // transitions and effects break; (...) } /* Exit activity …

2
STM32F4立方体HAL UART。是错误还是我错过了什么?
我正在使用基于中断的UART IO(无DMA)。 HAL_UART_Transmit_IT功能设置寄存器中的EIE位CR3。根据STM32F407数据表(以及实际行为),这仅在多缓冲区模式下(当DMAR位置1 时)产生中断。EIE使能针对帧错误(FE),溢出错误(ORE),噪声错误(NE)的中断生成。据我了解,此错误仅用于接收。 部分HAL_UART_IRQHandler功能: tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE); tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR); /* UART Over-Run interrupt occurred ----------------------------------------*/ if((tmp1 != RESET) && (tmp2 != RESET)) { __HAL_UART_CLEAR_OREFLAG(huart); huart->ErrorCode |= HAL_UART_ERROR_ORE; } if(huart->ErrorCode != HAL_UART_ERROR_NONE) { /* Set the UART state ready to be able to start again the process …

3
在PIC中使用多个外部中断
我已经将PIC16F877(datasheet)用于多个项目。对于单个外部引脚更改中断,可以使用PORTB0中断。但是现在我需要在一个电路中支持8个独立的外部引脚更改中断。 在数据表中,它说有15个中断PIC16F877,但是我想这些都算在内,包括定时器溢出中断等...在这种情况下没有用。 这是数据表关于INTCON寄存器的内容。 我可以使用bit0进行4个独立的中断RBIF吗?它代表的变化PB7:PB4。如何通过读取中断程序中的端口值来识别哪个引脚发生了变化? 即使我得到以上肯定的答案,我也需要8次中断?当然,我仍然可以使用INTE进行PORTB0更改。然后4 + 1 = 5,其他3个呢?(但是,尽管这8个中断事件都是同一类型,但4 + 1 + 3 = 8事情看起来很难看,不是吗?) 除了监视8个引脚之外,微控制器没有其他繁重的任务。(谈论其他任务时,它必须维护一组单独的计数器变量,并经常向PC串行传输约4个字节) 欢迎任何建议。即使是为了将微控制器更改为更合适的一个(但...不要告诉我不要使用PICs)。

2
确定哪个引脚触发了PCINTn中断?
我是否正确地认为如果有两个引脚引起相同的AVR PCINT中断(例如,由PCINT0或PCINT1引脚引起的PCINT0 向量 -我认为向量和引脚的命名重叠会令人困惑)是确定哪个引脚的唯一方法(s)导致中断是在每次中断后记录其状态,并比较在PCMSKn中启用的所有引脚的先前值和当前值?
9 avr  interrupts  atmel 

4
如何使用Arduino创建计时器中断?
我试图用Arduino创建一个延时中断。我想使用interrupts()函数,因为它是一个内部中断。 示例:假设我想让灯光闪烁,并且只显示中断时间。 有示例代码,但是它使用外部中断(attachInterrupt())。我想继续使用内部中断。

3
如何在Cortex M0的CMSIS中实现中断处理程序?
我有一个LPC1114套件。最近几天,我一直在研究Cortex M0的CMSIS实现,以发现其中的工作方式。到目前为止,我了解了每个寄存器的映射方式以及如何访问它们。但是我仍然不知道如何在其中实现中断。我对CMSIS中的中断所了解的只是在启动文件中提到了一些中断处理程序名称。而且我可以通过简单地使用启动文件中提到的相同名称编写C函数来编写自己的处理程序。令我感到困惑的是,在用户指南中,所有的GPIO都可以用作外部中断源。但是启动文件中仅提及4个PIO中断。所以告诉我: 如何为其他GPIO实现外部中断处理程序? CMSIS中的中断表在哪里映射? NVIC和AVR / PIC中的中断实现之间的主要区别是什么?(除了NVIC可以映射到闪存中的任何位置)
9 arm  interrupts 

2
ATtiny13A-无法使用CTC模式生成软件PWM
我正在尝试使用ATtiny13A制作遥控RGB LED灯。 我知道ATtiny85更适合于此目的,并且我知道我最终可能无法适应整个代码,但是现在我主要关心的是使用CTC模式下的中断生成软件PWM。 我不能在任何其它模式中操作(除了用快速PWM OCR0A作为TOP这基本上是相同的东西),因为我使用的IR接收器的代码需要它产生使用四氯化碳和38 kHz的频率OCR0A=122。 因此,我试图(并且我已经在互联网上看到人们提到了这一点)使用Output Compare A和Output Compare B中断来生成软件PWM。 OCR0A,IR代码也使用,它确定频率,我不在乎。并且OCR0B,确定将用于更改LED颜色的PWM的占空比。 我期待能够通过改变来获得具有0-100%占空比的PWM OCR0B从价值0到OCR0A。这是我对应该发生的事情的理解: 但是实际上是这样的(这是来自Proteus ISIS仿真): 正如您在下面看到的那样,我能够获得大约25%-75%的占空比,但是对于〜0-25%和〜75-100%,波形只是被卡住了并且不会改变。 黄线:硬件PWM 红线:具有固定占空比的软件PWM 绿线:占空比变化的软件PWM 这是我的代码: #ifndef F_CPU #define F_CPU (9600000UL) // 9.6 MHz #endif #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> int main(void) { cli(); TCCR0A = 0x00; // Init to zero TCCR0B = 0x00; …
8 avr  pwm  interrupts  attiny 

5
具有基于级别的中断的意义何在?
无论我在哪里搜索基于级别的中断的实际实现方式,我都发现只有一个建议,即人们已经给出了该中断,即在中断进入ISR后立即将其禁用,这样就不会继续触发它。 我读过的另一件事是,它用于创建循环,即只要存在中断即可为ISR服务,但可以使用whileor do while循环来实现。 级别边缘中断将提供的优势可能是在服务ISR和延迟之间运行主程序的一条指令。我猜。 那么,在理解电平边缘中断时我缺少什么吗? 一个很好的答案是向我展示基于级别的中断的某种实际用法。

4
STM32F303 MCU的中断等待时间
我正在一个涉及STM32 MCU(确切地说是STM32303C-EVAL板上)的项目中,该项目必须响应外部中断。我希望对外部中断的反应尽可能快。我已经从ST网页上修改了一个标准外围设备库示例,并且当前程序仅在PE6的每个连续上升沿切换一个LED: #include "stm32f30x.h" #include "stm32303c_eval.h" EXTI_InitTypeDef EXTI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; static void EXTI9_5_Config(void); int main(void) { /* Initialize LEDs mounted on STM32303C-EVAL board */ STM_EVAL_LEDInit(LED1); /* Configure PE6 in interrupt mode */ EXTI9_5_Config(); /* Infinite loop */ while (1) { } } // Configure PE6 and PD5 in …

6
硬件按钮的中断和采样之间的区别?
我有一个连接到中断的硬件按钮,但是我的问题是它会弹起一点,使按钮按下不可靠。我认为可以通过在主循环中进行采样来解决很多这些问题,但这在技术上感觉是错误的。 中断是否更适合于电路内通信,或者中断也适合于硬件开关?如果可以,我可以使用哪些去抖动技术? 我尝试过保留计时器变量,并根据当前时间,延迟和其他技术对其进行检查。看来跳动是如此之快,没关系。

2
清除STM32中的USART(UART)中断标志?
我正在使用STM32F105通过UART与Linx GPS芯片进行通信。 如果我不使用中断(如果我只是轮询RX标志),那么它将正常工作。但是当尝试使用中断时,我得到了意外的结果。 例如,如果仅使用启用RXNE(“ RX不为空”)中断USART_ITConfig(USARTx, USART_IT_RXNE),则该代码仅应针对该特定事件引导至ISR。但是,中断也会因溢出条件而触发。 至于清除标志,似乎方法取决于标志。为了清除溢出标志(USART_IT_ORE),用户手册说明我应该先读取USARTx_SR寄存器,然后再读取USARTx_DR寄存器。这确实有效;该标志被清除。 还有一个USART_ClearITPendingBit()功能,但是只接受一小部分标志。 有八个可以选择使能的中断源,以及十个不同的标志。 是否有关于如何管理所有这些标志的摘要?

1
启用/禁用PCI中断
我正在实现PCIe驱动程序,我想了解可以在或应该启用/禁用中断的级别。我故意不指定操作系统,因为我认为它应该与任何平台相关。按级别,我的意思是: 操作系统特定的中断处理框架 可以在PCI / PCIe配置空间寄存器(例如COMMAND寄存器)中禁用或启用中断 中断也可以在设备级别屏蔽,例如,我们可以配置设备不触发对主机的某些中断 我知道,无论PCIe使用哪种中断类型(INTx仿真,MSI或MSI-X),都必须将其传递给主机OS。 所以我的问题是-我们实际上是否必须在每个层上启用或禁用中断,还是仅在最接近硬件的位置(例如在相关的PCI寄存器中)才足够?
8 interrupts  bus  pcie 

1
在AVR中断期间,调用堆栈如何操作?
(特定于Arduino Uno ...) 当AVR微控制器上发生中断并调用函数时,堆栈会发生什么?编译器是否内联代码?它是否将堆栈缓存在某个地方,然后重置堆栈指针?它是否仅具有用于中断的辅助堆栈? 据我了解,中断的向量是汇编中的直接GOTO命令。另外,我不认为微控制器会自动弄乱堆栈,因此它可能一个人呆着。但是,这仍然不能解释功能在ISR期间如何工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.