組み込み開発学習

:::note info
本ページは外部の組み込み開発学習サイトを使用した勉強記録や、OUTPUT、学習ノートを目的としたページです
:::

## 学習サイト紹介

外部学習サイトリンク(ホーム)

https://depfields.com/

## 学習の進め方
今のところ明確な方法は確立していないが、しばらくはページ毎に何が書かれているかをまとめ、私自身がPointだと思う箇所などを記していく

## ホームページまとめ
[ホームへのリンク](https://depfields.com/)

* サイト概要の紹介
* ARMマイコンを使いこなすためのページへのリンク(https://depfields.com/learning/)
　⇒マイコンおよび周辺回路の初歩
　⇒実務にて求められる組み込み設計開発に必要なスキル
* 組み込みエンジニアとして机上のプログラミングだけではなく実際に自分で回路を組んで思考錯誤しながら学習を進めてく事が大事
* アプリケーション開発などに役立つサンプルプログラムへのリンク 
  (https://depfields.com/applications/)
* 各種ページへのリンク
　⇒[はじめに](https://depfields.com/introduction/)
　⇒[プロフィール](https://depfields.com/profile/)
　⇒[学習ガイダンス](https://depfields.com/guidance/)
　⇒[組み込み入門](https://depfields.com/learning/)

## プロフィールページのまとめ
[プロフィールページへのリンク](https://depfields.com/profile/)

* 組み込み技術の学習で直面する困難について記載されている
　⇒著者は組み込み技術を学ぶ際に何から学べば分からず最初は苦労した
　⇒あるARMマイコンの書籍をきっかけに状況が好転
　⇒ARMマイコンは将来性も有望で多くの課題も実現してくれる
　⇒ARM毎門から始めて基礎を学ぶ事が一番の近道
* 最短で無駄なく学習できる環境を提供
　①[ARMマイコンをつかった組み込み技術習得のスキルアップ学習カリキュラム](https://depfields.com/guidance/)から
　②[実践で使えるARMマイコン入門](https://depfields.com/learning/)
  ①、②の順で実施していく
　⇒環境構築で詰まった場合は以下のリンクで構築方法を案内している
　[ARMマイコンSTM32の学習におすすめの開発環境](https://depfields.com/environment/)
* 組み込みエンジニアを志す人に身につけてほしい資質
　⇒実社会での設計・開発の経験および失敗を通して得た本当の活きた即戦力となる技術力
　⇒知識だけにとらわれずどのような分野にでも通用する応用・対応力をつけることを
　⇒応用・対応力は現場では起こりがちな不可抗力的な不具合にも冷静に対応できるようになるためのエンジニアとしての最重要な資質

 ## ARMマイコンをつかった組み込み技術習得のスキルアップ学習カリキュラム
[ARMマイコンをつかった組み込み技術習得のスキルアップ学習カリキュラムへのリンク
](https://depfields.com/guidance/)
* 組み込みエンジニアになるために必要な資質および技能
 ⇒以下が組み込みエンジニアが持つべき資質とそのバランスの図
　![skil_map-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826577/f31626e7-7929-f518-f1ea-2d16d7b53555.jpeg)
※サイト内の図拝借

 ⇒最重要なのは「**設計力・技術センス**」
　　⇒実際の経験を通して、知恵を駆使しながら身につけていくもの
* 組み込み技術に必要な資質
![skil_category-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826577/bb672bdb-86a5-9be4-e10a-3cfa360a6200.jpeg)
※サイト内の図を拝借
* 教材ボードを使った組み込み学習
　⇒抽象的な概念より**具体的なマイコンを操作することから始める**
　⇒組み込み技術は**モノ**を扱うもの、電気・電子回路で構成する周辺回路をはじめとする工学的な基礎知識・経験が必要不可欠
  ⇒導通か非導通かをチェックしたりするためのテスターを呼ばれる計測器は使えるようになること
　⇒参照サイトの組み込み学習では、指定のマイコンボードを使用
    [ARMマイコン専用教材ボード](https://depfields.com/board/)
　　※サイト内容のマイコン開発環境がそのまま使用でき、動作確認ができる
　⇒指定のボードを使用しないと参照サイトの学習に支障がでる可能性あり
　![nureo-f103rb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826577/cb6c419c-2bf4-7cc5-62dc-1ce209ea2544.jpeg)
* C言語のプログラミン学習
 ⇒C言語の概要がある程度わかった段階で教材ボードを実際に使用してプログラミングも同時に学習していくのが効率よい
 ⇒技術的な内容詳細を理解するのは後回しにして、とりあえずPCとマイコンをシリアル通信できる総合開発環境（**STM32CubeIDE**）および操作環境（ターミナルソフトtera term等）を構成してしまう
 ⇒環境を構成することでクロス環境と呼ばれる開発環境で実用的なC言語が学習できえる
![clossdevelop_a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826577/713066ef-87e4-e476-de1a-78abe5427ac3.jpeg)
 ⇒マイコン操作にある程度慣れてくるとエンジニアとして実務にも必要な資質も身につけていく必要になる
 ⇒組み込み開発設計のイロハ[ARM(STM32)の基礎と開発入門](https://depfields.com/embedded/)
* 学習カリキュラム
 ⇒学習のガイドラインを示してくれてる　※ **興味と熱意がある人が前提！**
 ![curriculum_select.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826577/69404bc1-9e49-c3a5-ccbc-9170c6765e73.jpeg)
**グループA：**
技術的な知識・経験およびプログラミング（C言語）に精通している

**グループB：**
技術的な知識・経験およびプログラミングに精通しているが、C言語の経験はない

**グループC：**
技術的な知識・経験はあるが、プログラミングの経験はない

**グループD：**
プログラムでもC言語は使い慣れているが、電気・電子的な知識・経験はない

**グループE：**
プログラミングは多少経験があるが、電気・電子的な知識・経験はない

**グループF：**
技術知識のない初心者
 ⇒上記のようなあみだ形式でレベルや得意や分野別にどのように学習進めていくかの指針がある
自分は**グループD**として学習を進める
　⇒グループ毎の詳細はチームサイト内に記載されている
参考までに私が選んだ**グループD**の詳細を以下に転記

:::note info
グループDに属する人が組み込み技術を始めるにあたってはプログラミングのみのソフトウェアだけでなく実際のハードウェアを扱うことを意識して学習をはじめなければいけません。まずは、ハードウェアを知ることですが、工学的な基礎知識をしっかり理解することがとても重要です。特に、マイコン周辺の回路を扱うには電気・電子の知識、経験が必要になってきます。
:::

↓
[ARM(STM32)の基礎と開発入門へのリンク](https://depfields.com/embedded/)で実際に回路に触れて電気・電子回路に慣れていくスタイル

* カリキュラムのガイダンスまとめ
** 組み込み技能を身につけるまでの過程
![learning_process.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826577/c450dd2a-a685-55a9-04d7-df02650572e1.jpeg)
 ⇒組み込み技術を生かして実際の仕事に活かすためのアプリケーションを作成できるようになるためには技術のコア部分であるマイコンを操作するだけでは不十分
　⇒大切なことは与えられたアプリケーションの課題を実現するための**設計開発技能**を身につけること
 ⇒**設計開発技能**を学習できるページのリンクは以下に記載
[ARM(STM32)の基礎と開発入門へのリンク](https://depfields.com/embedded/)

## 学習環境の構築まとめ
[学習環境構築ページのリンク](https://depfields.com/environment/)

* ARMマイコン(STM32)初心者が勉強するのに適した開発環境とは
:::note info
マイコンの開発には通常、総合開発環境（IDE：Integrated Development Environment )とよばれるソフトウェア開発用のさまざまな機能がオールインワンとなったパッケージアプリケーションを使用する。総合開発環境にはプログラムを記述するエディタ、C言語等プログラミングのコンパイラ、アセンブラ、リンカおよびデバッガ等の機能が備わっている。
総合開発環境を使用すると、開発者はプログラミングに集中でき、転送、実行までかんたんな操作で実現できる
:::

* ファームウェアライブラリ
 ⇒STM32シリーズ：**スタンダードペリフェラルライブラリ（SPL）**を使用
  ⇒**HAL**,**LL**などの最新のライブラリも登場しているが、現状解説記事が少なく抽象化されているためまずSPLを理解することをおすすめしている
 ⇒AruduinoやMbedなどの便利な開発環境の特徴：ハードウェアとのインターフェース部分を抽象化している
　⇒抽象化により開発が容易になる反面、初心者が学ぶには組み込み開発の肝を抑え難くなる
　⇒ある程度の開発経験のあるエンジニアの便利道具として使う面が大きい
* 学習サイト運営者のコラム
　 ⇒ためになる話だったので転記
:::note info
技術にはパラダイムシフトにより真空管からドランジスタ、LSI、マイコンに進化して行く過程で例えば真空管の知識などはエンジニアにとって現在ではあえて必要のあるものではありません。マイコン開発を行っていく上では、例えば一昔まえではアセンブリ言語と呼ばれるマイコンに近い低水準言語でプログラムを作成していましたが、今ではアセンブリを使用しなくてもより開発しやすいC言語などで開発ができてしまいます。また、IoTを実現するうえで使う通信のプロトコル・スタックの中身などはあえて知らなくても完成されたものを利用できればそれでよい場合もあります。ただ、すべてがそうではなくて開発するにあたって押さえるべき基礎、例えば古くからある技術でも重要なトランジスタなど初心者のうちからしっかり学習しておかならないポイントは自分でしっかり理解しておいてはじめて使えるエンジニアとして活躍できるようになるのです（ホビー目的の電子工作ではそこまでは求められないかもしれませんが）。現代では数多くある開発プログラム言語のなかでも比較的古典的なプログラミング言語であるC言語が開発ではまだ現役であることがそれを物語っています。SPLをあえて採用しているのはそういった意味も込められています。
:::

* STM32マイコンの開発ツール
　⇒総合開発環境STM32CubeIDEに対象マイコンのファームウェアライブラリSPLを組み込んだものを使用
　⇒プログラムの転送書き込みには**SWD方式のST-Link/V2**を使用
　⇒学習環境で使用するマイコンボード**NUCLEO-F103RB**にはST-Link/V2は含まれている
* STM32CubeIDEの構築
 ⇒統合開発環境にSPLおよびFreeRTOSを組み込んだ仕様を構築
* 環境構築
①以下サイトにアクセス 
https://www.st.com/en/development-tools/stm32cubeide.html
②サイト内の下記キャプチャの箇所から自分のOSにあったソフトウェアをダウンロード(私はWindows)
![スクリーンショット 2024-09-28 182559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826577/2aea4ebd-3a5e-90bb-98d7-7cbee2fff980.png)
③インストーラーが落ち次第、インストーラーの画面に従う



# マイコン（マイクロコントローラ）の基本まとめ

## はじめに
[depfields.com](https://depfields.com/what-mc/) の「マイコンとは？」ページでは、マイコン（マイクロコントローラ）の基本的な概念や用途、仕組みについて詳しく解説されています。この記事では、該当ページの内容を簡潔にまとめ、マイコンの理解を深めるための基礎情報を提供します。

---

## マイコン（マイクロコントローラ）とは？

### 定義
マイコンは、コンピュータシステムを1つの集積回路（IC）に統合したデバイスであり、以下の3つの主要な構成要素を含みます：

1. **CPU（中央処理装置）**
   - データの処理や計算を行う。
2. **メモリ**
   - プログラムやデータを一時的または永続的に格納する。
3. **周辺機能**
   - 入出力ポート、タイマー、通信モジュール（例: UART、SPI）など。

### 特徴
- 小型かつ低消費電力。
- 特定のタスクを効率的に処理するよう設計されている。
- 組み込みシステムに広く利用される。

### 主な用途
- 家電製品（例: 洗濯機、エアコン）
- 自動車（例: エンジン制御、エアバッグ）
- 医療機器（例: 血圧計、心拍モニタ）
- IoTデバイス（例: スマートライト、温湿度センサ）

---

## マイコンの基本構造

### ハードウェア構成
1. **CPU**
   - プログラムの実行や演算を行う。
2. **メモリ**
   - フラッシュメモリ（プログラム保存用）
   - RAM（データ保存用）
3. **周辺機能**
   - デジタル入出力（GPIO）
   - 通信プロトコル（例: I2C、UART）
   - アナログ-デジタル変換（ADC）

### ソフトウェア構成
1. **プログラムコード**
   - C言語やアセンブリ言語で記述される。
2. **リアルタイムOS（RTOS）**
   - マルチタスク処理をサポートする場合に使用。

---

## マイコンの選定基準

### 主な考慮点
1. **性能**
   - クロック周波数、処理速度。
2. **メモリ容量**
   - プログラムやデータの格納に十分な容量が必要。
3. **消費電力**
   - バッテリー駆動デバイスでは重要。
4. **周辺機能の種類と数**
   - プロジェクトの要件に応じて選定。

### 有名なマイコンシリーズ
- **ARM Cortex-M**
  - 高性能で柔軟性が高い。
- **AVR（Arduino）**
  - 初心者に人気。
- **PIC**
  - 工業用アプリケーションに適している。

---

## マイコンを使ったプロジェクト例

### 1. LED制御
- 点灯/点滅の制御。
- PWMを使用した明るさ調整。

### 2. センサデータの取得
- 温度センサや光センサを接続してデータを処理。

### 3. モーター制御
- DCモーターやステッピングモーターの制御。

### 4. 通信システム
- UARTやI2Cを使用したデバイス間通信。

---

## 学習リソース

1. **開発ボード**
   - ArduinoやRaspberry Pi Picoなどの手頃なボード。
2. **公式ドキュメント**
   - 各マイコンメーカーが提供するデータシートやアプリケーションノート。
3. **オンラインリソース**
   - [depfields.com](https://depfields.com/what-mc/) を活用。

---

## まとめ

マイコンは組み込みシステムの心臓部であり、さまざまなデバイスやシステムで活躍しています。このまとめを参考に、マイコンの基本を理解し、実践的なスキルを磨きましょう。

詳細な情報は公式ページをご参照ください: [depfields.com/what-mc](https://depfields.com/what-mc/)



# 組み込みシステムの背景と重要性

## はじめに
[depfields.com](https://depfields.com/background/) の「背景」ページでは、組み込みシステムの誕生とその重要性について詳しく解説されています。本記事では、その内容をわかりやすくまとめ、組み込み技術の基礎理解を深めるためのポイントを整理します。

---

## 組み込みシステムの背景

### 組み込みシステムとは？
組み込みシステムとは、特定の機能を実現するために、ハードウェアとソフトウェアが一体化されたシステムのことを指します。具体例として、以下が挙げられます：

- 家電製品（例: 冷蔵庫、電子レンジ）
- 自動車（例: ブレーキ制御システム、エンジン制御ユニット）
- 医療機器（例: 心拍モニタ、MRI）
- スマートデバイス（例: スマートウォッチ、IoTセンサ）

### 歴史的背景
- **初期の発展**
  - 1960年代に初のマイクロプロセッサが開発され、組み込みシステムの基礎が形成されました。
  - 以降、集積回路の進化により小型化と高性能化が進みました。
- **現代の重要性**
  - IoT（Internet of Things）の普及により、あらゆるデバイスがネットワークに接続されるようになり、組み込みシステムの需要が飛躍的に増加しています。

---

## 組み込みシステムの特徴

### 1. 特定用途向けの設計
- 家庭用電化製品から産業用機器まで、目的に特化した設計が行われます。

### 2. 高い信頼性
- 安全性や耐久性が求められるため、徹底したテストや耐久性設計が必要です。

### 3. リソース制約
- 限られたメモリや処理能力で効率的に動作することが重要です。

### 4. リアルタイム性
- 制御対象に応じたリアルタイム処理が求められるケースが多いです。

---

## 組み込み技術の応用分野

### 1. 家電製品
- スマート家電や省エネ家電が普及。

### 2. 自動車
- 自動運転技術、車載通信、電動化技術。

### 3. 医療分野
- 人体データの計測や診断支援。

### 4. IoTとスマートシティ
- 都市インフラの効率化、センサネットワークによるモニタリング。

---

## 組み込みシステムの未来

### 1. AIとの統合
- AI技術と組み込みシステムの融合が進み、よりスマートなデバイスの開発が期待されています。

### 2. 低消費電力技術
- 環境に配慮した低消費電力の設計がますます重要になります。

### 3. セキュリティ
- ネットワークに接続されるデバイスの増加に伴い、組み込みシステムのセキュリティ対策が必須となります。

---

## 学習リソース

1. **公式ドキュメント**
   - 各メーカーが提供するデータシート。
2. **開発環境**
   - ArduinoやRaspberry Piなどの開発ボード。
3. **オンラインリソース**
   - [depfields.com](https://depfields.com/background/) などの専門サイト。

---

## まとめ

組み込みシステムは、現代社会のあらゆる分野で重要な役割を果たしています。その背景を理解することで、より実践的な技術を学ぶ土台を築くことができます。

詳細については、公式ページをご覧ください: [depfields.com/background](https://depfields.com/background/)


# マイコン選定ガイド

## はじめに
[depfields.com](https://depfields.com/selection/) の「マイコン選定ガイド」では、プロジェクトに適したマイコンを選定するためのポイントが詳しく解説されています。本記事では、その内容を簡潔にまとめ、初めてマイコンを選ぶ方から経験者まで役立つ情報を提供します。

---

## マイコン選定の基本ステップ

### 1. プロジェクト要件の明確化
- **使用目的**
  - 制御対象や必要なタスクを明確にします。
- **性能要件**
  - 必要な処理速度やリアルタイム性。
- **環境条件**
  - 動作温度、耐振動性、防水性能など。

### 2. 必要なリソースの確認
- **メモリ容量**
  - プログラムサイズとデータ保存に十分なフラッシュメモリとRAM。
- **周辺機能**
  - GPIOの数や通信インターフェース（UART、I2C、SPIなど）。
- **消費電力**
  - バッテリー駆動の場合、低消費電力のマイコンが重要。

### 3. 開発環境の選定
- **ツールチェーン**
  - コンパイラやIDE（例: Keil、STM32CubeIDE）。
- **サポートの充実度**
  - メーカーのドキュメントやコミュニティの活発さ。

---

## マイコン選定時の注意点

### 1. オーバースペックに注意
- 必要以上に高性能なマイコンはコストが高く、消費電力も大きくなります。

### 2. 互換性の確認
- 他のシステムや部品との互換性を考慮。

### 3. 供給状況の安定性
- 長期間にわたり安定供給される製品を選びましょう。

---

## おすすめのマイコンシリーズ

### 1. ARM Cortex-M
- **特徴**: 高性能・柔軟性。
- **用途**: IoTデバイス、リアルタイム制御。

### 2. AVR（Arduinoベース）
- **特徴**: 初心者に優しい。
- **用途**: 教育、プロトタイピング。

### 3. PIC
- **特徴**: 低消費電力、産業向け。
- **用途**: 小型家電、センサーデバイス。

---

## 学習リソースと開発サポート

### 推奨リソース
1. **メーカー公式ドキュメント**
   - データシートやアプリケーションノート。
2. **オンラインフォーラム**
   - Stack Overflow、メーカーコミュニティ。
3. **学習サイト**
   - [depfields.com](https://depfields.com/selection/) の関連ページ。

### 推奨開発ツール
- **IDE**
  - STM32CubeIDE、Atmel Studio。
- **デバッグツール**
  - JTAGデバッガ、シリアルモニタ。

---

## まとめ

マイコン選定はプロジェクトの成否を左右する重要なステップです。本記事の内容を参考に、目的や要件に応じた最適なマイコンを選びましょう。

詳細な情報は公式ページをご覧ください: [depfields.com/selection](https://depfields.com/selection/)


# 組み込み開発環境の構築ガイド

## はじめに
[depfields.com](https://depfields.com/environment/) の「組み込み開発環境」ページでは、組み込みシステムの開発を始めるために必要な環境構築について詳しく解説されています。本記事では、その内容を簡潔にまとめ、初心者がスムーズに開発を始められるようサポートします。

---

## 開発環境構築の基本ステップ

### 1. 必要なツールの準備
- **コンパイラ**
  - 組み込み向けプログラムをビルドするためのツール。
  - 例: GCC（GNU Compiler Collection）、Keil MDK。
- **統合開発環境（IDE）**
  - プログラムの編集・ビルド・デバッグを一元管理できるツール。
  - 例: STM32CubeIDE、Atmel Studio。
- **デバッグツール**
  - プログラムの動作確認やトラブルシューティングに必要。
  - 例: JTAGデバッガ、SWDデバッガ。

### 2. 開発ボードの選定
- 開発に使用するマイコンボードを選びます。
- 例:
  - Arduino
  - STM32 Nucleo
  - Raspberry Pi Pico

### 3. ドライバやライブラリのインストール
- 開発ボード用のドライバやライブラリをインストールします。
- メーカーの公式サイトからダウンロードするのが推奨されます。

### 4. 必要なプログラム言語の設定
- 主にC言語やC++が使用されます。
- 開発環境で適切なプログラミング言語を選択します。

---

## 推奨する開発環境

### IDEの選択肢
- **STM32CubeIDE**
  - STM32シリーズのマイコン向け。
- **Keil MDK**
  - ARMマイコン全般に対応。
- **Atmel Studio**
  - AVRマイコンやSAMシリーズ向け。

### デバッグツール
- **ST-Link**
  - STM32シリーズ用のデバッグツール。
- **J-Link**
  - 汎用性が高いJTAGデバッガ。

---

## 開発環境構築のヒント

### 1. 最初は公式チュートリアルに従う
- 開発ボードやIDEには公式のセットアップガイドが用意されています。
- 例: STM32CubeIDEのクイックスタートガイド。

### 2. 環境変数の設定
- GCCなどのツールを使用する場合、環境変数を正しく設定する必要があります。
- パスの設定を忘れないようにしましょう。

### 3. プロジェクトテンプレートの活用
- サンプルコードやテンプレートを利用することで、環境構築の手間を省けます。
- メーカーの公式サイトやGitHubに多数公開されています。

---

## 学習リソース

### 公式ドキュメント
- 各ツールやボードの公式ガイドを活用。
- 例:
  - [STM32CubeIDE ドキュメント](https://www.st.com/en/development-tools/stm32cubeide.html)

### オンラインチュートリアル
- YouTubeやブログで公開されている初心者向け解説動画。

### コミュニティフォーラム
- Stack Overflowやメーカー公式フォーラムで質問・交流。

---

## まとめ

組み込み開発環境の構築は、初めてのステップとして非常に重要です。本記事を参考に、自分に合ったツールや開発ボードを選び、スムーズに開発を始めましょう。

詳細な情報は公式ページをご参照ください: [depfields.com/environment](https://depfields.com/environment/)


# 組み込み開発におけるC言語の重要性と学習ポイント

## はじめに
[depfields.com](https://depfields.com/c-language/) の「C言語」ページでは、組み込みシステムにおけるC言語の役割や基礎的な内容が解説されています。本記事では、その内容を簡潔にまとめ、C言語を使って組み込み開発を始める方に向けたガイドを提供します。

---

## 組み込みシステムにおけるC言語の重要性

### 1. ハードウェア制御に最適
- C言語は低レベルなハードウェア制御が可能で、組み込みシステムに最適化されています。
- 例: レジスタの直接操作、ポインタを使ったメモリ管理。

### 2. コンパクトで効率的
- 組み込みシステムではリソース（メモリ、処理能力）が限られているため、C言語の軽量性が有利です。

### 3. 幅広いサポートと互換性
- ほとんどのマイコンプラットフォームでC言語がサポートされており、豊富なライブラリが利用可能です。

---

## 学ぶべきC言語の基礎

### 1. 基本構文
- **データ型と変数**
  ```c
  int a = 10;
  float b = 5.5;
  char c = 'A';
  ```
- **条件分岐とループ**
  ```c
  if (a > 0) {
      // 処理
  }

  for (int i = 0; i < 10; i++) {
      // 繰り返し処理
  }
  ```

### 2. ポインタとメモリ管理
- **ポインタの基本**
  ```c
  int x = 10;
  int *ptr = &x;  // xのアドレスをポインタに代入
  *ptr = 20;      // xの値を変更
  ```
- **動的メモリ確保**
  ```c
  int *arr = malloc(10 * sizeof(int));
  free(arr);  // メモリ解放
  ```

### 3. 関数
- **関数の定義と呼び出し**
  ```c
  int add(int a, int b) {
      return a + b;
  }

  int result = add(5, 10);
  ```

### 4. プリプロセッサディレクティブ
- **マクロ定義**
  ```c
  #define LED_PIN 13
  ```
- **条件付きコンパイル**
  ```c
  #ifdef DEBUG
  printf("Debug mode\n");
  #endif
  ```

---

## 組み込み特有のC言語のポイント

### 1. レジスタ操作
- ハードウェアを制御するために直接レジスタにアクセスする必要があります。
  ```c
  #define PORTA (*(volatile unsigned int *)0x40010800)
  PORTA = 0x01;  // レジスタに値を書き込む
  ```

### 2. 割り込み処理
- 割り込みハンドラの記述
  ```c
  void __attribute__((interrupt)) Timer_Handler(void) {
      // 割り込み処理
  }
  ```

### 3. 組み込みライブラリの使用
- マイコン特有のライブラリ（例: HALライブラリ、CMSIS）の活用。

---

## 学習リソース

### 推奨書籍
- 『新・明解C言語 入門編』
- 『Cプログラミング ポインタ完全攻略』

### オンラインリソース
- [depfields.com](https://depfields.com/c-language/) の関連ページ。
- YouTubeやUdemyのC言語講座。

---

## 学習の進め方

1. **基礎を固める**
   - 一般的なC言語の書籍やチュートリアルで基本を学びます。
2. **組み込み特化の練習**
   - マイコン用の開発環境を構築し、簡単なプロジェクトを実施。
3. **実践プロジェクト**
   - LEDの点灯、センサーデータの取得など、ハードウェアを操作するプログラムを作成。

---

## まとめ

C言語は組み込みシステムの基本であり、効率的かつ柔軟な開発を可能にします。本記事を参考に、基礎から応用までステップアップしていきましょう。

詳細な情報は公式ページをご覧ください: [depfields.com/c-language](https://depfields.com/c-language/)






## 記事内の用語ストック(後で調べるため用)
| 用語 | 解説 |
|:-:|:-:|
| SPL(スタンダードペリフェラルライブラリ) |     |
| HAL |  |
| LL |   |
| Mbed|   |
|ST-Link/V2  |   |
|   |   |
|   |   |
|   |   |
|   |   |