Initial, enough to flash a led

This commit is contained in:
Vovanium 2019-01-16 01:46:42 +03:00
parent 128511d766
commit e73f93cd43
14 changed files with 1492 additions and 0 deletions

0
library/.keep Normal file
View File

0
objects/.keep Normal file
View File

View File

@ -0,0 +1,43 @@
with Interfaces;
use Interfaces;
package body STM32.General_Purpose_IO is
package body GPIO_Port_Boolean is
procedure Set(Value: Boolean) is
begin
Register.BSRR := (
BR => 2**Bit,
BS => 2**Bit * Boolean'Pos(Value)
);
end;
function Value return Boolean is
begin
return (Register.IDR and 2**Bit) /= 0;
end;
end GPIO_Port_Boolean;
package body GPIO_Port_Modular is
Size: constant Positive := 1 + Last_Bit - First_Bit;
Mask: constant Unsigned_16 := 2**(Last_Bit + 1) - 2**First_Bit;
procedure Set(Value: Format) is
begin
Register.BSRR := (
BR => Mask,
BS => 2**First_Bit * Unsigned_16(Value)
);
end;
function Value return Format is
begin
return Format((Register.IDR / 2**First_Bit) and (2**Size - 1));
end;
end GPIO_Port_Modular;
end STM32.General_Purpose_IO;

View File

@ -0,0 +1,25 @@
with Interfaces;
with STM32.Registers.GPIO;
package STM32.General_Purpose_IO is
-- Single GPIO pin
generic
Register: in out Registers.GPIO.GPIO_Registers;
Bit: Registers.GPIO.Port_Bit_Number;
package GPIO_Port_Boolean is
procedure Set(Value: Boolean) with Inline; -- Output to port
function Value return Boolean with Inline; -- Read port
end GPIO_Port_Boolean;
-- Multi-pin GPIO
generic
type Format is mod <>;
Register: in out Registers.GPIO.GPIO_Registers;
First_Bit: Registers.GPIO.Port_Bit_Number;
Last_Bit: Registers.GPIO.Port_Bit_NUmber;
package GPIO_Port_Modular is
procedure Set(Value: Format) with Inline;
function Value return Format with Inline;
end GPIO_Port_Modular;
end STM32.General_Purpose_IO;

View File

@ -0,0 +1,47 @@
package STM32.Registers.EXTI is
pragma Preelaborate;
type Event_Number is range 0 .. 22;
package Events is
PVD: constant Event_Number := 16;
RTC_Alarm: constant Event_Number := 17;
USB_OTG_FS_Wakeup: constant Event_Number := 18;
Ethernet_Wakeup: constant Event_Number := 19;
USB_OTG_HS_Wakeup: constant Event_Number := 20;
RTC_Tamper: constant Event_Number := 21;
RTC_Timestamp: constant Event_Number := 21; -- alias for RTC_Tamper
RTC_Wakeup: constant Event_Number := 22;
end Events;
type Event_Array is array (Event_Number) of Boolean
with Pack, Size=>23;
type Event_Set_Register is record
MR: Event_Array;
Reserved_23: Integer range 0 .. 2**9-1;
end record with Size => 32;
for Event_Set_Register use record
MR at 0 range 0 .. 22;
Reserved_23 at 0 range 23 .. 31;
end record;
type EXTI_Registers is record
IMR: Event_Set_Register;
EMR: Event_Set_Register;
RTSR: Event_Set_Register;
FTSR: Event_Set_Register;
SWIER: Event_Set_Register;
PR: Event_Set_Register;
end record;
for EXTI_Registers use record
IMR at 16#00# range 0 .. 31;
EMR at 16#04# range 0 .. 31;
RTSR at 16#08# range 0 .. 31;
FTSR at 16#0C# range 0 .. 31;
SWIER at 16#10# range 0 .. 31;
PR at 16#14# range 0 .. 31;
end record;
end STM32.Registers.EXTI;

View File

