フォト
2025年4月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
無料ブログはココログ

« IchigoJamで自分自身をLIST表示するプログラム | トップページ | LPC810を使ってIchigoJamで赤外線リモコン受信を行う »

2015年5月27日 (水)

STM32F103C8T6ボードでLチカ

「arduino IDE 1.6.4 で ARM STM32F103C8T6を使ってみる」で試した
ARM STM32F103C8T6 ボードをSTM32開発環境を使てLチカを実装してみました。

01

今回の目標は、
  「PC13ポートに接続のLEDを1秒間隔で点滅させる」
です。

開発環境の準備
STM32マイコン用 無償統合開発環境として2の環境をインストールして試してみました。
Atollic TrueSTUDIO Version: 5.3.0 Lite
System Workbench for STM32
(ダウンロードを上記のリンクからダウンロード出来ます。要ユーザー登録

試した感じではどちらもeclipceベースでLPC810の開発で使ったLPCXpressoと
同じような感じです。環境的には大差がないのですが、TrueSTUDIOは、
メニュー表示等、日本語対応されています。また、他のLPC等の他のARM CPUにも
対応しているので、こちらを選択しました。

17

上記の様に、全て日本語表示で分かりやすです。

Lチカプログラムの実装
プログラム作成にあたり、必要ライブラリ・初期設定等のプロジェクトファイル一式
を生成してくれるSTM社の「STM32CubeMX」というツールを使うことにしました。
下記からダウンロードできます。
  STM32CubeMXSTM32Cube initialization code generator (UM1718)

STM32CubeMXは使いたいベリフェノール(UART、GPIO、I2C等の機能)を選択して、
ライブラリ等の一式を含めた開発環境用のプロジェクトを自動生成してくれます。

生成したmain.cのソースは次のような感じです(ヘッダー部のコメントは省略しています)。

/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);
	  HAL_Delay(1000);
	  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);
	  HAL_Delay(1000);

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __GPIOC_CLK_ENABLE();
  __GPIOD_CLK_ENABLE();
  __GPIOA_CLK_ENABLE();

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

#ifdef USE_FULL_ASSERT

/**
   * @brief Reports the name of the source file and the source line number
   * where the assert_param error has occurred.
   * @param file: pointer to the source file name
   * @param line: assert_param error line source number
   * @retval None
   */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */

}

#endif

上記のソースでは、main()のwhile()内にLチカ用に4行だけ追加しています。
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);
  HAL_Delay(1000);
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);
  HAL_Delay(1000);

STM32CubeMXの使い方

プロジェクトを新規作成します。

02

プロジェクトを作成する際、ターゲットMCUを指定します。
ここでは、STM32F103C8xを指定しています。

04

Toolchain/IDEにTrueSTUDIOを指定します。

12

プロジェクト作成時に必要なモジュール等のダウンロードが行われます。
プロジェクト作成後は、下記の画面となり左側の「ベリフェノール」にリストで利用したい
機能を選択しパラメタ等を指定します。中央のICのピンをクリックしてピンに機能を
割り当てることもできます。

05

私のマイコンボードでは2つの水晶振動子で外部クロックされているのでその設定が
必要となります。またLEDを点灯されるためにPC13ピンにGPIO の出力を定義します。
また、ST-LINKでデバッグできるようにSWCLK、SWIOによるシリアル通信が出来るように
定義します。

PC13のピンを GPIO_Outputを設定
06

ベリフェノールの設定
RCCのHigh Speed ClockとLow Speed Clockに水晶振動子の接続を設定します。
SYSのDebugにSerial-Writeを選択します。

08

この設定により、ICの対応するピンに機能が割り当てられます。

23

次にClook Configrationタブの画面でクロック関連の設定を行います。
水晶振動子のクロック周波数や、クロック供給の設定を行います。

09

設定が完了したのでにコード生成を行います。
メニューの[Project] - [Generate Code]で生成出来ます。


開発環境 TrueSTUDIOを使う

開発環境 TrueSTUDIO を起動して生成したコードをインポートします。

13

14

15

インポートすると自動でコンパイルするのですが、エラーが発生します。

16

どうも、生成したコードのSTM32F103C8_FLASH.ldというファイルがまずいようです。
このファイルはリンカー用のスクリプトファイルです。

ここで、ちょとハマりましたが、このファイルを作成すればよいようなので
プロジェクトのプロパティ設定で、下記の設定を変更してもとに戻す操作をして
スクリプトファイルの作成を行くことでエラーを回避出来ました。

18

コンパイル後、デバックモードで実行するとLチカが動作しました。

念のため、ブレークポイントを設定してデバック出来るかも確認していました。

20

生成したプロジェクトにはなぜかデバックモードの実行形式ファイルしか生成して
くれません。一応、デバッグで実行するとボードへの書き込みも行ってくれるのですが、
デバッグ用のコードのため、プログラムサイズが大きいです。

手動でReleseモードの環境を作成する必要があります。
構成の管理画面で新規に作成します。

25_2

24

Debugの構成をコピーして作成します。その後、Relese環境のデバックレベルの設定で
Assembler と C Compiler のDebuggingのDebug Levelの設定をNoneを指定します。

26

さらに、ST-LINK Utilityでボードに書き込むためのHexファイルも生成する設定を
行っておきます。

27

コンパイル後、ST-LINK Utilityでもボードに書き込んで動作することを確認しました。
(Hexの他にs-recordという出力形式でも書き込むことが出来ました)

22

おおよその感覚で、作成方法が把握出来ました。

次の調査としては、ボード上のUSBの利用ですね。
STM32CubeMXでUSBまわりのドライバーと初期化処理部を自動生成してくれる
ようなのでそのあたりを調べてみます。

2015/05/28 追記

ライブラリ等はSTM32CubeF1 をダウンロードしてIDEに組み込んでも良さそうです。
この中にマニュアルやサンプルが含まれています。

« IchigoJamで自分自身をLIST表示するプログラム | トップページ | LPC810を使ってIchigoJamで赤外線リモコン受信を行う »

ARM」カテゴリの記事

STM32」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: STM32F103C8T6ボードでLチカ:

« IchigoJamで自分自身をLIST表示するプログラム | トップページ | LPC810を使ってIchigoJamで赤外線リモコン受信を行う »