0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Nucleo-F446RE 1.Lチカ

Last updated at Posted at 2025-12-09

GPIOのSET、RESET MXの生成したコードの解析メモ

IMG_5466.JPG

オシレータ設定

データシートRM0390 P.117~
[ SYSCLKのソースは全部で3種類4系統 ]
HSI 内蔵RCオシレータ、 16MHz
HSE 外部オシレータ、
PLL PLL経由で2系統 (up to 180MHz)
[ セカンダリークロック ]
32KHz LSI RC:ウォッチドッグタイマー、RTC、ウェークアップ用
32.768KHz LSE:外部クリスタル RTC用
※POR起動時は、HSIで駆動。

今回は、Board上のクリスタル8MHz(HSE)を指定し、SYSCLK=180MHzに設定。

SYSCLKの速度によって、Core電圧を上げる設定。

(STM32F446xC/E DS10693 Rev 10 P.75)
設定電圧は3種類。

Power Scales 電圧
Power Scale 1 ((VOS[1:0] bits in PWR_CR register = 0x11), 168 MHz HCLK max frequency with over-drive OFF or 180 MHz with over-drive ON 1.40V
Power Scale 2 ((VOS[1:0] bits in PWR_CR register = 0x10), 144 MHz HCLK max frequency with over-drive OFF or 168 MHz with over-drive ON 1.32V
Power Scale 3 ((VOS[1:0] bits in PWR_CR register = 0x01), 120 MHz HCLK max frequency 1.14V

各ペリフェラルにクロックを供給

STM32は、各ペリフェラルのクロック供給を選択的に指定できる。

データシート(RM0390 Figure 14. Clock tree)

ClockTree.png

ペリフェラルが接続されているバスの種類を特定しておく。

データシート(RM0390 Rev 7 P.58)

PeripheralBus一覧0.png

PeripheralBus一覧.png

SystemConfigrationとPowerへのクロック供給開始
 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
GPIOのクロック供給開始
/* GPIO Ports Clock Enable */
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOC);
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOH);
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
USARTのクロック供給開始
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);

GPIOの制御コード

LD2(GPIOA PA5)のLEDの点滅
B1(GPIOC PC13)のスイッチ入力
B1のGPIO modeは、外部割込み端子ではなく、通常のIO入力端子設定に変更。

GPIOコード
GPIOのSet、Reset
 while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	  //LL GPIOx bit Set/Reset Output
	  LL_mDelay(delayTime);
	  //Set several pins to high level on dedicated gpio port
	  LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_5);
	  LL_mDelay(delayTime);
	  //Set several pins to low level on dedicated gpio port
	  LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_5);

	  //GPIO port input data register GPIOx.IDR
      //pull upされているスイッチ
	  if((GPIOC->IDR & LL_GPIO_PIN_13) == 0UL)
	  {
		  if(delayTime==500)
			  delayTime=1000;
		  else
			  delayTime=500;

		  while(!(GPIOC->IDR & LL_GPIO_PIN_13));
	  }

	  //GPIO port bit set/reset register (GPIOx_BSRR)
	  LL_mDelay(delayTime);
	  GPIOA->BSRR = GPIO_BSRR_BS_5;
	  LL_mDelay(delayTime);
	  GPIOA->BSRR = GPIO_BSRR_BR_5;

	  //GPIO port output data register (GPIOx_ODR)
	  LL_mDelay(delayTime);
	  GPIOA->ODR |= 0x00000020;
	  //GPIOA->ODR |= GPIO_ODR_OD5;
	  LL_mDelay(delayTime);
	  GPIOA->ODR ^= 0x00000020;
	  //GPIOA->ODR ^= GPIO_ODR_OD5;

	  //LL GPIOx read
	  //Return full input data register value for a dedicated port.
      //pull upされているスイッチ
	  portValue = LL_GPIO_ReadInputPort(GPIOC);
	  if((portValue & LL_GPIO_PIN_13) == 0UL)
	  {
		  if(delayTime==500)
		  			  delayTime=1000;
		  		  else
		  			  delayTime=500;
		  while((portValue & LL_GPIO_PIN_13)== 0UL)
		  {
			  portValue = LL_GPIO_ReadInputPort(GPIOC);
		  }

	  }


  }
  /* USER CODE END 3 */
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?