我使用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溢出时调用哪个函数?
我已经彻底搜索了我正在使用的 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 呢?
涉及哪些步骤?支持文件在哪里?是否建议/值得我这样做?
我有一个程序应该在 MCU(例如 STM32)上定期运行。例如,它应该每 1 毫秒运行一次。如果我编写一个 1ms ISR 并在其中调用我的完整程序,假设它不会超过 1ms,这是一个好方法吗?我可能会遇到什么问题吗?会很精确吗?
我正在研究操作系统,我遇到了术语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)
但这只是挂板.是否有动态方式在运行时分配处理程序?
我有这个代码不起作用的问题.. 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) 测试使用中断的代码,我强迫使用a while(1);尝试保留在中断处理程序中,但是我看到中断处理程序离开并返回到main,因此我假设它具有某种超时。如果是这样,它是ISR所特有的,还是中断的标准功能?
我知道这里有很多关于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)
所以必须在这里挥发吗? …