标签: isr

如何在sw4stm32中启用中断功能

我使用SW4STM32工具链,我想在STM32103RET中溢出时使用timer2来领导LED,这是我打开LED的功能。

void TurnOnLed(){
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET);
}

void TurnOffLed()
{
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET);
}
Run Code Online (Sandbox Code Playgroud)

由stm32多维数据集mx设置了timer2初始化,但是我不知道当timer2溢出时调用哪个函数?

timer interrupt stm32 isr

2
推荐指数
1
解决办法
5925
查看次数

在 STM32 上编程 NVIC(无库)

我已经彻底搜索了我正在使用的 STM32F4 MCU 的数据表和用户手册(包括用于 STM32F4xx MCU 的 PM0214)以及关于一般 MCU 的在线信息,以了解如何在没有库的情况下进行编程中断......但无济于事。NVIC 是否与硬件如此紧密地联系在一起,以至于在没有某种库的情况下对中断进行编程并为函数指定 ISR 地址和首字母缩略词在当今是不切实际的?在每篇文章和文档中,我都会看到类似的内容:

NVIC_EnableIRQ(IRQn_Type IRQn)
NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
Run Code Online (Sandbox Code Playgroud)

但是如果有人出于学习目的想从头开始编写 ISR 呢?

涉及哪些步骤?支持文件在哪里?是否建议/值得我这样做?

embedded interrupt stm32 isr

2
推荐指数
1
解决办法
1271
查看次数

在 ISR 中计算整个程序有什么问题吗?

我有一个程序应该在 MCU(例如 STM32)上定期运行。例如,它应该每 1 毫秒运行一次。如果我编写一个 1ms ISR 并在其中调用我的完整程序,假设它不会超过 1ms,这是一个好方法吗?我可能会遇到什么问题吗?会很精确吗?

embedded microcontroller stm32 isr

2
推荐指数
1
解决办法
133
查看次数

ISR和中断处理程序之间有区别吗?

我正在研究操作系统,我遇到了术语ISR和中断处理程序.它们是同一机制的两个词吗?如果没有,有什么区别?

c operating-system isr interrupt-handling

1
推荐指数
2
解决办法
2318
查看次数

是否可以在运行时在M0 +上设置ISR处理程序

我的SAMD21 ARM M0 +有一个"默认"resetVectors.c文件.它有一些看起来像:

__attribute__ ((section(".vectors")))
const DeviceVectors exception_table = {
    ...
};
Run Code Online (Sandbox Code Playgroud)

在其中定义不同的处理程序存根的位置.出于测试目的,我想使用其中一个未使用的外设IRQ.

默认情况下,未使用的设置为NULL地址.我已向自己证明我可以修改该文件,并在编译时更改我未使用的IRQ(21)以触发处理程序.但是,是否可以在编译时间之外完成此操作?

我观察到该表似乎是基于偏移0.所以我尝试了这个:

DeviceVectors *table = 0x0000000;
table->pvReserved21 = PV21Handler;
Run Code Online (Sandbox Code Playgroud)

但这只是挂板.是否有动态方式在运行时分配处理程序?

c embedded arm isr

1
推荐指数
1
解决办法
197
查看次数

在ISR结束时使用reti()

我有这个代码不起作用的问题.. ISR正在工作..我在其他代码中测试了它的闪烁..

但是要将x ++放在ISR中并在main()函数中读取X,它永远不会闪烁...

我不熟悉asm我认为这是编译器optomization所以我把变量挥发,但它没有工作..

#define F_CPU 16000000UL

#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>

volatile static uint8_t x = 1;

ISR( TIMER0_OVF_vect )
{
    x++;
    reti();
}

int main(void)
{

    /* Replace with your application code */
    DDRB = DDRB | 0B00100000 ; // pinMode(13,OUTPUT);
    TCCR0A = 0;
    TCCR0B = (1 << CS00 ) | (1 << CS02 ); //1024 prescaler
    TIMSK0 |= 1 << TOIE0 ;
    sei();

    while (1) 
    {

        if (x  >= 61) //never happens ? 
        {
            PORTB …
Run Code Online (Sandbox Code Playgroud)

c microcontroller avr isr atmelstudio

1
推荐指数
1
解决办法
431
查看次数

中断处理程序是否有超时?

测试使用中断的代码,我强迫使用a while(1);尝试保留在中断处理程序中,但是我看到中断处理程序离开并返回到main,因此我假设它具有某种超时。如果是这样,它是ISR所特有的,还是中断的标准功能?

c interrupt isr interrupt-handling

0
推荐指数
1
解决办法
73
查看次数

易失性使用,变量未读取主要内容

我知道这里有很多关于volatile的问题,但是我没有找到任何特定于这种情况的东西.我正在使用微控制器.我知道当我在ISR中修改一个全局变量并在我的main函数中读取它时,我必须使用volatile限定符.我也觉得非常适合记忆障碍,比赛条件等.

但是如果我只在主函数中写入一个全局变量(中断被禁用以强制执行原子写入)并且我正在我的ISR中读取和写入它.

为了给出一个明确的例子假设这个代码:

int state = 0;
ISR()
{
    switch(state)
    {
        case 0:
            //do something
            state=nextState; //go to another state
            break;
        case 1:
            //do something
            state=nextState; //go to another state
            break;
        case 2:
            //do something
            state=nextState; //go to another state
            break;
        //...some more states
        default:
            state=0;
            break;
    }
}

main(void)
{
     while(true)
     {
          //do lots of stuff
          if(someCondition)
          {
               EnterCriticalSection(); //Disable IRQs and memorybarrier
               //write to global shared variable state here!!!
               state=0;
               ExitCriticalSection(); //Enable IRQs again
          }
     }
}
Run Code Online (Sandbox Code Playgroud)

所以必须在这里挥发吗? …

c embedded volatile isr

-1
推荐指数
1
解决办法
123
查看次数