Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2015-08

ARM-embedded & Interrupt numbers

5 messages · 4 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Koenraad Lelong

Hi,

I'm trying to restart my arm-embedded project.
A few years ago I had a working compiler, with some utility-files.

I made a new cross-compiler (fpc svn 31290). But I don't find where the interrupt-numbers of an STM32F103xx processor are defined. So I made an inc-file and added that to e.g.
rtl/embedded/arm/stm32f10x_md.pp, because that's the processor I'm working with.
The inc-file does contain ifdef's for the different STM32F10x processors though, so all stm32F10x files could contain that inc-file.

Is this the way to do it ? Or is there better way ? Or does this exist already ?

Comments please.

If that's a proper way to do this, how could this be included in a next version of fpc ? Do I make a bug-report including the new file, with diffs for the modified files ?
How do I make a proper diff ?

Thanks,

Koenraad.

Code snippet of the interrupt-numbers :

const
   NonMaskableInt_IRQn        = -14; //  2 Non Maskable // interrupt
   HardFault_IRQn              = -13;  //  4 Cortex-M3 Memory Management
// interrupt
   MemoryManagement_IRQn      = -12; //  4 Cortex-M3 Memory Management
// interrupt
   BusFault_IRQn              = -11; //  5 Cortex-M3 Bus Fault //
interrupt
   UsageFault_IRQn            = -10; //  6 Cortex-M3 Usage Fault //
interrupt
   SVCall_IRQn                = -5;   // 11 Cortex-M3 SV Call //
interrupt
   DebugMonitor_IRQn          = -4;   // 12 Cortex-M3 Debug Monitor //
interrupt
   PendSV_IRQn                = -2;   // 14 Cortex-M3 Pend SV //
interrupt
   SysTick_IRQn                = -1;  // 15 Cortex-M3 System Tick //
interrupt
   WWDG_IRQn                  = 0;   //  Window WatchDog // interrupt
   PVD_IRQn                    = 1;    //  PVD through EXTI Line
detection // interrupt
   TAMPER_IRQn                = 2;   //  Tamper // interrupt
   RTC_IRQn                    = 3;    //  RTC global // interrupt
   FLASH_IRQn                  = 4;    //  FLASH global // interrupt
   RCC_IRQn                    = 5;    //  RCC global // interrupt
   EXTI0_IRQn                  = 6;    //  EXTI Line0 // interrupt
   EXTI1_IRQn                  = 7;    //  EXTI Line1 // interrupt
   EXTI2_IRQn                  = 8;    //  EXTI Line2 // interrupt
   EXTI3_IRQn                  = 9;    //  EXTI Line3 // interrupt
   EXTI4_IRQn                  = 10;  // EXTI Line4 // interrupt
   DMA1_Channel1_IRQn          = 11;  // DMA1 Channel 1 global //
interrupt
   DMA1_Channel2_IRQn          = 12;  // DMA1 Channel 2 global //
interrupt
   DMA1_Channel3_IRQn          = 13;  // DMA1 Channel 3 global //
interrupt
   DMA1_Channel4_IRQn          = 14;  // DMA1 Channel 4 global //
interrupt
   DMA1_Channel5_IRQn          = 15;  // DMA1 Channel 5 global //
interrupt
   DMA1_Channel6_IRQn          = 16;  // DMA1 Channel 6 global //
interrupt
   DMA1_Channel7_IRQn          = 17;  // DMA1 Channel 7 global // interrupt
   {$ifdef stm32f10x_ld}
   ADC1_2_IRQn                = 18;   // ADC1 et ADC2 global //
interrupt
   USB_HP_CAN1_TX_IRQn        = 19;   // USB High Priority or CAN1 TX
Interrupts
   USB_LP_CAN1_RX0_IRQn        = 20;  // USB Low Priority or CAN1 RX0
Interrupts
   CAN1_RX1_IRQn              = 21;   // CAN1 RX1 // interrupt
   CAN1_SCE_IRQn              = 22;   // CAN1 SCE // interrupt
   EXTI9_5_IRQn                = 23;  // External Line[9:5] Interrupts
   TIM1_BRK_IRQn              = 24;   // TIM1 Break // interrupt
   TIM1_UP_IRQn                = 25;  // TIM1 Update // interrupt
   TIM1_TRG_COM_IRQn          = 26;   // TIM1 Trigger and Commutation //
interrupt
   TIM1_CC_IRQn                = 27;  // TIM1 Capture Compare //