@ -0,0 +1,313 @@
with Interfaces;
package STM32.Registers.FSMC is
pragma Pure;
type Memory_Type is (
SRAM,
PSRAM,
NOR_Flash
);
type Memory_Databus_Width is (
Databus_8_bit,
Databus_16_bit
);
for Memory_Databus_Width use (
Databus_8_bit => 2#00#,
Databus_16_bit => 2#01#
);
type CRAM_Page_Size is (
CRAM_No_Burst_Split,
CRAM_Page_128_Bytes,
CRAM_Page_256_Bytes,
CRAM_Page_512_Bytes,
CRAM_Page_1024_Bytes
);
for CRAM_Page_Size use (
CRAM_No_Burst_Split => 2#000#,
CRAM_Page_128_Bytes => 2#001#,
CRAM_Page_256_Bytes => 2#010#,
CRAM_Page_512_Bytes => 2#011#,
CRAM_Page_1024_Bytes => 2#100#
);
type FSMC_BCR is record
MBKEN: Boolean;
MUXEN: Boolean;
MTYP: Memory_Type;
MWID: Memory_Databus_Width;
FACCEN: Boolean;
Reserved_7: Integer range 0 .. 2**1 - 1;
BURSTEN: Boolean;
WAITPOL: Boolean;
WRAPMOD: Boolean;
WAITCFG: Boolean;
WREN: Boolean;
WAITEN: Boolean;
EXTMOD: Boolean;
ASYNCWAIT: Boolean;
CPSIZE: CRAM_Page_Size;
CBURSTRW: Boolean;
Reserved_20: Integer range 0 .. 2**12 - 1;
end record with Size => 32;
for FSMC_BCR use record
MBKEN at 0 range 0 .. 0;
MUXEN at 0 range 1 .. 1;
MTYP at 0 range 2 .. 3;
MWID at 0 range 4 .. 5;
FACCEN at 0 range 6 .. 6;
Reserved_7 at 0 range 7 .. 7;
BURSTEN at 0 range 8 .. 8;
WAITPOL at 0 range 9 .. 9;
WRAPMOD at 0 range 10 .. 10;
WAITCFG at 0 range 11 .. 11;
WREN at 0 range 12 .. 12;
WAITEN at 0 range 13 .. 13;
EXTMOD at 0 range 14 .. 14;
ASYNCWAIT at 0 range 15 .. 15;
CPSIZE at 0 range 16 .. 18;
CBURSTRW at 0 range 19 .. 19;
Reserved_20 at 0 range 20 .. 31;
end record;
type FSMC_Access_Mode is (
Access_Mode_A,
Access_Mode_B,
Access_Mode_C,
Access_Mode_D
);
for FSMC_Access_Mode use (
Access_Mode_A => 0,
Access_Mode_B => 1,
Access_Mode_C => 2,
Access_Mode_D => 3
);
type FSMC_BTR is record
ADDSET: Integer range 0 .. 2**4 - 1; -- Address setup duration
ADDHLD: Integer range 1 .. 2**4 - 1; -- Address hold phase duration
DATAST: Integer range 1 .. 2**8 - 1; -- Data phase duration
BUSTURN: Integer range 0 .. 2**4 - 1; -- Bus turnaround delay
CLKDIV: Integer range 0 .. 2**4 - 1; -- Clock divide ratio (offset by 1)
DATLAT: Integer range 0 .. 2**4 - 1; -- Data latenct (offset by 2)
ACCMOD: FSMC_Access_Mode;
Reserved_30: Integer range 0 .. 2**2 - 1;
end record with Size => 32;
for FSMC_BTR use record
ADDSET at 0 range 0 .. 3;
ADDHLD at 0 range 4 .. 7;
DATAST at 0 range 8 .. 15;
BUSTURN at 0 range 16 .. 19;
CLKDIV at 0 range 20 .. 23;
DATLAT at 0 range 24 .. 27;
ACCMOD at 0 range 28 .. 29;
Reserved_30 at 0 range 30 .. 31;
end record;
type FSMC_BWTR is record
ADDSET: Integer range 0 .. 2**4 - 1;
ADDHLD: Integer range 0 .. 2**4 - 1;
DATAST: Integer range 0 .. 2**8 - 1;
BUSTURN: Integer range 0 .. 2**4 - 1;
Reserved_20: Integer range 0 .. 2**8 - 1;
ACCMOD: Integer range 0 .. 2**2 - 1;
Reserved_30: Integer range 0 .. 2**2 - 1;
end record with Size => 32;
for FSMC_BWTR use record
ADDSET at 0 range 0 .. 3;
ADDHLD at 0 range 4 .. 7;
DATAST at 0 range 8 .. 15;
BUSTURN at 0 range 16 .. 19;
Reserved_20 at 0 range 20 .. 27;
ACCMOD at 0 range 28 .. 29;
Reserved_30 at 0 range 30 .. 31;
end record;
type P_Memory_Type is (
PC_Card,
NAND_Flash
);
for P_Memory_Type use (
PC_Card => 0,
NAND_Flash => 1
);
type ECC_Page_Size is (
ECC_Page_256_Bytes,
ECC_Page_512_Bytes,
ECC_Page_1024_Bytes,
ECC_Page_2048_Bytes,
ECC_Page_4096_Bytes,
ECC_Page_8192_Bytes
);
for ECC_Page_Size use (
ECC_Page_256_Bytes => 2#000#,
ECC_Page_512_Bytes => 2#001#,
ECC_Page_1024_Bytes => 2#010#,
ECC_Page_2048_Bytes => 2#011#,
ECC_Page_4096_Bytes => 2#100#,
ECC_Page_8192_Bytes => 2#101#
);
-- PC Card / NAND flash control registers
type FSMC_PCR is record
Reserved_0: Integer range 0 .. 1;
PWAITEN: Boolean;
PBKEN: Boolean;
PTYP: P_Memory_Type;
PWID: Memory_Databus_Width;
ECCEN: Boolean; -- ECC computation enable
Reserved_7: Integer range 0 .. 2**2 - 1;
TCLR: Integer range 0 .. 2**4 - 1; -- CLE-RE delay (offset by 1)
TAR: Integer range 0 .. 2**4 - 1; -- ALE-RE delay (offset by 1)
ECCPS: ECC_Page_Size;
Reserved_20: Integer range 0 .. 2**12 - 1;
end record with Size => 32;
for FSMC_PCR use record
Reserved_0 at 0 range 0 .. 0;
PWAITEN at 0 range 1 .. 1;
PBKEN at 0 range 2 .. 2;
PTYP at 0 range 3 .. 3;
PWID at 0 range 4 .. 5;
ECCEN at 0 range 6 .. 6;
Reserved_7 at 0 range 7 .. 8;
TCLR at 0 range 9 .. 12;
TAR at 0 range 13 .. 16;
ECCPS at 0 range 17 .. 19;
Reserved_20 at 0 range 20 .. 31;
end record;
type FSMC_SR is record
IRS: Boolean;
ILS: Boolean;
IFS: Boolean;
IREN: Boolean;
ILEN: Boolean;
IFEN: Boolean;
FEMPT: Boolean;
Reserved_7: Integer range 0 .. 2**25 - 1;
end record with Size => 32;
for FSMC_SR use record
IRS at 0 range 0 .. 0;
ILS at 0 range 1 .. 1;
IFS at 0 range 2 .. 2;
IREN at 0 range 3 .. 3;
ILEN at 0 range 4 .. 4;
IFEN at 0 range 5 .. 5;
FEMPT at 0 range 6 .. 6;
Reserved_7 at 0 range 7 .. 31;
end record;
type FSMC_PMEM is record
MEMSET: Integer range 0 .. 2**8 - 1;
MEMWAIT: Integer range 0 .. 2**8 - 1;
MEMHOLD: Integer range 0 .. 2**8 - 1;
MEMHIZ: Integer range 0 .. 2**8 - 1;
end record with Size => 32;
for FSMC_PMEM use record
MEMSET at 0 range 0 .. 7;
MEMWAIT at 0 range 8 .. 15;
MEMHOLD at 0 range 16 .. 23;
MEMHIZ at 0 range 24 .. 31;
end record;
type FSMC_PATT is record
ATTSET: Integer range 0 .. 2**8 - 1;
ATTWAIT: Integer range 0 .. 2**8 - 1;
ATTHOLD: Integer range 0 .. 2**8 - 1;
ATTHIZ: Integer range 0 .. 2**8 - 1;
end record with Size => 32;
for FSMC_PATT use record
ATTSET at 0 range 0 .. 7;
ATTWAIT at 0 range 8 .. 15;
ATTHOLD at 0 range 16 .. 23;
ATTHIZ at 0 range 24 .. 31;
end record;
type FSMC_PIO is record
IOSET: Integer range 0 .. 2**8 - 1;
IOWAIT: Integer range 0 .. 2**8 - 1;
IOHOLD: Integer range 0 .. 2**8 - 1;
IOHIZ: Integer range 0 .. 2**8 - 1;
end record with Size => 32;
for FSMC_PIO use record
IOSET at 0 range 0 .. 7;
IOWAIT at 0 range 8 .. 15;
IOHOLD at 0 range 16 .. 23;
IOHIZ at 0 range 24 .. 31;
end record;
type FSMC_Registers is record
BCR1: FSMC_BCR;
BCR2: FSMC_BCR;
BCR3: FSMC_BCR;
BCR4: FSMC_BCR;
BTR1: FSMC_BTR;
BTR2: FSMC_BTR;
BTR3: FSMC_BTR;
BTR4: FSMC_BTR;
BWTR1: FSMC_BWTR;
BWTR2: FSMC_BWTR;
BWTR3: FSMC_BWTR;
BWTR4: FSMC_BWTR;
PCR2: FSMC_PCR;
PCR3: FSMC_PCR;
PCR4: FSMC_PCR;
SR2: FSMC_SR;
SR3: FSMC_SR;
SR4: FSMC_SR;
PMEM2: FSMC_PMEM;
PMEM3: FSMC_PMEM;
PMEM4: FSMC_PMEM;
PATT2: FSMC_PATT;
PATT3: FSMC_PATT;
PATT4: FSMC_PATT;
PIO4: FSMC_PIO;
ECCR2: Interfaces.Unsigned_32;
ECCR3: Interfaces.Unsigned_32;
end record with Volatile;
for FSMC_Registers use record
BCR1 at 16#0000# range 0 .. 31;
BCR2 at 16#0008# range 0 .. 31;
BCR3 at 16#0010# range 0 .. 31;
BCR4 at 16#0018# range 0 .. 31;
BTR1 at 16#0004# range 0 .. 31;
BTR2 at 16#000C# range 0 .. 31;
BTR3 at 16#0014# range 0 .. 31;
BTR4 at 16#001C# range 0 .. 31;
BWTR1 at 16#0104# range 0 .. 31;
BWTR2 at 16#010C# range 0 .. 31;
BWTR3 at 16#0114# range 0 .. 31;
BWTR4 at 16#011C# range 0 .. 31;
PCR2 at 16#0060# range 0 .. 31;
PCR3 at 16#0080# range 0 .. 31;
PCR4 at 16#00A0# range 0 .. 31;
SR2 at 16#0064# range 0 .. 31;
SR3 at 16#0084# range 0 .. 31;
SR4 at 16#00A4# range 0 .. 31;
PMEM2 at 16#0068# range 0 .. 31;
PMEM3 at 16#0088# range 0 .. 31;
PMEM4 at 16#00A8# range 0 .. 31;
PATT2 at 16#006C# range 0 .. 31;
PATT3 at 16#008C# range 0 .. 31;
PATT4 at 16#00AC# range 0 .. 31;
PIO4 at 16#00B0# range 0 .. 31;
ECCR2 at 16#0074# range 0 .. 31;
ECCR3 at 16#0094# range 0 .. 31;
end record;
end STM32.Registers.FSMC;

