圏9研究所 工作室

圏9研究所の開発情報資料など

AT32F403A BlackPill:その2 240MHz クロック設定(USB含む)

1.概要
 システムクロックを240MHzに設定してLチカ
 USBのクロック設定も行う

2.クロック設定
1)Clock configuration register 構成と設定
(1)クロック設定レジスタ
 STM32Fx : RCC_CFGR
 AT32F4x : CRM_CFG
 ・名前は違うがアドレスは同じ 0x4002-1004
 ・STM32F1x の Reserved エリアを使って拡張
  拡張詳細はAT32F4xのリファレンスマニアル参照

(2)240MHz 設定
 STM32F103 72MHz から最小限の変更で設定

アイテム

STM32F103

AT32F403A

変更内容

 

HCLK

72MHz

240MHz

CRM_CFG. PLLRANGE bit31

 = 1: PLL output > 72 MHz

CRM_CFG.PLLMULT[5:0] bit30:29,21:18

 = 011101:PLLx 30

0x4002-1004

ADC

12MHz

20MHz

CRM_CFG.ADCDIV[2:0] bit28,15:14

 = 101:PCLK/12

USB

HSE 48MHz

HIS 48Mhz

CRM_MISC1.HICLDIV bit25

 = 1: HICK

0x4002-1030

CRM_MISC3. HICK_TO_USB bit8

 = 1: HICK or HICK/6

0x4002-1054

ACC_CTRL1. ENTRIM bit1

 = 1: HICKTRIM is calibrated.

ACC_CTRL1. CALON bit0

 = 1: Calibration enabled, and starts searching for a pulse on the USB_SOF.

0x4001-580C

 

・設定メモ

CRM  0x4002   -1000

CRM_CFG:      -0004  初期値=0x0000

CRM_MISC1:  -0030

CRM_MISC3:  -0054

 

*(__IO uint32_t *)0x40021004 = 0x001D840A0xB035440A

0000 0000 0001 1101 1000 0100 0000 1010

1011 0000 0011 0101 0100 0100 0000 1010

31     27    23     19     15     11     7      3

 

(3)Clock configuration register (CRM_CFG) 設定表

2)Clock tree 設定
(1)STM32F1xとの比較

(2)AT32F4x

 

3.クロック再設定手順
 STM32F1x_Reference manual 8.2.3 PLLs によるとPLL動作中は設定変更できないためPLLを停止して変更後PLL再起動する

処理

レジスタ

設定値

System ClockHISに待避

RCC_CFGR Bit 1:0

SW[1:0]:SystemclockSwitch

00: HSI selected as system clock

PLL停止

RCC_CR  Bit 24

PLLON:PLLenable

0: PLL OFF

PLL停止待ち

RCC_CR Bit25

PLLRDY:PLLclockreadyflag

wait 0: PLL unlocked

PLL再設定

RCC_CFGR

240MHz設定

RCC_CFGR_SW = 00

PLL起動

RCC_CR Bit24

PLLON:PLLenable

1: PLL ON

PLL起動待ち

RCC_CR Bit25

PLLRDY:PLLclockreadyflag 

wait 1: PLL locked

System ClockPLLCLKに戻す

RCC_CFGR  Bit 1:0

SW[1:0]:SystemclockSwitch

10: PLL selected as system clock

USBクロック設定

 

HICK 48MHz


4.コード
1)User CODE SysInit
 ・240MHz システムクロック設定
 ・48MHz 内蔵USBクロック設定

 /* USER CODE BEGIN SysInit */

  // reconfigure System Clock 240MHz
  CLEAR_BIT(RCC->CFGR, RCC_CFGR_SW_1);				// select HIS to System Clock
  __HAL_RCC_PLL_DISABLE();					// Disable the main PLL.
  while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY)  != RESET);	// Wait till PLL is disabled
  WRITE_REG(RCC->CFGR, 0xB0354400);				// set CRM_CFG(RCC_CFGR) 240Mhz
  //WRITE_REG(RCC->CFGR, 0x001D8400);				// set CRM_CFG(RCC_CFGR) 72Mhz
  __HAL_RCC_PLL_ENABLE();					// Enable the main PLL.
  while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY)  == RESET);	// Wait till PLL is ready
  SET_BIT(RCC->CFGR, RCC_CFGR_SW_1);				// select PLL to System Clock

  // reconfigure USB HICK 48MHz
  *(__IO uint32_t *)0x40021030 |= (1 << 25);	// CRM_MISC1.HICLDIV bit25 = 1: HICK
  *(__IO uint32_t *)0x40021054 |= (1 << 8);	// CRM_MISC3. HICK_TO_USB bit8 = 1: HICK or HICK/6
  *(__IO uint32_t *)0x4001580C |= 0b11;		// ACC_CTRL1. ENTRIM bit1 = 1: HICKTRIM is calibrated.
						// ACC_CTRL1. CALON bit0 = 1: Calibration enabled,
						//  and starts searching for a pulse on the USB_SOF.