Initial, enough to flash a led
This commit is contained in:
parent
128511d766
commit
e73f93cd43
|
@ -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;
|
|
@ -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;
|
|
@ -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;
|
|
@ -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;
|
|
@ -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;
|
|
@ -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;
|
|
@ -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;
|
|
@ -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;
|
|
@ -0,0 +1,3 @@
|
|||
package STM32.Registers is
|
||||
pragma Pure;
|
||||
end STM32.Registers;
|
|
@ -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;
|
|
@ -0,0 +1,3 @@
|
|||
package STM32 is
|
||||
pragma Pure;
|
||||
end STM32;
|
|
@ -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;
|
Loading…
Reference in New Issue