View File

@ -0,0 +1,178 @@
with Interfaces;
use Interfaces;
package STM32.Registers.GPIO is
pragma Pure;
subtype Port_Bit_Number is Natural range 0 .. 15;
-- MODER
type Port_Mode is (
Input_Mode,
Output_Mode,
Alternate_Mode,
Analog_mode
) with Size => 2;
for Port_Mode use (
Input_Mode => 2#00#,
Output_Mode => 2#01#,
Alternate_Mode => 2#10#,
Analog_Mode => 2#11#
);
type Port_Mode_Register is array(Port_Bit_Number) of Port_Mode
with Pack, Size => 32;
-- OTYPER
type Output_Type is (
Push_Pull_Type,
Open_Low_Type
) with Size => 1;
for Output_Type use (
Push_Pull_Type => 2#0#,
Open_Low_Type => 2#1#
);
pragma Warnings(Off, "16 bits of ""Output_Type_Register"" unused");
type Output_Type_Register is array(Port_Bit_Number) of Output_Type
with Pack, Size => 32;
pragma Warnings(On, "16 bits of ""Output_Type_Register"" unused");
-- OSPEEDR
type Output_Speed is (
Low_Speed, -- 50pF ---100--- ns
Medium_Speed, -- 50pF 20 10 6 ns
High_Speed, -- 40pF 10 6 4 ns
Very_High_Speed -- 30pF 6 4 2.5ns
) with Size => 2;
for Output_Speed use (
Low_Speed => 2#00#,
Medium_Speed => 2#01#,
High_Speed => 2#10#,
Very_High_Speed => 2#11#
);
type Output_Speed_Register is array(Port_Bit_Number) of Output_Speed
with Pack, Size => 32;
-- PUPDR
type Port_Pull is (
No_Pull,
Pull_Up,
Pull_Down
) with Size => 2;
for Port_Pull use (
No_Pull => 2#00#,
Pull_Up => 2#01#,
Pull_Down => 2#10#
);
type Port_Pull_Register is array(Port_Bit_Number) of Port_Pull
with Pack, Size => 32;
-- BSRR
type Bit_Set_Reset_Register is record
BS: Unsigned_16;
BR: Unsigned_16;
end record with Size => 32;
for Bit_Set_Reset_Register use record
BS at 0 range 0 .. 15;
BR at 0 range 16 .. 31;
end record;
-- LCKR
type Lock_Bit_Array is array (Port_Bit_Number) of Boolean with Pack, Size => 16;
type Configuration_Lock_Register is record
LCK: Lock_Bit_Array;
LCKK: Boolean;
end record with Size => 32;
for Configuration_Lock_Register use record
LCK at 0 range 0 .. 15;
LCKK at 0 range 16 .. 16;
end record;
-- AFRL/AFRH
type Alternate_Function is mod 16;
package Alternate_Functions is
-- AFL constants
SYS : constant Alternate_Function := 0;
TIM1 : constant Alternate_Function := 1;
TIM2 : constant Alternate_Function := 1;
TIM3 : constant Alternate_Function := 2;
TIM4 : constant Alternate_Function := 2;
TIM5 : constant Alternate_Function := 2;
TIM8 : constant Alternate_Function := 3;
TIM9 : constant Alternate_Function := 3;
TIM10 : constant Alternate_Function := 3;
TIM11 : constant Alternate_Function := 3;
I2C1 : constant Alternate_Function := 4;
I2C2 : constant Alternate_Function := 4;
I2C3 : constant Alternate_Function := 4;
SPI1 : constant Alternate_Function := 5;
SPI2 : constant Alternate_Function := 5;
I2S2 : constant Alternate_Function := 5;
I2S2Ext : constant Alternate_Function := 5;
SPI3 : constant Alternate_Function := 6;
I2SExt : constant Alternate_Function := 6;
I2S3 : constant Alternate_Function := 6;
USART1 : constant Alternate_Function := 7;
USART2 : constant Alternate_Function := 7;
USART3 : constant Alternate_Function := 7;
I2S3Ext : constant Alternate_Function := 7;
UART4 : constant Alternate_Function := 8;
UART5 : constant Alternate_Function := 8;
USART6 : constant Alternate_Function := 8;
CAN1 : constant Alternate_Function := 9;
CAN2 : constant Alternate_Function := 9;
TIM12 : constant Alternate_Function := 9;
TIM13 : constant Alternate_Function := 9;
TIM14 : constant Alternate_Function := 9;
OTG_FS : constant Alternate_Function := 10;
OTG_HS : constant Alternate_Function := 10;
ETH : constant Alternate_Function := 11;
FSMC : constant Alternate_Function := 12;
SDIO : constant Alternate_Function := 12;
OTG_FS_B : constant Alternate_Function := 12;
DCMI : constant Alternate_Function := 13;
EVENTOUT : constant Alternate_Function := 15;
end Alternate_Functions;
type Alternate_Function_Register is array (0 .. 15) of Alternate_Function
with Pack, Size => 64;
type GPIO_Registers is record
MODER: Port_Mode_Register;
OTYPER: Output_Type_Register;
OSPEEDR: Output_Speed_Register;
PUPDR: Port_Pull_Register;
IDR: Interfaces.Unsigned_32;
ODR: Interfaces.Unsigned_32;
BSRR: Bit_Set_Reset_Register;
LCKR: Configuration_Lock_Register;
AFR: Alternate_Function_Register;
end record with Volatile;
for GPIO_Registers use record
MODER at 16#00# range 0 .. 31;
OTYPER at 16#04# range 0 .. 31;
OSPEEDR at 16#08# range 0 .. 31;
PUPDR at 16#0C# range 0 .. 31;
IDR at 16#10# range 0 .. 31;
ODR at 16#14# range 0 .. 31;
BSRR at 16#18# range 0 .. 31;
LCKR at 16#1C# range 0 .. 31;
AFR at 16#20# range 0 .. 63;
end record;
end STM32.Registers.GPIO;