interrupt
   TIM2_IRQn                  = 28;   // TIM2 global // interrupt
   TIM3_IRQn                  = 29;   // TIM3 global // interrupt
   I2C1_EV_IRQn                = 31;  // I2C1 Event // interrupt
   I2C1_ER_IRQn                = 32;  // I2C1 Error // interrupt
   SPI1_IRQn                  = 35;   // SPI1 global // interrupt
   USART1_IRQn                = 37;   // USART1 global // interrupt
   USART2_IRQn                = 38;   // USART2 global // interrupt
   EXTI15_10_IRQn              = 40;  // External Line[15:10] Interrupts
   RTCAlarm_IRQn              = 41;   // RTC Alarm through EXTI Line //
interrupt
   USBWakeUp_IRQn              = 42;  // USB WakeUp from suspend through
EXTI Line // interrupt
   {$endif}
   {$ifdef STM32F10X_LD_VL}
   ADC1_2_IRQn                = 18;   // ADC1 et ADC2 global //
interrupt
   EXTI9_5_IRQn                = 23;  // External Line[9:5] Interrupts
   TIM1_BRK_IRQn              = 24;   // TIM1 Break // interrupt
   TIM1_UP_IRQn                = 25;  // TIM1 Update // interrupt

....

Marc Santhoff
to Koenraad Lelong

Hi Koenraad,

Koenraad Lelong wrote 9 lines
Is this the way to do it ? Or is there better way ? Or does this exist already ? Comments please. If that's a proper way to do this, how could this be included in a next version of fpc ? Do I make a bug-report including the new file, with diffs for the modified files ? How do I make a proper diff ?

I can't answer your question(s), only want to bring this to your attention:

http://j-software.dk/stm32f103.php

Maybe you can save some work or find answers in that code.

HTH,
Marc

Marc Santhoff
Michael Ring
to Marc Santhoff

Jeppe would be the best person to answer your question anyway as he is the master of (nearly) all files in the embedded directory.

I just checked, when I created my own units for other devices I included those const's, it seems that they never were in Jeppe's files could it be that you saw them in lpc11xx.pp ?
To be honest I was 100% sure that I have seen those declarations in Jeppe's files, but a quick check in svn showed that those consts actually never were there... (or I am blind)

For using Interrupts in your code you do necessarily need them as it is good enough to write procedures with the correct name:

procedure SysTick_interrupt; [public, alias: 'SysTick_interrupt'];
begin
   inc(Systick_Timestamp);
end;

but for configuring interrupts in nvic the constants actually could help.

Michael

Marc Santhoff wrote 23 lines
Hi Koenraad, On Fr, 2015-08-14 at 09:08 +0200, Koenraad Lelong wrote: > Is this the way to do it ? Or is there better way ? Or does this exist > already ? > > Comments please. > > If that's a proper way to do this, how could this be included in a next > version of fpc ? Do I make a bug-report including the new file, with > diffs for the modified files ? > How do I make a proper diff ? I can't answer your question(s), only want to bring this to your attention: http://j-software.dk/stm32f103.php Maybe you can save some work or find answers in that code. HTH, Marc
Jeppe Johansen
to Koenraad Lelong: I'm trying to restart my arm-embedded project. A few years ago I had a working compiler,…
Koenraad Lelong wrote 13 lines
Is this the way to do it ? Or is there better way ? Or does this exist already ? Comments please. If that's a proper way to do this, how could this be included in a next version of fpc ? Do I make a bug-report including the new file, with diffs for the modified files ? How do I make a proper diff ? Thanks, Koenraad.

Hi Koenraad,

For simplicity I think it would be best to just add them to each unit without too many macros.

There's not a clear line for what to include in the RTL units at the moment, but with CMSIS growing more relevant I think it makes sense to have that table of IRQn numbers in there for all Cortex-M devices.

You can either just use SVN to create a patch (there's info here: http://wiki.freepascal.org/Creating_A_Patch), or just send the files to me and I'll fix it up.

Best Regards,
Jeppe

Koenraad Lelong
to Jeppe Johansen

Op 14-08-15 om 14:18 schreef Jeppe Johansen:

Show quoted text 15 lines
Hi Koenraad, For simplicity I think it would be best to just add them to each unit without too many macros. There's not a clear line for what to include in the RTL units at the moment, but with CMSIS growing more relevant I think it makes sense to have that table of IRQn numbers in there for all Cortex-M devices. You can either just use SVN to create a patch (there's info here: http://wiki.freepascal.org/Creating_A_Patch), or just send the files to me and I'll fix it up. Best Regards, Jeppe

Hi,

Sorry it's been a while, but here are the modifications I did and the include file.
That include file is a Pascal version of the stm32f10x.h file from CMSIS 3.5.0.

I hope this will appear in some future FPC-version.

Koenraad.