source: azure_iot_hub_f767zi/trunk/asp_baseplatform/target/stm32f767nucleo144_gcc/target_inithook.c@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 21.1 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2008-2011 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2015-2016 by 3rd Designing Center
9 * Imageing System Development Division RICOH COMPANY, LTD.
10 * Copyright (C) 2017-2019 by TOPPERS PROJECT Educational Working Group.
11 *
12 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * と.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * 報告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
32 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
33 * 免責すること.
34 *
35 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
36 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
37 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
38 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
39 * の責任を負わない.
40 *
41 * @(#) $Id$
42 */
43
44#include <sil.h>
45#include "target_syssvc.h"
46
47/*
48 * 初期化プログラム(stm32f767-nucleo144用)
49 */
50
51#define PLL_M (HSE_VALUE / 1000000)/* Possible value 0 and 63 */
52#define PLL_N 432
53#define PLL_Q 9
54#define PLL_R 7
55
56/*
57 * TIMEOUT VALUES
58 */
59#define CLOCKSWITCH_TIMEOUT_VALUE (5000*1000) /* 5秒 */
60#define HSE_TIMEOUT_VALUE (5000*1000) /* 5秒 */
61#define PLL_TIMEOUT_VALUE (100*1000) /* 100 ms */
62#define PLLSAI_TIMEOUT_VALUE (100*1000) /* 100 ms */
63#define PWR_OVERDRIVE_TIMEOUT_VALUE (1000*1000) /* 1秒 */
64
65/*
66 * RCC_PLLP_Clock_Divider PLLP Clock Divider
67 */
68#define RCC_PLLP_DIV2 0x00000002
69#define RCC_PLLP_DIV4 0x00000004
70#define RCC_PLLP_DIV6 0x00000006
71#define RCC_PLLP_DIV8 0x00000008
72
73/*
74 * RCC_APB1_APB2_Clock_Source RCC APB1/APB2 Clock Source
75 */
76#define RCC_HCLK_DIV1 RCC_CFGR_PPRE1_DIV1
77#define RCC_HCLK_DIV2 RCC_CFGR_PPRE1_DIV2
78#define RCC_HCLK_DIV4 RCC_CFGR_PPRE1_DIV4
79#define RCC_HCLK_DIV8 RCC_CFGR_PPRE1_DIV8
80#define RCC_HCLK_DIV16 RCC_CFGR_PPRE1_DIV16
81
82/*
83 * RCC_AHB_Clock_Source RCC AHB Clock Source
84 */
85#define RCC_SYSCLK_DIV1 RCC_CFGR_HPRE_DIV1
86#define RCC_SYSCLK_DIV2 RCC_CFGR_HPRE_DIV2
87#define RCC_SYSCLK_DIV4 RCC_CFGR_HPRE_DIV4
88#define RCC_SYSCLK_DIV8 RCC_CFGR_HPRE_DIV8
89#define RCC_SYSCLK_DIV16 RCC_CFGR_HPRE_DIV16
90#define RCC_SYSCLK_DIV64 RCC_CFGR_HPRE_DIV64
91#define RCC_SYSCLK_DIV128 RCC_CFGR_HPRE_DIV128
92#define RCC_SYSCLK_DIV256 RCC_CFGR_HPRE_DIV256
93#define RCC_SYSCLK_DIV512 RCC_CFGR_HPRE_DIV512
94
95#define RCC_CLK48SOURCE_PLL 0x00000000
96#define RCC_CLK48SOURCE_PLLSAIP RCC_DCKCFGR2_CK48MSEL
97
98#define RCC_PLLSAIP_DIV8 0x00000003
99
100/*
101 * CORTEX MPU領域許可禁止
102 */
103#define MPU_REGION_ENABLE 0x01
104#define MPU_REGION_DISABLE 0x00
105
106/*
107 * CORTEX MPU インストラクションアクセス許可禁止
108 */
109#define MPU_INSTRUCTION_ACCESS_ENABLE 0x00
110#define MPU_INSTRUCTION_ACCESS_DISABLE 0x01
111
112/*
113 * CORTEX MPU インストラクションアクセスキャッシュ設定
114 */
115#define MPU_ACCESS_CACHEABLE 0x01
116#define MPU_ACCESS_NOT_CACHEABLE 0x00
117
118/*
119 * CORTEX MPU インストラクションアクセスバッファ設定
120 */
121#define MPU_ACCESS_BUFFERABLE 0x01
122#define MPU_ACCESS_NOT_BUFFERABLE 0x00
123
124/*
125 * CORTEX MPU インストラクションアクセス共有設定
126 */
127#define MPU_ACCESS_SHAREABLE 0x01
128#define MPU_ACCESS_NOT_SHAREABLE 0x00
129
130/*
131 * GPIOアウトプット設定パラメータ
132 */
133#define GPIO_OTYPE_PP 0x0
134#define GPIO_OTYPE_OD 0x1
135
136/*
137 * GPIOプルアップダウンパラメータ
138 */
139#define GPIO_NOPULL 0x00000000 /* No Pull-up or Pull-down activation */
140#define GPIO_PULLUP 0x00000001 /* Pull-up activation */
141#define GPIO_PULLDOWN 0x00000002 /* Pull-down activation */
142
143/*
144 * GPIOモードパラメータ
145 */
146#define GPIO_MODE_INPUT 0x00000000 /* Input Floating Mode */
147#define GPIO_MODE_OUTPUT 0x00000001 /* Output Push Pull Mode */
148#define GPIO_MODE_AF 0x00000002 /* Alternate Function Push Pull Mode */
149#define GPIO_MODE_ANALOG 0x00000003 /* Analog Mode */
150
151/*
152 * GPIOアウトプット最大周波数パラメータ
153 */
154#define GPIO_SPEED_LOW 0x00000000 /* Low speed */
155#define GPIO_SPEED_MEDIUM 0x00000001 /* Medium speed */
156#define GPIO_SPEED_FAST 0x00000002 /* Fast speed */
157#define GPIO_SPEED_HIGH 0x00000003 /* High speed */
158
159
160#define LED1_POSITION 1
161
162/*
163 * キャッシュサイズID レジスタマクロ
164 */
165#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos)
166#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos )
167#define CCSIDR_LSSHIFT(x) (((x) & SCB_CCSIDR_LINESIZE_Msk ) /*>> SCB_CCSIDR_LINESIZE_Pos*/ )
168
169#define sil_mdw_mem(addr, mask, val) sil_wrw_mem((addr), ((sil_rew_mem(addr) & ~(mask)) | (val)))
170#define sil_anw_mem(addr, mask) sil_wrw_mem((addr), (sil_rew_mem(addr) & ~(mask)))
171#define sil_orw_mem(addr, val) sil_wrw_mem((addr), (sil_rew_mem(addr) | (val)))
172
173ER sysclock_config(int mode);
174static void mpu_config(void);
175static void sysemclock_error(void);
176
177#ifndef TOPPERS_RAM_EXEC
178/*
179 * 低レベルのターゲット依存の初期化
180 *
181 * スタートアップモジュールの中で,メモリの初期化の前に呼び出される.
182 */
183void hardware_init_hook(void)
184{
185 uint32_t reg_value;
186 uint32_t ccsidr, sshift, wshift, sw;
187 uint32_t sets, ways;
188
189 /*
190 * RCCのリセットとコンフィギュレーション
191 */
192 sil_orw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_HSION);
193 sil_wrw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CFGR), 0x00000000);
194 sil_anw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), (RCC_CR_PLLON | RCC_CR_CSSON | RCC_CR_HSEON));
195 sil_wrw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_PLLCFGR),
196 (0x20000000 | RCC_PLLCFGR_PLLQ_2 | RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLN_6 | RCC_PLLCFGR_PLLM_4));
197 sil_anw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_HSEBYP);
198
199 /*
200 * 全割込み禁止
201 */
202 sil_wrw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CIR), 0x00000000);
203
204 /*
205 * メモリプロテクションユニットの初期化
206 */
207 mpu_config();
208
209 /*
210 * キャッシュを有効化
211 */
212 /* I-Cache有効化 */
213 Asm("dsb 0xF":::"memory");
214 Asm("isb 0xF":::"memory");
215 sil_wrw_mem((uint32_t *)(TADR_SCB_BASE+TOFF_SCB_ICIALLU), 0); /* invalidate I-Cache */
216 sil_orw_mem((uint32_t *)(TADR_SCB_BASE+TOFF_SCB_CCR), SCB_CCR_IC_Msk); /* enable I-Cache */
217 Asm("dsb 0xF":::"memory");
218 Asm("isb 0xF":::"memory");
219
220 /* D-Cache有効化 */
221 sil_wrw_mem((uint32_t *)(TADR_SCB_BASE+TOFF_SCB_CSSELR), ((0UL << 1) | 0UL)); /* Level 1 data cache */
222 ccsidr = sil_rew_mem((uint32_t *)(TADR_SCB_BASE+TOFF_SCB_CCSIDR));
223 sets = (uint32_t)(CCSIDR_SETS(ccsidr));
224 sshift = (uint32_t)(CCSIDR_LSSHIFT(ccsidr) + 4UL);
225 ways = (uint32_t)(CCSIDR_WAYS(ccsidr));
226 wshift = (uint32_t)((uint32_t)__builtin_clz(ways) & 0x1FUL);
227
228 /* D-Chaheインバリデート */
229 Asm("dsb 0xF":::"memory");
230 do{
231 uint32_t tmpways = ways;
232 do {
233 sw = ((tmpways << wshift) | (sets << sshift));
234 sil_wrw_mem((uint32_t *)(TADR_SCB_BASE+TOFF_SCB_DCISW), sw);
235
236 } while(tmpways--);
237 }while(sets--);
238 Asm("dsb 0xF":::"memory");
239
240 sil_orw_mem((uint32_t *)(TADR_SCB_BASE+TOFF_SCB_CCR), SCB_CCR_DC_Msk);
241 Asm("dsb 0xF":::"memory");
242 Asm("isb 0xF":::"memory");
243
244
245 /*
246 * 割込みグループ優先度設定
247 */
248 reg_value = sil_rew_mem((uint32_t *)(TADR_SCB_BASE+TOFF_SCB_AIRCR)); /* read old register configuration */
249 reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */
250 reg_value = (reg_value |
251 ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
252 ((NVIC_PRIORITYGROUP_4 & 0x07L) << 8)); /* Insert write key and priorty group */
253 sil_wrw_mem((uint32_t *)(TADR_SCB_BASE+TOFF_SCB_AIRCR), reg_value);
254
255 /*
256 * システムクロックを 216MHzに設定
257 */
258 if(sysclock_config(0) != E_OK)
259 sysemclock_error();
260}
261#endif
262
263/*
264 * USB CLOCK CONFIGURATION
265 */
266ER USB_RCC_PeriphCLKConfig(unsigned int pllsan, unsigned int pllsaip)
267{
268 unsigned int tickstart = 0U;
269 unsigned int pllsaiq = 0U;
270
271 /*
272 * クロック48ソース設定
273 */
274 sil_mdw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_DCKCFGR2), RCC_DCKCFGR2_CK48MSEL, RCC_CLK48SOURCE_PLLSAIP);
275
276 /*
277 * PLLSAIクロックを停止
278 */
279 sil_anw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_PLLSAION);
280
281 tickstart = 0;
282 while((sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR)) & RCC_CR_PLLSAIRDY) != 0){
283 if(tickstart > PLLSAI_TIMEOUT_VALUE){
284 return E_TMOUT;
285 }
286 sil_dly_nse(1000);
287 tickstart++;
288 }
289
290 /*
291 * PLLSAIクロック設定
292 */
293 pllsaiq = sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_PLLSAICFGR)) & (RCC_PLLSAICFGR_PLLSAIQ | RCC_PLLSAICFGR_PLLSAIR);
294 /* Configure the PLLSAI division factors */
295 /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLI2SN/PLLSAIM) */
296 /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */
297 pllsaiq |= (pllsan << 6) | (pllsaip << 16);
298 sil_wrw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_PLLSAICFGR), pllsaiq);
299
300 /*
301 * PLLSAIクロックを再開
302 */
303 sil_orw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_PLLSAION);
304
305 tickstart = 0;
306 while((sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR)) & (RCC_CR_PLLSAIRDY)) == 0){
307 if( tickstart > PLLSAI_TIMEOUT_VALUE){
308 return E_TMOUT;
309 }
310 sil_dly_nse(1000);
311 tickstart++;
312 }
313 return E_OK;
314}
315
316/*
317 * システムクロック設定
318 * 設定値:
319 * System Clock source = PLL (HSE)
320 * SYSCLK(Hz) = 216000000
321 * HCLK(Hz) = 216000000
322 * AHB Prescaler = 1
323 * APB1 Prescaler = 4
324 * APB2 Prescaler = 2
325 * HSE Frequency(Hz) = 8000000
326 * PLL_M = 8
327 * PLL_N = 432
328 * PLL_P = 2
329 * PLL_Q = 9
330 * PLL_R = 7
331 * VDD(V) = 3.3
332 * Main regulator output voltage = Scale1 mode
333 * Flash Latency(WS) = 7
334 */
335ER sysclock_config(int mode)
336{
337 uint32_t tickstart = 0;
338 volatile uint32_t tmpreg;
339
340 /*
341 * HSEの初期設定
342 */
343 sil_anw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_HSEBYP);
344 sil_anw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_HSEON);
345
346 /* HSEの無効化待ち */
347 while((sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR)) & RCC_CR_HSERDY) != 0){
348 if(tickstart > HSE_TIMEOUT_VALUE){
349 return E_TMOUT;
350 }
351 sil_dly_nse(1000);
352 tickstart++;
353 }
354
355 /* HSEの再設定 */
356 sil_anw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_HSEON);
357 sil_orw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_HSEBYP);
358 sil_orw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_HSEON);
359
360 tickstart = 0;
361 /* HSEの再起動待ち */
362 while((sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR)) & RCC_CR_HSERDY) == 0){
363 if(tickstart > HSE_TIMEOUT_VALUE){
364 return E_TMOUT;
365 }
366 sil_dly_nse(1000);
367 tickstart++;
368 }
369
370 /*
371 * PLLの初期設定
372 */
373 /* メインPLLの無効化. */
374 sil_anw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_PLLON);
375
376 /* PLLのレディ待ち */
377 tickstart = 0;
378 while((sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR)) & RCC_CR_PLLRDY) != 0){
379 if(tickstart > PLL_TIMEOUT_VALUE){
380 return E_TMOUT;
381 }
382 sil_dly_nse(1000);
383 tickstart++;
384 }
385 /* PLLレジスタ設定 */
386 sil_wrw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_PLLCFGR), (0x20000000 | PLL_M | (PLL_N << 6) | ((RCC_PLLP_DIV2 >> 1) -1) << 16)
387 | RCC_PLLCFGR_PLLSRC_HSE | (PLL_Q << 24) | (PLL_R << 28));
388
389 /* メインPLLの有効化待ち */
390 sil_orw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR), RCC_CR_PLLON);
391 tickstart = 0;
392
393 /* PLLの有効化待ち */
394 while((sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR)) & RCC_CR_PLLRDY) == 0){
395 if(tickstart > PLL_TIMEOUT_VALUE){
396 return E_TMOUT;
397 }
398 sil_dly_nse(1000);
399 tickstart++;
400 }
401
402
403 sil_orw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_APB1ENR), RCC_APB1ENR_PWREN);
404 tmpreg = sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_APB1ENR)) & RCC_APB1ENR_PWREN;
405 (void)(tmpreg);
406
407 /* 216MHz用のオーバードライブ設定 */
408 sil_orw_mem((uint32_t *)(TADR_PWR_BASE+TOFF_PWR_CR1), PWR_CR1_ODEN);
409
410 tickstart = 0;
411 while((sil_rew_mem((uint32_t *)(TADR_PWR_BASE+TOFF_PWR_CSR1)) & PWR_CSR1_ODRDY) != PWR_CSR1_ODRDY){
412 if(tickstart > PWR_OVERDRIVE_TIMEOUT_VALUE){
413 return E_TMOUT;
414 }
415 sil_dly_nse(1000);
416 tickstart++;
417 }
418
419 /* オーバードライブスイッチを有効化 */
420 sil_orw_mem((uint32_t *)(TADR_PWR_BASE+TOFF_PWR_CR1), PWR_CR1_ODSWEN);
421
422 /* オーバードライブレディ待ち */
423 tickstart = 0;
424 while((sil_rew_mem((uint32_t *)(TADR_PWR_BASE+TOFF_PWR_CSR1)) & PWR_CSR1_ODSWRDY) != PWR_CSR1_ODSWRDY){
425 if(tickstart > PWR_OVERDRIVE_TIMEOUT_VALUE){
426 return E_TMOUT;
427 }
428 sil_dly_nse(1000);
429 tickstart++;
430 }
431
432 /*
433 * USBクロック設定
434 */
435 USB_RCC_PeriphCLKConfig(384, RCC_PLLSAIP_DIV8);
436
437 /*
438 * フラッシュメモリから正しくデータを読み込めるように実行周波数に合わせて
439 * HCLKレイテンシィとデバイスの電源電圧調節する必要がある
440 */
441 /* CPU周波数の増大ケース */
442 if(FLASH_ACR_LATENCY_7WS > (sil_rew_mem((uint32_t *)(TADR_FLASH_R_BASE+TOFF_FLASH_ACR)) & FLASH_ACR_LATENCY)){
443
444 sil_mdw_mem((uint32_t *)(TADR_FLASH_R_BASE+TOFF_FLASH_ACR), FLASH_ACR_LATENCY, FLASH_ACR_LATENCY_7WS);
445 if((sil_rew_mem((uint32_t *)(TADR_FLASH_R_BASE+TOFF_FLASH_ACR)) & FLASH_ACR_LATENCY) != FLASH_ACR_LATENCY_7WS){
446 while(1) { ; }
447 }
448
449 sil_mdw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CFGR), RCC_CFGR_HPRE, RCC_SYSCLK_DIV1);
450 if((sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR)) & RCC_CR_PLLRDY) == 0){
451 return E_SYS;
452 }
453
454 sil_mdw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CFGR), RCC_CFGR_SW, RCC_CFGR_SW_PLL);
455 while((sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CFGR)) & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL){
456 if(tickstart > CLOCKSWITCH_TIMEOUT_VALUE){
457 return E_TMOUT;
458 }
459 sil_dly_nse(1000);
460 tickstart++;
461 }
462 }
463 /* CPU周波数の低下ケース */
464 else{
465 sil_mdw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CFGR), RCC_CFGR_HPRE, RCC_SYSCLK_DIV1);
466 if((sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CR)) & RCC_CR_PLLRDY) == 0){
467 return E_SYS;
468 }
469
470 while((sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CFGR)) & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL){
471 if(tickstart > CLOCKSWITCH_TIMEOUT_VALUE){
472 return E_TMOUT;
473 }
474 sil_dly_nse(1000);
475 tickstart++;
476 }
477
478 sil_mdw_mem((uint32_t *)(TADR_FLASH_R_BASE+TOFF_FLASH_ACR), FLASH_ACR_LATENCY, FLASH_ACR_LATENCY_7WS);
479 if((sil_rew_mem((uint32_t *)(TADR_FLASH_R_BASE+TOFF_FLASH_ACR)) & FLASH_ACR_LATENCY) != FLASH_ACR_LATENCY_7WS){
480 return E_SYS;
481 }
482 }
483
484 /*
485 * PCLK1初期設定
486 */
487 sil_mdw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CFGR), RCC_CFGR_PPRE1, RCC_HCLK_DIV4);
488
489 /*
490 * PCLK2初期設定
491 */
492 sil_mdw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_CFGR), RCC_CFGR_PPRE2, (RCC_HCLK_DIV2 << 3));
493 return E_OK;
494}
495
496/*
497 * メモリプロテクションユニットの設定
498 */
499static void mpu_config(void)
500{
501 /* Disable the MPU */
502 sil_anw_mem((uint32_t *)(TADR_SCB_BASE+TOFF_SCB_SHCSR), SCB_SHCSR_MEMFAULTENA_Msk);
503 sil_anw_mem((uint32_t *)(TADR_MPU_BASE+TOFF_MPU_CTRL), MPU_CTRL_ENABLE_Msk);
504
505 /* Set the Region number */
506 sil_wrw_mem((uint32_t *)(TADR_MPU_BASE+TOFF_MPU_RNR), MPU_REGION_NUMBER0);
507 sil_wrw_mem((uint32_t *)(TADR_MPU_BASE+TOFF_MPU_RBAR), 0x20020000);
508 sil_wrw_mem((uint32_t *)(TADR_MPU_BASE+TOFF_MPU_RASR),
509 ((MPU_INSTRUCTION_ACCESS_ENABLE << MPU_RASR_XN_Pos) |
510 (MPU_REGION_FULL_ACCESS << MPU_RASR_AP_Pos) |
511 (MPU_TEX_LEVEL0 << MPU_RASR_TEX_Pos) |
512 (MPU_ACCESS_NOT_SHAREABLE << MPU_RASR_S_Pos) |
513 (MPU_ACCESS_CACHEABLE << MPU_RASR_C_Pos) |
514 (MPU_ACCESS_NOT_BUFFERABLE << MPU_RASR_B_Pos) |
515 (0x00 << MPU_RASR_SRD_Pos) |
516 (MPU_REGION_SIZE_512KB << MPU_RASR_SIZE_Pos) |
517 (MPU_REGION_ENABLE << MPU_RASR_ENABLE_Pos)));
518
519 sil_wrw_mem((uint32_t *)(TADR_MPU_BASE+TOFF_MPU_RNR), MPU_REGION_NUMBER1);
520 sil_wrw_mem((uint32_t *)(TADR_MPU_BASE+TOFF_MPU_RBAR), 0x20078000);
521 sil_wrw_mem((uint32_t *)(TADR_MPU_BASE+TOFF_MPU_RASR),
522 ((MPU_INSTRUCTION_ACCESS_ENABLE << MPU_RASR_XN_Pos) |
523 (MPU_REGION_FULL_ACCESS << MPU_RASR_AP_Pos) |
524 (MPU_TEX_LEVEL1 << MPU_RASR_TEX_Pos) |
525 (MPU_ACCESS_SHAREABLE << MPU_RASR_S_Pos) |
526 (MPU_ACCESS_NOT_CACHEABLE << MPU_RASR_C_Pos) |
527 (MPU_ACCESS_NOT_BUFFERABLE << MPU_RASR_B_Pos) |
528 (0x00 << MPU_RASR_SRD_Pos) |
529 (MPU_REGION_SIZE_32KB << MPU_RASR_SIZE_Pos) |
530 (MPU_REGION_ENABLE << MPU_RASR_ENABLE_Pos)));
531
532 sil_wrw_mem((uint32_t *)(TADR_MPU_BASE+TOFF_MPU_RNR), MPU_REGION_NUMBER2);
533 sil_wrw_mem((uint32_t *)(TADR_MPU_BASE+TOFF_MPU_RBAR), 0x20078000);
534 sil_wrw_mem((uint32_t *)(TADR_MPU_BASE+TOFF_MPU_RASR),
535 ((MPU_INSTRUCTION_ACCESS_ENABLE << MPU_RASR_XN_Pos) |
536 (MPU_REGION_FULL_ACCESS << MPU_RASR_AP_Pos) |
537 (MPU_TEX_LEVEL0 << MPU_RASR_TEX_Pos) |
538 (MPU_ACCESS_SHAREABLE << MPU_RASR_S_Pos) |
539 (MPU_ACCESS_NOT_CACHEABLE << MPU_RASR_C_Pos) |
540 (MPU_ACCESS_BUFFERABLE << MPU_RASR_B_Pos) |
541 (0x00 << MPU_RASR_SRD_Pos) |
542 (MPU_REGION_SIZE_512B << MPU_RASR_SIZE_Pos) |
543 (MPU_REGION_ENABLE << MPU_RASR_ENABLE_Pos)));
544
545 /* Enable the MPU */
546 sil_wrw_mem((uint32_t *)(TADR_MPU_BASE+TOFF_MPU_CTRL), (MPU_PRIVILEGED_DEFAULT | MPU_CTRL_ENABLE_Msk));
547 sil_orw_mem((uint32_t *)(TADR_SCB_BASE+TOFF_SCB_SHCSR), SCB_SHCSR_MEMFAULTENA_Msk);
548}
549
550/*
551 * システムクロック設定エラー
552 */
553static void sysemclock_error(void)
554{
555 volatile uint32_t temp = 0x00;
556 uint32_t n = LED1_POSITION;
557
558 /*
559 * GPIO LEDクロック設定
560 */
561 sil_orw_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_AHB1ENR), RCC_AHB1ENR_GPIOIEN);
562 temp = sil_rew_mem((uint32_t *)(TADR_RCC_BASE+TOFF_RCC_AHB1ENR));
563 (void)(temp);
564
565 /*
566 * LED GPIO設定
567 */
568 sil_mdw_mem((uint32_t *)(TADR_GPIOI_BASE+TOFF_GPIO_MODER), (3 << (n * 2)), (GPIO_MODE_OUTPUT << (n * 2)));
569 sil_mdw_mem((uint32_t *)(TADR_GPIOI_BASE+TOFF_GPIO_OSPEEDR), (3 << (n * 2)), (GPIO_SPEED_HIGH << (n * 2)));
570 sil_mdw_mem((uint32_t *)(TADR_GPIOI_BASE+TOFF_GPIO_OTYPER), (1 << n), (GPIO_OTYPE_PP<<n));
571 sil_mdw_mem((uint32_t *)(TADR_GPIOI_BASE+TOFF_GPIO_PUPDR), (3 << (n * 2)), (GPIO_PULLUP << (n * 2)));
572 while(1){
573 /* LED ON */
574 sil_wrw_mem((uint32_t *)(TADR_GPIOI_BASE+TOFF_GPIO_BSRR), (1<<n));
575 sil_dly_nse(200*1000*1000);
576 /* LED OFF */
577 sil_wrw_mem((uint32_t *)(TADR_GPIOI_BASE+TOFF_GPIO_BSRR), (1<<n)<<16);
578 sil_dly_nse(200*1000*1000);
579 }
580}
581
Note: See TracBrowser for help on using the repository browser.