View File

@ -0,0 +1,599 @@
with Interfaces;
package STM32.Registers.RCC is
pragma Preelaborate;
-- CR
type Clock_Control_Register is record
HSION: Boolean;
HSIRDY: Boolean;
HSITRIM: Integer range 0 .. 2**5 - 1;
HSICAL: Integer range 0 .. 2**8 - 1;
HSEON: Boolean;
HSERDY: Boolean;
HSEBYP: Boolean;
CSSON: Boolean;
PLLON: Boolean;
PLLRDY: Boolean;
PLLI2SON: Boolean;
PLLI2SRDY: Boolean;
end record with Size => 32;
for Clock_Control_Register use record
HSION at 0 range 0 .. 0;
HSIRDY at 0 range 1 .. 1;
HSITRIM at 0 range 3 .. 7;
HSICAL at 0 range 8 .. 15;
HSEON at 0 range 16 .. 16;
HSERDY at 0 range 17 .. 17;
HSEBYP at 0 range 18 .. 18;
CSSON at 0 range 19 .. 19;
PLLON at 0 range 24 .. 24;
PLLRDY at 0 range 25 .. 25;
PLLI2SON at 0 range 26 .. 26;
PLLI2SRDY at 0 range 27 .. 27;
end record;
--- PLLCFGR
type PLL_Division_Factor is (
PLL_DIV_2,
PLL_DIV_4,
PLL_DIV_6,
PLL_DIV_8
);
for PLL_Division_Factor use (
PLL_DIV_2 => 2#00#,
PLL_DIV_4 => 2#01#,
PLL_DIV_6 => 2#10#,
PLL_DIV_8 => 2#11#
);
type PLL_Clock_Source is (
PLLSRC_HSI,
PLLSRC_HSE
);
for PLL_Clock_Source use (
PLLSRC_HSI => 0,
PLLSRC_HSE => 1
);
type PLL_Configuration_Register is record
PLLM: Integer range 2 .. 63;
PLLN: Integer range 50 .. 432;
PLLP: PLL_Division_Factor;
PLLSRC: PLL_Clock_Source;
PLLQ: Integer range 2 .. 15;
end record with Size => 32;
for PLL_Configuration_Register use record
PLLM at 0 range 0 .. 5;
PLLN at 0 range 6 .. 14;
PLLP at 0 range 16 .. 17;
PLLSRC at 0 range 22 .. 22;
PLLQ at 0 range 24 .. 27;
end record;
-- CFGR
type System_Clock_Switch is (
System_Clock_HSI,
System_Clock_HSE,
System_Clock_PLL
) with Size => 2;
for System_Clock_Switch use (
System_Clock_HSI => 2#00#,
System_Clock_HSE => 2#01#,
System_Clock_PLL => 2#10#
);
type AHB_Prescaler_Factor is (
AHB_Prescaler_1,
AHB_Prescaler_2,
AHB_Prescaler_4,
AHB_Prescaler_8,
AHB_Prescaler_16,
AHB_Prescaler_32,
AHB_Prescaler_64,
AHB_Prescaler_128,
AHB_Prescaler_256
) with Size => 4;
for AHB_Prescaler_Factor use (
AHB_Prescaler_1 => 2#0000#,
AHB_Prescaler_2 => 2#1000#,
AHB_Prescaler_4 => 2#1001#,
AHB_Prescaler_8 => 2#1010#,
AHB_Prescaler_16 => 2#1011#,
AHB_Prescaler_32 => 2#1100#,
AHB_Prescaler_64 => 2#1101#,
AHB_Prescaler_128 => 2#1110#,
AHB_Prescaler_256 => 2#1111#
);
type APB_Prescaler_Factor is (
APB_Prescaler_1,
APB_Prescaler_2,
APB_Prescaler_4,
APB_Prescaler_8,
APB_Prescaler_16
) with Size => 3;
for APB_Prescaler_Factor use (
APB_Prescaler_1 => 2#000#,
APB_Prescaler_2 => 2#100#,
APB_Prescaler_4 => 2#101#,
APB_Prescaler_8 => 2#110#,
APB_Prescaler_16 => 2#111#
);
type Clock_Output_1 is (
Clock_Output_1_HSI,
Clock_Output_1_LSE,
Clock_Output_1_HSE,
Clock_Output_1_PLL
) with Size => 2;
for Clock_Output_1 use (
Clock_Output_1_HSI => 2#00#,
Clock_Output_1_LSE => 2#01#,
Clock_Output_1_HSE => 2#10#,
Clock_Output_1_PLL => 2#11#
);
type I2S_Clock_Source is (
I2S_Clock_PLLI2S,
I2S_Clock_CLKIN
) with Size => 1;
for I2S_Clock_Source use (
I2S_Clock_PLLI2S => 0,
I2S_Clock_CLKIN => 1
);
type Clock_Output_Prescaler_Factor is (
MCO_Prescaler_1,
MCO_Prescaler_2,
MCO_Prescaler_3,
MCO_Prescaler_4,
MCO_Prescaler_5
) with Size => 3;
for Clock_Output_Prescaler_Factor use (
MCO_Prescaler_1 => 2#000#,
MCO_Prescaler_2 => 2#100#,
MCO_Prescaler_3 => 2#101#,
MCO_Prescaler_4 => 2#110#,
MCO_Prescaler_5 => 2#111#
);
type Clock_Output_2 is (
Clock_Output_2_SYSCLK,
Clock_Output_2_PLLI2S,
Clock_Output_2_HSE,
Clock_Output_2_PLL
) with Size => 2;
for Clock_Output_2 use (
Clock_Output_2_SYSCLK => 2#00#,
Clock_Output_2_PLLI2S => 2#01#,
Clock_Output_2_HSE => 2#10#,
Clock_Output_2_PLL => 2#11#
);
type Clock_Configuration_Register is record
SW: System_Clock_Switch;
SWS: System_Clock_Switch;
HPRE: AHB_Prescaler_Factor;
Reserved_8: Integer range 0 .. 3;
PPRE1: APB_Prescaler_Factor;
PPRE2: APB_Prescaler_Factor;
RTCPRE: Integer range 0 .. 31;
MCO1: Clock_Output_1;
I2SSCR: I2S_Clock_Source;
MCO1PRE: Clock_Output_Prescaler_Factor;
MCO2PRE: Clock_Output_Prescaler_Factor;
MCO2: Clock_Output_2;
end record with Size => 32;
for Clock_Configuration_Register use record
SW at 0 range 0 .. 1;
SWS at 0 range 2 .. 3;
HPRE at 0 range 4 .. 7;
Reserved_8 at 0 range 8 .. 9;
PPRE1 at 0 range 10 .. 12;
PPRE2 at 0 range 13 .. 15;
RTCPRE at 0 range 16 .. 20;
MCO1 at 0 range 21 .. 22;
I2SSCR at 0 range 23 .. 23;
MCO1PRE at 0 range 24 .. 26;
MCO2PRE at 0 range 27 .. 29;
MCO2 at 0 range 30 .. 31;
end record;
-- CIR
type Clock_Interrupt_Register is record
LSIRDYF: Boolean;
LSERDYF: Boolean;
HSIRDYF: Boolean;
HSERDYF: Boolean;
PLLRDYF: Boolean;
PLLI2SRDYF: Boolean;
Reserved_6: Integer range 0 .. 1;
CSSF: Boolean;
LSIRDYIE: Boolean;
LSERDYIE: Boolean;
HSIRDYIE: Boolean;
HSERDYIE: Boolean;
PLLRDYIE: Boolean;
PLLI2SRDYIE: Boolean;
Reserved_14: Integer range 0 .. 2**2 - 1;
LSIRDYC: Boolean;
LSERDYC: Boolean;
HSIRDYC: Boolean;
HSERDYC: Boolean;
PLLRDYC: Boolean;
PLLI2SRDYC: Boolean;
Reserved_22: Integer range 0 .. 1;
CSSC: Boolean;
Reserved_24: Integer range 0 .. 2**8 - 1;
end record with Size => 32;
for Clock_Interrupt_Register use record
LSIRDYF at 0 range 0 .. 0;
LSERDYF at 0 range 1 .. 1;
HSIRDYF at 0 range 2 .. 2;
HSERDYF at 0 range 3 .. 3;
PLLRDYF at 0 range 4 .. 4;
PLLI2SRDYF at 0 range 5 .. 5;
Reserved_6 at 0 range 6 .. 6;
CSSF at 0 range 7 .. 7;
LSIRDYIE at 0 range 8 .. 8;
LSERDYIE at 0 range 9 .. 9;
HSIRDYIE at 0 range 10 .. 10;
HSERDYIE at 0 range 11 .. 11;
PLLRDYIE at 0 range 12 .. 12;
PLLI2SRDYIE at 0 range 13 .. 13;
Reserved_14 at 0 range 14 .. 15;
LSIRDYC at 0 range 16 .. 16;
LSERDYC at 0 range 17 .. 17;
HSIRDYC at 0 range 18 .. 18;
HSERDYC at 0 range 19 .. 19;
PLLRDYC at 0 range 20 .. 20;
PLLI2SRDYC at 0 range 21 .. 21;
Reserved_22 at 0 range 22 .. 22;
CSSC at 0 range 23 .. 23;
Reserved_24 at 0 range 24 .. 31;
end record;
-- AHB1RSTR, AHB1ENR
type AHB1_Register is record
GPIOA: Boolean;
GPIOB: Boolean;
GPIOC: Boolean;
GPIOD: Boolean;
GPIOE: Boolean;
GPIOF: Boolean;
GPIOG: Boolean;
GPIOH: Boolean;
GPIOI: Boolean;
CRC: Boolean;
FLITF: Boolean;
SRAM1: Boolean;
SRAM2: Boolean;
BKPSRAM: Boolean;
CCMDATARAM: Boolean;
DMA1: Boolean;
DMA2: Boolean;
ETHMAC: Boolean;
ETHMACTX: Boolean;
ETHMACRX: Boolean;
ETHMACPTP: Boolean;
OTGHS: Boolean;
OTGHSULPI: Boolean;
end record with Size => 32;
for AHB1_Register use record
GPIOA at 0 range 0 .. 0;
GPIOB at 0 range 1 .. 1;
GPIOC at 0 range 2 .. 2;
GPIOD at 0 range 3 .. 3;
GPIOE at 0 range 4 .. 4;
GPIOF at 0 range 5 .. 5;
GPIOG at 0 range 6 .. 6;
GPIOH at 0 range 7 .. 7;
GPIOI at 0 range 8 .. 8;
CRC at 0 range 12 .. 12;
FLITF at 0 range 15 .. 15;
SRAM1 at 0 range 16 .. 16;
SRAM2 at 0 range 17 .. 17;
BKPSRAM at 0 range 18 .. 18;
CCMDATARAM at 0 range 20 .. 20;
DMA1 at 0 range 21 .. 21;
DMA2 at 0 range 22 .. 22;
ETHMAC at 0 range 25 .. 25;
ETHMACTX at 0 range 26 .. 26;
ETHMACRX at 0 range 27 .. 27;
ETHMACPTP at 0 range 28 .. 28;
OTGHS at 0 range 29 .. 29;
OTGHSULPI at 0 range 30 .. 30;
end record;
-- AHB2RSTR, AHB2ENR
type AHB2_Register is record
DCMI: Boolean;
CRYP: Boolean;
HASH: Boolean;
RNG: Boolean;
OTGFS: Boolean;
end record with Size => 32;
for AHB2_Register use record
DCMI at 0 range 0 .. 0;
CRYP at 0 range 4 .. 4;
HASH at 0 range 5 .. 5;
RNG at 0 range 6 .. 6;
OTGFS at 0 range 7 .. 7;
end record;
-- AHB3RSTR, AHB3ENR
type AHB3_Register is record
FSMC: Boolean;
end record with Size => 32;
for AHB3_Register use record
FSMC at 0 range 0 .. 0;
end record;
-- APB1RSTR, APB1ENR
type APB1_Register is record
TIM2: Boolean;
TIM3: Boolean;
TIM4: Boolean;
TIM5: Boolean;
TIM6: Boolean;
TIM7: Boolean;
TIM12: Boolean;
TIM13: Boolean;
TIM14: Boolean;
WWDG: Boolean;
SPI2: Boolean;
SPI3: Boolean;
USART2: Boolean;
USART3: Boolean;
UART4: Boolean;
UART5: Boolean;
I2C1: Boolean;
I2C2: Boolean;
I2C3: Boolean;
CAN1: Boolean;
CAN2: Boolean;
PWR: Boolean;
DAC: Boolean;
end record with Size => 32;
for APB1_Register use record
TIM2 at 0 range 0 .. 0;
TIM3 at 0 range 1 .. 1;
TIM4 at 0 range 2 .. 2;
TIM5 at 0 range 3 .. 3;
TIM6 at 0 range 4 .. 4;
TIM7 at 0 range 5 .. 5;
TIM12 at 0 range 6 .. 6;
TIM13 at 0 range 7 .. 7;
TIM14 at 0 range 8 .. 8;
WWDG at 0 range 11 .. 11;
SPI2 at 0 range 14 .. 14;
SPI3 at 0 range 15 .. 15;
USART2 at 0 range 17 .. 17;
USART3 at 0 range 18 .. 18;
UART4 at 0 range 19 .. 19;
UART5 at 0 range 20 .. 20;
I2C1 at 0 range 21 .. 21;
I2C2 at 0 range 22 .. 22;
I2C3 at 0 range 23 .. 23;
CAN1 at 0 range 25 .. 25;
CAN2 at 0 range 26 .. 26;
PWR at 0 range 28 .. 28;
DAC at 0 range 29 .. 29;
end record;
-- APB2RSTR, APB2ENR
type APB2_Register is record
TIM1: Boolean;
TIM8: Boolean;
USART1: Boolean;
USART6: Boolean;
ADC1: Boolean; -- RST resets all ADCs
ADC2: Boolean;
ADC3: Boolean;
SDIO: Boolean;
SPI1: Boolean;
SYSCFG: Boolean;
TIM9: Boolean;
TIM10: Boolean;
TIM11: Boolean;
end record with Size => 32;
for APB2_Register use record
TIM1 at 0 range 0 .. 0;
TIM8 at 0 range 1 .. 1;
USART1 at 0 range 4 .. 4;
USART6 at 0 range 5 .. 5;
ADC1 at 0 range 8 .. 8;
ADC2 at 0 range 9 .. 9;
ADC3 at 0 range 10 .. 10;
SDIO at 0 range 11 .. 11;
SPI1 at 0 range 12 .. 12;
SYSCFG at 0 range 14 .. 14;
TIM9 at 0 range 16 .. 16;
TIM10 at 0 range 17 .. 17;
TIM11 at 0 range 18 .. 18;
end record;
-- BCDR
type RTC_Clock_Source is (
RTC_Not_Clocked,
RTC_Clock_LSE,
RTC_Clock_LSI,
RTC_Clock_HSE
) with Size => 2;
for RTC_Clock_Source use (
RTC_Not_Clocked => 2#00#,
RTC_Clock_LSE => 2#01#,
RTC_Clock_LSI => 2#10#,
RTC_Clock_HSE => 2#11#
);
type Backup_Domain_Control_Register is record
LSEON: Boolean;
LSERDY: Boolean;
LSEBYP: Boolean;
Reserved_3: Integer range 0 .. 2**5 - 1;
RTCSEL: RTC_Clock_Source;
Reserved_10: Integer range 0 .. 2**5 - 1;
RTCEN: Boolean;
BDRST: Boolean;
Reserved_17: Integer range 0 .. 2**15 - 1;
end record with Size => 32;
for Backup_Domain_Control_Register use record
LSEON at 0 range 0 .. 0;
LSERDY at 0 range 1 .. 1;
LSEBYP at 0 range 2 .. 2;
Reserved_3 at 0 range 3 .. 7;
RTCSEL at 0 range 8 .. 9;
Reserved_10 at 0 range 10 .. 14;
RTCEN at 0 range 15 .. 15;
BDRST at 0 range 16 .. 16;
Reserved_17 at 0 range 17 .. 31;
end record;
-- CSR
type Clock_Control_and_Status_Register is record
LSION: Boolean;
LSIRDY: Boolean;
Reserved_2: Integer range 0 .. 2**22 - 1;
RMVF: Boolean;
BORRSTF: Boolean;
PINRSTF: Boolean;
PORRSTF: Boolean;
SFTRSTF: Boolean;
IWDGRSTF: Boolean;
WWDGRSTF: Boolean;
LPWRRSTF: Boolean;
end record with Size => 32;
for Clock_Control_and_Status_Register use record
LSION at 0 range 0 .. 0;
LSIRDY at 0 range 1 .. 1;
Reserved_2 at 0 range 2 .. 23;
RMVF at 0 range 24 .. 24;
BORRSTF at 0 range 25 .. 25;
PINRSTF at 0 range 26 .. 26;
PORRSTF at 0 range 27 .. 27;
SFTRSTF at 0 range 28 .. 28;
IWDGRSTF at 0 range 29 .. 29;
WWDGRSTF at 0 range 30 .. 30;
LPWRRSTF at 0 range 31 .. 31;
end record;
-- SSCGR
type Spread_Select is (
Center_Spread,
Down_Spread
) with Size => 1;
for Spread_Select use (
Center_Spread => 0,
Down_Spread => 1
);
type Spread_Spectrum_Clock_Generation_Register is record
MODPER: Integer range 0 .. 2**13 - 1;
INCSTEP: Integer range 0 .. 2**15 - 1;
Reserved_28: Integer range 0 .. 3;
SPREADSEL: Spread_Select;
SSCGEN: Boolean;
end record with Size => 32;
for Spread_Spectrum_Clock_Generation_Register use record
MODPER at 0 range 0 .. 12;
INCSTEP at 0 range 13 .. 27;
Reserved_28 at 0 range 28 .. 29;
SPREADSEL at 0 range 30 .. 30;
SSCGEN at 0 range 31 .. 31;
end record;
-- PLLI2SCFGR
type PLLI2S_Configuration_Register is record
Reserved_0: Integer range 0 .. 2**6 - 1;
PLLI2SN: Integer range 2 .. 432;
Reserved_15: Integer range 0 .. 2**13 - 1;
PLLI2SR: Integer range 2 .. 7;
Reserved_31: Integer range 0 .. 1;
end record with Size => 32;
for PLLI2S_Configuration_Register use record
Reserved_0 at 0 range 0 .. 5;
PLLI2SN at 0 range 6 .. 14;
Reserved_15 at 0 range 15 .. 27;
PLLI2SR at 0 range 28 .. 30;
Reserved_31 at 0 range 31 .. 31;
end record;
type RCC_Registers is record
CR: Clock_Control_Register;
PLLCFGR: PLL_Configuration_Register;
CFGR: Clock_Configuration_Register;
CIR: Clock_Interrupt_Register;
AHB1RSTR: AHB1_Register;
AHB2RSTR: AHB2_Register;
AHB3RSTR: AHB3_Register;
APB1RSTR: APB1_Register;
APB2RSTR: APB2_Register;
AHB1ENR: AHB1_Register;
AHB2ENR: AHB2_Register;
AHB3ENR: AHB3_Register;
APB1ENR: APB1_Register;
APB2ENR: APB2_Register;
AHB1LPENR: AHB1_Register;
AHB2LPENR: AHB2_Register;
AHB3LPENR: AHB3_Register;
APB1LPENR: APB1_Register;
APB2LPENR: APB2_Register;
BDCR: Backup_Domain_Control_Register;
CSR: Clock_Control_and_Status_Register;
SSCGR: Spread_Spectrum_Clock_Generation_Register;
PLLI2SCFGR: PLLI2S_Configuration_Register;
end record with Volatile;
for RCC_Registers use record
CR at 16#00# range 0 .. 31;
PLLCFGR at 16#04# range 0 .. 31;
CFGR at 16#08# range 0 .. 31;
CIR at 16#0C# range 0 .. 31;
AHB1RSTR at 16#10# range 0 .. 31;
AHB2RSTR at 16#14# range 0 .. 31;
AHB3RSTR at 16#18# range 0 .. 31;
APB1RSTR at 16#20# range 0 .. 31;
APB2RSTR at 16#24# range 0 .. 31;
AHB1ENR at 16#30# range 0 .. 31;
AHB2ENR at 16#34# range 0 .. 31;
AHB3ENR at 16#38# range 0 .. 31;
APB1ENR at 16#40# range 0 .. 31;
APB2ENR at 16#44# range 0 .. 31;
AHB1LPENR at 16#50# range 0 .. 31;
AHB2LPENR at 16#54# range 0 .. 31;
AHB3LPENR at 16#58# range 0 .. 31;
APB1LPENR at 16#60# range 0 .. 31;
APB2LPENR at 16#64# range 0 .. 31;
BDCR at 16#70# range 0 .. 31;
CSR at 16#74# range 0 .. 31;
SSCGR at 16#80# range 0 .. 31;
PLLI2SCFGR at 16#84# range 0 .. 31;
end record;
end STM32.Registers.RCC;

