IT Guy

IT、Project Management、IoT、プログラミング、ITIL等々

NUCLEO-F302R8 - Hello World Project (Blink)

参考文献

itguy.hatenablog.jp

必要Tool Chain / Tool

  • STM32 CubeMX
  • Keil μVision 4
  • STM32 ST-Link

開発手順

CubeMX

  • CubeMXを立ち上げ「New Project」を選択

  • Board Selectorタブから「NUCLEO-F302R8」ボードを選択 f:id:blog-guy:20180825093423p:plain

  • 「Project」メニューから「Generate Code」を選択 f:id:blog-guy:20180825093534p:plain

  • Project SettingsからProject Name, Project Location, Toolchain/IDE等を選択
    f:id:blog-guy:20180825093826p:plain

  • 「Code Generator」タブから下記のように選択 - 「Copy only the necessary library files」
    f:id:blog-guy:20180825094032p:plain

  • 「OK」をクリック。Code Generationが完了すると下記のメッセージが表示されるはず。
    f:id:blog-guy:20180825094136p:plain

  • 「Open Project」で進む ⇒ これでKeil μVisionが立ち上がるはず。

Keil μVision

最初の設定
  • 「Open Project」からμVisionを立ち上げると、最初に下記のエラーメッセージが出る。
    f:id:blog-guy:20180825094421p:plain

  • Keil μVisionの「File」メニューから「Device Database...」を選択
    f:id:blog-guy:20180825094544p:plain

  • 「Device Database」画面から「STM32F302RB」を選択し、「Close」を選択

コーディング
  • 生成されたコードの中のmain.c (Application/Userの中)は下記の通り。
    f:id:blog-guy:20180825095503p:plain

  • while (1)文に下記のコードを追加

  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
     HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
     HAL_Delay(500);
  }
  /* USER CODE END 3 */

}
  • 上記のLD2_GPIO_Port、LD2_Pinはmain.hで以下のように定義されている。
#define LD2_Pin GPIO_PIN_13
#define LD2_GPIO_Port GPIOB
Compile / Linking
  • ツールボックスから「Build」を実行
    f:id:blog-guy:20180825100838p:plain

  • 下段の「Build Output」にこのようにCompile、Linkingを行う。

Build target 'Blink_LED1'
assembling startup_stm32f302x8.s...
compiling main.c...
compiling stm32f3xx_it.c...
compiling stm32f3xx_hal_msp.c...
compiling stm32f3xx_hal_tim.c...
compiling stm32f3xx_hal_tim_ex.c...
compiling stm32f3xx_hal_uart.c...
compiling stm32f3xx_hal_uart_ex.c...
compiling stm32f3xx_hal.c...
compiling stm32f3xx_hal_rcc.c...
compiling stm32f3xx_hal_rcc_ex.c...
compiling stm32f3xx_hal_gpio.c...
compiling stm32f3xx_hal_dma.c...
compiling stm32f3xx_hal_cortex.c...
compiling stm32f3xx_hal_pwr.c...
compiling stm32f3xx_hal_pwr_ex.c...
compiling stm32f3xx_hal_flash.c...
compiling stm32f3xx_hal_flash_ex.c...
compiling stm32f3xx_hal_i2c.c...
compiling stm32f3xx_hal_i2c_ex.c...
compiling system_stm32f3xx.c...
linking...
Program Size: Code=4476 RO-data=480 RW-data=16 ZI-data=1136  
FromELF: creating hex file...
"Blink_LED1\Blink_LED1.axf" - 0 Error(s), 0 Warning(s).
  • STM32 ST-Link Utilityアプリケーションを実行
    f:id:blog-guy:20180825101346p:plain

  • 「Target」メニューから「Program & Verify...」を選択
    f:id:blog-guy:20180825101509p:plain

  • File pathからhexファイルを選択し、「Start」をクリック
    f:id:blog-guy:20180825101637p:plain

  • 実行されると、下記のログのあと、NucleoボードのLED LD2が0.5秒間隔で点滅するはず

10:15:20 : ST-LINK SN : 066FFF554857707067053924
10:15:20 : ST-LINK Firmware version : V2J25M13
10:15:20 : Connected via SWD.
10:15:20 : SWD Frequency = 4,0 MHz.
10:15:20 : Connection mode : Normal.
10:15:20 : Debug in Low Power mode enabled.
10:15:20 : Device ID:0x439 
10:15:20 : Device flash Size : 64KBytes
10:15:20 : Device family :STM32F301x4-x6-x8/F302x4-x6-x8/F318xx
10:15:44 : [Blink_LED1.hex] opened successfully.
10:15:44 : [Blink_LED1.hex] checksum : 0x0007A520 
10:16:58 : Memory programmed in 0s and 578ms.
10:16:58 : Verification...OK
10:16:58 : Programmed memory Checksum: 0x0007A520

コード修正

点滅の間隔を0.5s, 2sずつ繰り返すサンプルは下記の通り

#define BLINK_TICKS1  (500)
#define BLINK_TICKS2  (2000)
    
int sw = 1;
while (1)
{
  if(sw) {
    HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
    HAL_Delay(BLINK_TICKS1);
    sw = 0;
  } 
  else {
    HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
    HAL_Delay(BLINK_TICKS2);
    sw = 1;
  }         
}