basic scheduling, basic syscall, (added .data copy)
[cortex-from-scratch] / include / sys / mmap.h
1 /* (CC-BY-NC-SA) ROBIN KRENS - ROBIN @ ROBINKRENS.NL
2  * 
3  * $LOG$
4  * 2019/7/20 - ROBIN KRENS      
5  * Initial version 
6  * 
7  * $DESCRIPTION$
8  * Memory map for the Cortex-M3
9  * Implementations vary among manufacturers. This one is
10  * a STM32F013RC6. Addresses of peripherals vary amongst 
11  * manufacturers of boards with similar chips
12  *
13  * $USAGE$
14  * These are volatile memory addresses of 32 bit. The macro's
15  * MEM_VALUE and MEM_ADDR should used.
16  * In case you want to use a address on the lside of a assigment
17  * use volatile uint32_t * p = MEM_ADDR(0x20000000); 
18  *
19  * */
20
21 #define OWRITE  0x01
22 #define SETBIT  0x02
23 #define CLRBIT  0x03
24
25 /* 64kB SRAM located at SRAM_OFFSET */
26 #define SRAM_SIZE       0x00010000 
27 #define SRAM_OFFSET     0x20000000
28
29 /* TODO #define KHEAP_SIZE      0x100 */
30
31 /* Safety macro's to get the address or value */
32 #define MEM_VALUE(addr) *((volatile uint32_t(*) (addr))
33 #define MEM_ADDR(addr) ((volatile uint32_t *) (addr))
34 #define HW_ADDR(addr) (*((volatile unsigned long *)(addr)))
35
36 /* SYSTEM INFO AND DEBUG */
37 #define MCU_ID MEM_ADDR(0xE000ED00) 
38 #define FLASH_MEM MEM_ADDR(0x1FFFF000)
39
40 /* MEMORY PROTECTION UNIT */
41 #define MPU_TYPER MEM_ADDR(0xE000ED90)
42 #define MPU_CR MEM_ADDR(0xE000ED94)
43 #define MPU_RNR MEM_ADDR(0xE000ED98)
44 #define MPU_RBAR MEM_ADDR(0xE000ED9C)
45
46 /* POWER CONTROL REGISTERS */
47 #define PWR_CR MEM_ADDR(0x40007000)
48
49 /* SYSTEM CONTROL BLOCK REGISTER */
50 #define SCB_VTOR MEM_ADDR(0xE000ED08) // VECTOR TABLE
51 #define SCB_ICSR MEM_ADDR(0xE000ED04) // STATUS OF VECTOR
52 #define SCB_CCR MEM_ADDR(0xE000ED14) // SET SOFTWARE TRAPS
53 #define SCB_SHCSR MEM_ADDR(0xE000ED24) // ENABLE VARIOUS FAULTS EXCEPTIONS
54 #define SCB_CFSR MEM_ADDR(0xE000ED28) // GEN. USAGE FAULT STATUS REGISTER
55 #define SCB_HFSR MEM_ADDR(0xE000ED2C) // HARD FAULT STATUS REGISTER
56 #define SCB_BFAR MEM_ADDR(0xE000ED38) // BUS FAULT ADDRESS REGISTER
57
58 /* NESTED VECTOR INTERRUPT CONTROL REGISTER */
59 #define NVIC_ISER0 MEM_ADDR(0xE000E100) // interrupt set enable register
60 #define NVIC_ISER1 MEM_ADDR(0xE000E104) // interrupt set enable register
61 #define NVIC_ISER2 MEM_ADDR(0xE000E108) // interrupt set enable register
62 #define NVIC_STIR MEM_ADDR(0xE000EF00) // Software trigger interrupt
63
64 /* SYSTICK REGISTER */
65 #define STK_CTRL MEM_ADDR(0xE000E010)
66 #define STK_RELOAD MEM_ADDR(0xE000E014)
67 #define STK_CALIB MEM_ADDR(0xE000E01C)
68
69 /* RESET AND CLOCK REGISTER */
70 #define RCC_CR MEM_ADDR(0x40021000)
71 #define RCC_CFGR MEM_ADDR(0x40021004)
72 #define RCC_BDCR MEM_ADDR(0x40021020)
73
74 /* SYSTEM CONTROL REGISTER */
75 #define SYSCTRL_RCC MEM_ADDR(0x40021000)
76 #define RCC_AHBENR MEM_ADDR(0x40021014) // enable DMA1
77 #define RCC_APB1ENR MEM_ADDR(0x4002101C) // register to enable I2C
78 #define RCC_APB1RSTR MEM_ADDR(0x40021010) // register to reset I2C
79 #define RCC_APB2ENR MEM_ADDR(0x40021018) // register to enable USART1
80
81 #define SYSCTRL_RIS MEM_ADDR(0x400FE050)
82 #define SYSCTRL_RCGC1 MEM_ADDR(0x400FE104)
83 #define SYSCTRL_RCGC2 MEM_ADDR(0x400FE108)
84 #define GPIOPA_AFSEL MEM_ADDR(0x40004420)
85
86 #define GPIOA_CRH MEM_ADDR(0x40010804) // for USART1
87 #define GPIOA_CRL MEM_ADDR(0x40010800) // for ADC1
88 #define GPIOA_ODR MEM_ADDR(0x4001080C)
89 #define GPIOB_CRL MEM_ADDR(0x40010C00) // low register (!) for I2C1
90 #define GPIOB_CRH MEM_ADDR(0x40010C04) // high register for SPI2
91 #define GPIOB_BSRR MEM_ADDR(0x40010C10)
92 #define GPIOB_ODR MEM_ADDR(0x40010C0C)
93 #define GPIOB_IDR MEM_ADDR(0x40010C08)
94 #define GPIOC_CRL MEM_ADDR(0x40011000) // SPI2 uses D/CX (A0) 
95 #define GPIOC_CRH MEM_ADDR(0x40011004) 
96 #define GPIOC_ODR MEM_ADDR(0x4001100C)
97
98 #define GPIOD_CRL MEM_ADDR(0x40011400)
99 #define GPIOD_ODR MEM_ADDR(0x4001140C)
100
101 #define AFIO_EVCR MEM_ADDR(0x40010000)
102
103 /* I2C REGISTERS */
104 #define I2C_CR1 MEM_ADDR(0x40005400)
105 #define I2C_CR2 MEM_ADDR(0x40005404)
106 #define I2C_DR MEM_ADDR(0x40005410)
107 #define I2C_SR1 MEM_ADDR(0x40005414)
108 #define I2C_SR2 MEM_ADDR(0x40005418)
109 #define I2C_CCR MEM_ADDR(0x4000541C)
110 #define I2C_TRISE MEM_ADDR(0x40005420)
111
112 /* SPI2 REGISTERS */
113 #define SPI2_CR1 MEM_ADDR(0x40003800)
114 #define SPI2_CR2 MEM_ADDR(0x40003804)
115 #define SPI2_SR MEM_ADDR(0x40003808)
116 #define SPI2_DR MEM_ADDR(0x4000380C)
117 #define SPI2_CFGR MEM_ADDR(0x4000381C)
118 #define SPI2_PR MEM_ADDR(0x40003820)
119
120 /* EXTERNAL INTERRUPTS */
121 #define EXTI_IMR MEM_ADDR(0x40010400)
122 #define EXTI_RTSR MEM_ADDR(0x40010408)
123
124 /* UART1 REGISTERS */
125 #define USART1_BASE MEM_ADDR(0x40013800)
126 #define USART1_SR MEM_ADDR(0x40013800)
127 #define USART1_DR MEM_ADDR(0x40013804)
128 #define USART1_BRR MEM_ADDR(0x40013808)
129 #define USART1_CR1 MEM_ADDR(0x4001380C)
130 #define USART1_CR2 MEM_ADDR(0x40013810)
131 #define USART1_CR3 MEM_ADDR(0x40013814)
132
133 /* REAL TIME CLOCK REGISTERS */
134 #define RTC_CRH MEM_ADDR(0x40002800) // interrupts
135 #define RTC_CRL MEM_ADDR(0x40002804)
136 #define RTC_PRLL MEM_ADDR(0x4000280C)
137 #define RTC_CNTH MEM_ADDR(0x40002818)
138 #define RTC_CNTL MEM_ADDR(0x4000281C)
139 /* BACKUP (CALIBR) REGISTERS */
140 #define BKP_RTCCR MEM_ADDR(0x40006C2C) // RTC Calibration 
141
142 /* TIMERS */
143 #define TIM4_CR1 MEM_ADDR(0x40000800)
144 #define TIM4_RCR MEM_ADDR(0x40000830)
145 #define TIM4_ARR MEM_ADDR(0x4000082C)
146 #define TIM4_EGR MEM_ADDR(0x40000814)
147 #define TIM4_SR1 MEM_ADDR(0x40000810)
148 #define TIM4_CCR1 MEM_ADDR(0x40000834)
149 #define TIM4_CCR2 MEM_ADDR(0x40000838)
150 #define TIM4_PSC MEM_ADDR(0x40000828)
151 #define TIM4_SMCR MEM_ADDR(0x40000808)
152 #define TIM4_CCER MEM_ADDR(0x40000820)
153 //#define TIM1_BDTR MEM_ADDR(0x40000844)
154 #define TIM4_CCMR1 MEM_ADDR(0x40000818)
155 #define TIM4_DIER MEM_ADDR(0x4000080C)
156
157 /* ANALOG TO DIGITAL CONVERSION 
158  * (ADC1) */
159 #define ADC1_SR1 MEM_ADDR(0x40012400)
160 #define ADC1_CR1 MEM_ADDR(0x40012404)
161 #define ADC1_CR2 MEM_ADDR(0x40012408)
162 #define ADC1_SMPR2 MEM_ADDR(0x40012410)
163 #define ADC1_HTR MEM_ADDR(0x40012424)
164 #define ADC1_LTR MEM_ADDR(0x40012428)
165 #define ADC1_SQR1 MEM_ADDR(0x4001242C)
166 #define ADC1_SQR3 MEM_ADDR(0x40012434)
167 #define ADC1_DR MEM_ADDR(0x4001244C)
168
169 /* DMA1 Channel 1 */
170 #define DMA_IFCR MEM_ADDR(0x40020004)
171 #define DMA_CCR1 MEM_ADDR(0x40020008)
172 #define DMA_CPAR1 MEM_ADDR(0x40020010)
173 #define DMA_CMAR1 MEM_ADDR(0x40020014)
174 #define DMA_CNDTR1 MEM_ADDR(0x4002000C)
175
176
177