View File

@ -0,0 +1,70 @@
package STM32.Registers.STM32F4_Map is
pragma Pure;
TIM2: constant := 16#4000_0000#;
TIM3: constant := 16#4000_0400#;
TIM4: constant := 16#4000_0800#;
TIM5: constant := 16#4000_0C00#;
TIM6: constant := 16#4000_1000#;
TIM7: constant := 16#4000_1400#;
TIM12: constant := 16#4000_1800#;
TIM13: constant := 16#4000_1C00#;
TIM14: constant := 16#4000_2000#;
RTC_and_BKP: constant := 16#4000_2800#;
WWDG: constant := 16#4000_2C00#;
IWDG: constant := 16#4000_3000#;
I2S2ext: constant := 16#4000_3400#;
SPI2_I2S2: constant := 16#4000_3800#;
SPI3_I2S3: constant := 16#4000_3C00#;
I2S3ext: constant := 16#4000_4000#;
USART2: constant := 16#4000_4400#;
USART3: constant := 16#4000_4800#;
UART4: constant := 16#4000_4C00#;
UART5: constant := 16#4000_5000#;
I2C1: constant := 16#4000_5400#;
I2C2: constant := 16#4000_5800#;
I2C3: constant := 16#4000_5C00#;
CAN1: constant := 16#4000_6400#;
CAN2: constant := 16#4000_6800#;
PWR: constant := 16#4000_7000#;
DAC: constant := 16#4000_7400#;
TIM1: constant := 16#4001_0000#;
TIM8: constant := 16#4001_0400#;
USART1: constant := 16#4001_1000#;
USART6: constant := 16#4001_1400#;
ADC1_2_3: constant := 16#4001_2000#;
SDIO: constant := 16#4001_2C00#;
SPI1: constant := 16#4001_3000#;
SYSCFG: constant := 16#4001_3800#;
EXTI: constant := 16#4001_3C00#;
TIM9: constant := 16#4001_4000#;
TIM10: constant := 16#4001_4400#;
TIM11: constant := 16#4001_4800#;
GPIOA: constant := 16#4002_0000#;
GPIOB: constant := 16#4002_0400#;
GPIOC: constant := 16#4002_0800#;
GPIOD: constant := 16#4002_0C00#;
GPIOE: constant := 16#4002_1000#;
GPIOF: constant := 16#4002_1400#;
GPIOG: constant := 16#4002_1800#;
GPIOH: constant := 16#4002_1C00#;
GPIOI: constant := 16#4002_2000#;
CRC: constant := 16#4002_3000#;
RCC: constant := 16#4002_3800#;
Flash_IR: constant := 16#4002_3C00#;
BKPSRAM: constant := 16#4002_4000#;
DMA1: constant := 16#4002_6000#;
DMA2: constant := 16#4002_6400#;
Ethernet_MAC:constant := 16#4002_8000#;
USB_OTG_HS: constant := 16#4004_0000#;
USB_OTG_FS: constant := 16#5000_0000#;
DCMI: constant := 16#5005_0000#;
RNG: constant := 16#5006_0800#;
FSMC_Bank1: constant := 16#6000_0000#;
FSMC_Bank2: constant := 16#7000_0000#;
FSMC_Bank3: constant := 16#8000_0000#;
FSMC_Bank4: constant := 16#9000_0000#;
FSMC: constant := 16#A000_0000#;
end STM32.Registers.STM32F4_Map;

View File

@ -0,0 +1,136 @@
package STM32.Registers.SysCfg is
pragma Pure;
type Memory_Mapping is (
Main_Flash,
System_Flash,
FSMC_Bank_1,
Embedded_SRAM
);
for Memory_Mapping use (
Main_Flash => 2#00#,
System_Flash => 2#01#,
FSMC_Bank_1 => 2#10#,
Embedded_SRAM => 2#11#
);
type Memory_Remap_Register is record
MEM_MODE: Memory_Mapping;
Reserved_2: Integer range 0 .. 2**30 - 1;
end record with Size => 32;
for Memory_Remap_Register use record
MEM_MODE at 0 range 0 .. 1;
Reserved_2 at 0 range 2 .. 31;
end record;
type Ethernet_Phy_Interface is (
MII,
RMII
);
for Ethernet_Phy_Interface use (
MII => 0,
RMII => 1
);
type Peripherial_Mode_Register is record
Reserved_0: Integer range 0 .. 2**23 - 1;
MII_RMII_SEL: Ethernet_Phy_Interface;
Reserved_24: Integer range 0 .. 2**8 - 1;
end record with Size => 32;
for Peripherial_Mode_Register use record
Reserved_0 at 0 range 0 .. 22;
MII_RMII_SEL at 0 range 23 .. 23;
Reserved_24 at 0 range 24 .. 31;
end record;
type Peripherial_Interrupt_Pin is (
PA_Pin, PB_Pin, PC_Pin, PD_Pin,
PE_Pin, PF_Pin, PG_Pin, PH_Pin,
PI_Pin
);
for Peripherial_Interrupt_Pin use (
PA_Pin => 2#0000#, PB_Pin => 2#0001#,
PC_Pin => 2#0010#, PD_Pin => 2#0011#,
PE_Pin => 2#0100#, PF_Pin => 2#0101#,
PG_Pin => 2#0110#, PH_Pin => 2#0111#,
PI_Pin => 2#1000#
);
generic
Base: Integer;
package External_Interrupt_Configuration is
type Configuration_Array is
array (Base .. Base+3) of Peripherial_Interrupt_Pin with Pack, Size => 16;
type Register is record
EXTI: Configuration_Array;
Reserved_16: Integer range 0 .. 2**16 - 1;
end record with Size => 32;
for Register use record
EXTI at 0 range 0 .. 15;
Reserved_16 at 0 range 16 .. 31;
end record;
end External_Interrupt_Configuration;
package External_Interrupt_Configuration_1 is
new External_Interrupt_Configuration(0);
package External_Interrupt_Configuration_2 is
new External_Interrupt_Configuration(4);
package External_Interrupt_Configuration_3 is
new External_Interrupt_Configuration(8);
package External_Interrupt_Configuration_4 is
new External_Interrupt_Configuration(12);
type Compensation_Cell_Power_Down_Mode is (
Compensation_Cell_Power_Down,
Compensation_Cell_Enabled
);
for Compensation_Cell_Power_Down_Mode use (
Compensation_Cell_Power_Down => 0,
Compensation_Cell_Enabled => 1
);
type Compensation_Cell_Control_Register is record
CMP_PD: Compensation_Cell_Power_Down_Mode;
Reserved_1: Integer range 0 .. 2**7 - 1;
READY: Boolean;
Reserved_9: Integer range 0 .. 2**23 - 1;
end record with Size => 32;
for Compensation_Cell_Control_Register use record
CMP_PD at 0 range 0 .. 0;
Reserved_1 at 0 range 1 .. 7;
READY at 0 range 8 .. 8;
Reserved_9 at 0 range 9 .. 31;
end record;
type SYSCFG_Registers is record
MEMRMP: Memory_Remap_Register;
PMC: Peripherial_Mode_Register;
EXTICR1: External_Interrupt_Configuration_1.Register;
EXTICR2: External_Interrupt_Configuration_2.Register;
EXTICR3: External_Interrupt_Configuration_3.Register;
EXTICR4: External_Interrupt_Configuration_4.Register;
CMPCR: Compensation_Cell_Control_Register;
end record;
for SYSCFG_Registers use record
MEMRMP at 16#00# range 0 .. 31;
PMC at 16#04# range 0 .. 31;
EXTICR1 at 16#08# range 0 .. 31;
EXTICR2 at 16#0C# range 0 .. 31;
EXTICR3 at 16#10# range 0 .. 31;
EXTICR4 at 16#14# range 0 .. 31;
CMPCR at 16#20# range 0 .. 31;
end record;
end STM32.Registers.SysCfg;

View File

@ -0,0 +1,3 @@
package STM32.Registers is
pragma Pure;
end STM32.Registers;

View File

@ -0,0 +1,58 @@
with System;
with STM32.Registers.GPIO;
with STM32.Registers.RCC;
with STM32.Registers.EXTI;
with STM32.Registers.SYSCFG;
with STM32.Registers.FSMC;
with STM32.Registers.STM32F4_Map;
package STM32.STM32F407Z is
pragma Preelaborate;
--pragma Warnings (Off, "* may call Last_Chance_Handler");
--pragma Warnings (Off, "* may be incompatible with alignment of object");
EXTI: Registers.EXTI.EXTI_Registers
with Volatile, Import,
Address => System'To_Address(Registers.STM32F4_Map.EXTI);
FSMC: Registers.FSMC.FSMC_Registers
with Volatile, Import,
Address => System'To_Address(Registers.STM32F4_Map.FSMC);
GPIOA: Registers.GPIO.GPIO_Registers
with Volatile, Import,
Address => System'To_Address(Registers.STM32F4_Map.GPIOA);
GPIOC: Registers.GPIO.GPIO_Registers
with Volatile, Import,
Address => System'To_Address(Registers.STM32F4_Map.GPIOC);
GPIOD: Registers.GPIO.GPIO_Registers
with Volatile, Import,
Address => System'To_Address(Registers.STM32F4_Map.GPIOD);
GPIOE: Registers.GPIO.GPIO_Registers
with Volatile, Import,
Address => System'To_Address(Registers.STM32F4_Map.GPIOE);
GPIOF: Registers.GPIO.GPIO_Registers
with Volatile, Import,
Address => System'To_Address(Registers.STM32F4_Map.GPIOF);
GPIOG: Registers.GPIO.GPIO_Registers
with Volatile, Import,
Address => System'To_Address(Registers.STM32F4_Map.GPIOG);
RCC: Registers.RCC.RCC_Registers
with Volatile, Import,
Address => System'To_Address(Registers.STM32F4_Map.RCC);
SYSCFG: Registers.SYSCFG.SYSCFG_Registers
with Volatile, Import,
Address => System'To_Address(Registers.STM32F4_Map.SYSCFG);
--pragma Warnings (On, "* may call Last_Chance_Handler");
--pragma Warnings (On, "* may be incompatible with alignment of object");
end STM32.STM32F407Z;

3
source/stm32.ads Normal file
View File

@ -0,0 +1,3 @@
package STM32 is
pragma Pure;
end STM32;

17
stm32_library.gpr Normal file
View File

@ -0,0 +1,17 @@
project STM32_Library is
for Source_Dirs use ("source");
for Object_Dir use "objects";
for Library_Dir use "library";
for Library_Name use "stm32";
for Library_Kind use "static";
--for Library_Interface use ("STM32", "STM32.STM32F407Z");
for Target use "arm-eabi";
--for Runtime("ada") use "ravenscar-sfp-stm32f4";
package Builder is
for Default_Switches("Ada") use (
"-gnato",
"-O2",
"-gnatW8"
);
end Builder;
end STM32_Library;