2018年2月23日金曜日

STM32 開発環境構築 Nucleo Lチカまで on Mac memo

[目標]
以下のインストール
・統合開発環境 SW4STM32
・コード生成ツールSTM32CubeMX
その後
・Nucleo L152RE でLチカ

[手順]
== 統合開発環境 SW4STM32 ==
  1. http://www.st.com/ja/development-tools/sw4stm32.html
    からOpenSTM32Community に入って,
    http://www.openstm32.org/Downloading%2Bthe%2BSystem%2BWorkbench%2Bfor%2BSTM32%2Binstaller
    からMAC OS/X 用の最新版をダウンロード。
    今回は,"install_sw4stm32_macos_64bits-v2.4.run"をダウンロード。
    OpenSTM32に入るには,アカウント登録が必要。
    注意 : ひたすら遅い。1時間くらいかかる。
  2. ファイルをダウンロードした場所でターミナルで開く。
    以下のコマンドを入力。
    $ chmod 755 install_sw4stm32_macos_64bits-v2.4.run 
    $ ./install_sw4stm32_macos_64bits-v2.4.run
  3. インストールのWindowが開くので,そのままデフォルトの設定で進めていく。
    ライセンスとかは,全部agreeにする。http://www.openstm32.org/Installing%2BSystem%2BWorkbench%2Bfor%2BSTM32%2Bwith%2Binstaller

    インストール始まったなーと思っても,なんか進まない時は,ターミナルを確認する。実はPasswordを求められてる。
  4. 終わり!
インストール画面
ターミナル パスワード入力


ついでに,AC6を起動して,アップデートを行う。
Help->Check for Updatesで,アップデートを開始。

== コード生成ツールSTM32CubeMX ==

  1. http://www.st.com/en/development-tools/stm32cubemx.html?sc=stm32cubemx
    から,CubeMXをダウンロード。zipファイルでダウンロードできる。
  2. AC6を立ち上げ,Help->Install New Software を選択。
  3. 無理だった。zipを選択しても,インストールできない。
  4. なので,別の方法を。zipファイルを解凍すると,.Appファイルがある。
  5. SetupSTM32CubeMX-4.24.0.app をダブルクリックする。
  6. インストールのWindowが開くので,デフォルトでインストール。
  7. アプリケーション->STMicroElectronicsにSTM32CubeMX.appがあることを確認。
  8. 終了!




== プロジェクトの作成 ==
デフォルトだと,AC6のワークスペースは,
Documents\workspace になるので,ここにプロジェクトを作成する。

まず,STM32CubeMXを起動する。
NewProjectを選択する。
Board Selectorタブをクリックして,Nucleo-L152RE を選択して,「StartProject」をクリック。

全てのペリフェラルをデフォルトで初期化するか聞かれるので,「Yes」を選択。

すると,こんな感じで,マイコンのピンを選択できる画面が出てくる。


Documents\workspace\NucleoL152RE_Blink フォルダを作って,NucleoL152RE_Blink.iocとして保存する。
次に,コードを生成する。
EclipseのプロジェクトをCubeMXから作成したいので,プロジェクト設定を行う。
Project->Setting を選択。


ProjectSettings ダイアログが開く。
Projectタブで,次のように設定する。
ProjectNameとProjectLocationを適当に設定して,「GenerateUnderRoot」のチェックを外す。


CodeGeneratorタブで,次のように設定する。
「Copy all used libraries into the project folder」と,
「Generate peripheral initialization as a pair of ・・・」にチェックを入れる。
(容量は食うかもしれんが,なんとなく,わかりやすくなりそうだから。)

で,OKを押す。
Project->Generate Code をクリックして,コードを生成する。
これで,AC6のプロジェクトファイルも同時に作ってくれる。
コード生成に成功!と言われる。「Open Project」を選択して,プロジェクトを開く。
すると,AC6が立ち上がり,作成されたプロジェクトを編集できる!
インポート成功!って言われたらOK!

workspaceの中を見てみると,以下のような感じになる。
作成されたプロジェクトの中にも,.iocファイルが作成されている。
もしかして,最初の保存はいらなかったかも。まぁいいや。
今後の課題と言うことで。

→ workspace->NucleoL152RE_Blink.ioc は消しても問題ない。
  CubeMXのコード生成で作成した,
  workspace->NucleoL152RE_Blink->NucleoL152RE_Blink.ioc
  を編集していけば良い。


== プログラム実行 ==

プロジェクトも作ったので,プログラムを実行する。
とはいえ,何も起きないけど。
前提として,NUCLEO L152RE をPCと接続しておくこと。

生成したプロジェクトを開いた状態がこんな感じ。
左のサイドバーのNucleoL152RE_Blinkプロジェクトを右クリック
->「Debug As」->「AC6 STM32 C/C+ Application」をクリック

なんかちょっとダイアログが出た末に,次のダイアログが登場。
デバッグ始めるよー的な?
とりあえず,「Yes」をクリック。

すると,AC6の画面が切り替わる。

ここまできたらOK!「Resume」ボタン,もしくは「F8」を押したら,プログラムが実行される!
したところでまだ何も起きないけど。



== Lチカプログラム作成 ==
まず,コード補完機能を使えるようにするため,
コード補完のショートカットを「Ctrl + Space」から変更する。
"https://qiita.com/rotomx/items/784211ea16760eecac83"
→ とりあえず,「Alt+Space」にした。

main.cを開いて,

int main(void) 関数内のwhile(1)の内部にLチカコードを記述する。
以下,コード

--------------------------------------------------------------------

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
    HAL_Delay(1000);
    HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
    HAL_Delay(1000);

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
  }

  /* USER CODE END 3 */

--------------------------------------------------------------------

トンカチ(🔨)みたいなボタンを押して,Buildする。
特にエラーが出なければ,デバッグする。
1回デバッグしているため,
左のサイドバーのNucleoL152RE_Blinkプロジェクトを右クリック
->「Debug As」->「AC6 STM32 C/C+ Application」をクリック
をしなくてもいい。
虫っぽいボタンを押して,デバッグを開始する。
画面が切り替わるので,Breakpointを貼ってみる。

HAL_GPIO_WritePin(・・・) と書いている行の左部分にカーソルを合わせて,
「Add Breakpoint」を選択する。



「Resume」ボタン,もしくは「F8」を押したら,プログラムが実行される。
Breakpointを貼ったところでプログラムが毎回止まる。
もう一度「Resume」ボタン,もしくは「F8」を押したら,プログラムが再開される。
1個目のBrekapointで止まった時は,LEDは消えている。
2個目のBreakpointで止まった時は,LEDはついている。
これは,Breakpointを貼った行のプログラムが実行される手前のところでプログラムが停止されるから。

Breakpointをなくしたら,ずっとLEDが点滅し続ける。
周期は1秒間隔!
Lチカ終了!
できた!

[参考]
http://happytech.jp/wordpress/2017/05/28/ide-for-stm32-mcu-sw4stm32/

[おまけ]
今回諦めたけど,EclipseにCubeMXのプラグイン入れる方法を昔載せてた。
http://chuchulabo.blogspot.jp/2017/05/stm32macos.html

2017年5月21日日曜日

中華STM32の開発環境整備(macOS) メモ


使用するICE?:
まず,参考にしたサイト:
 →主にここ。
  Windows向け?やけど,全部mac向けのものをダウンロードしてインストール。
  差分を以下に列挙。

 →STM32CubeMX のインストールについて
  サイトのリンクは,eclipseのプラグインではないっぽい。
  eclipseのプラグインへのリンクは書いてあるけど,引っかかったので。
  eclipseプラグインは以下URLからダウンロード
  あと,zipじゃなくても,解凍されたフォルダを選択すればOK

 →ToolChainのインストールについて
  Windowsは,exeファイルを実行すればいいだけかもしれないが,
  Macだと,zip解凍後,PATHを通す必要がある?
  1. DLしたzipファイルを解凍後,
    /usr/local  にコピー。
  2. 次にPATHを通す。
   ターミナルで
   $ export PATH=/usr/local/gcc-arm-none-eabi-5_4-2016q3/bin:$PATH
   を実行。
   $ echo $PATH
   でパスが設定されていることを確認。
   ついでに,
   $ which arm-none-eabi-gcc
   /usr/local/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcc
   となったらOK?
  PATHを通すのに参考にしたURL
  http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnvMac_PathSetup
  http://qiita.com/soarflat/items/09be6ab9cd91d366bf71
  http://qiita.com/soarflat/items/d5015bec37f8a8254380
  
 →ビルドツールのインストールについて
  いらん気がする。
  GNU ARM Eclipse Plug-ins
  をEclipse に入れてたらいいような感じ?
  Windows はいるけど,Macはいらない?気がする。
  ただ,ツールチェインインストール後に,GNU ARM Eclipse Plug-ins をインストールすることを推奨するって言ってるサイトが。
  http://gnuarmeclipse.github.io/plugins/install/
  念のため,GNU ARM Eclipse Plug-ins をEclipseにもう一回追加。
  → しようと思ったけど,できなかった。まぁいけるでしょ。

 →OpenOCDのインストールについて
  gnuarmeclipse-openocd-osx-0.10.0-201704182147-dev.pkg
  をダウンロード。
  普通にインストールした。

 →STM32 ST-Link Utility のインストールについて
  Windows版しかない。
  参考にしたURL
  http://macappstore.org/stlink/
  https://blog.spiralray.net/?p=240
  $ brew install st-link
  ってしただけ。本当にこれで良いのか?(HomeBrewが必要。)
  stm32plusは何もしてない。(よくわからない)

 →OpenOCDの設定について
  Name : OpenOCD(STM32F103C8T6) にした(Nucleo F0使うわけじゃないし)。
  String Substitution(ストリング置換) は,
  Eclipse->環境設定->Run/Debug->String Substitution にあった。
  (特に何もしなくても,String Substitutionは設定されてた。)

開発環境整備はこれで終わり?本当に?
プロジェクト作成とかもしてないけど,とりあえずメモ。
初めてするから,ログは必要。

2017年5月5日金曜日

[raspi][apache] phpでsudo pythonの実行

今日の作業で,覚えてる限りで,とりあえず忘れたらあかんそうなところ

phpで管理者権限でpythonを実行したい時は,

shell_exec("sudo python xxxx.py");
とすればいい。
ただし,以下の設定が必要。(他にあったかなぁ?)


$sudo visudo
-> 追加
   www-data ALL=(ALL) NOPASSWD: ALL
   問題点
   ・セキュリティ的によろしくないとあった。
   ・HPからどんなスクリプトでもパスワードなしで実行できる?

$sudo chown -R www-data:www-data /var/www
-> /var/www 以下の権限を変更。
   元々はroot。
   Apacheの実行権限はデフォルトでwww-data。
   Apacheでスクリプトとか実行したい場合は,www-dataにしておく必要がある?

他にも,
$sudo chmod 755 xxx.py
とか試したけど,関係ないっぽい。
chmodの値は,
http://qiita.com/shisama/items/5f4c4fa768642aad9e06
を参考にした。

htmlからのPOSTとかも含めて,色々巡ったけど。。。
とりあえず,safariのタブに残ってるのだけ並べる。
・http://www.feijoa.jp/laboratory/programming/phpEnvironment/
・http://qiita.com/irxground/items/c8537d30e9760c5b3e5c
・http://php.birdlab.com/tips/1
・https://liginc.co.jp/268697
・https://blog.trippyboy.com/2013/php/php-postされてきている値をとにかく表示したいの巻/
・http://stackoverflow.com/questions/35016098/raspberry-pi-cant-execute-script-py-from-php

終わり!
なんか久々に更新したなぁ・・・

2016年8月20日土曜日

Raspberry piにMySQLを入れる

http://kamuycikap.hatenablog.com/entry/2015/02/25/184420
http://make.bcde.jp/raspberry-pi/データベースを使うmysql/
を参考にした。終わり。

Raspi Apache PHP Install -> File Upload Memo

ラズパイでApache使ってwebサーバを立ち上げる。
Apache使ってWebサーバ構築したよ!的なのはいっぱい見る。
インストールして起動したよ!てところまで書いてる。

でも、その後どうやればいいのか誰も書いてない。
自分はホームページとか作ったことないし。。。
どうしよう。。。

忘れそうやし、わけわからんかったけど、実際にやったことをメモ(覚えてる範囲で)。

▪️OS
OS  :Raspbian  Jessie。
これに関してはもう忘れたので、パス。

▪️SSH
これに関しても忘れたので、パス。
http://qiita.com/morizotter/items/48ad0b17207b0dd66cac
http://usicolog.nomaki.jp/engineering/raspberryPi/raspberryPi_SSH.html
さんとか、いろいろ参考にした記憶はあるけど。。。
巡ったサイトが多すぎてリストにする気が起きない。(他の操作に関しても)
有線LANだとサクッといくっぽい?
無線LAN環境しかないから、RaspiにUSB無線LAN子機つないで、なんかいろいろ設定した。
ここでかなり時間食った気がする。confファイルをいじってなんかいろいろしたような・・・忘れた。

▪️Apache
http://usicolog.nomaki.jp/engineering/raspberryPi/raspberryPi_Apache2.html
https://www.raspberrypi.org/documentation/remote-access/web-server/apache.md
一番シンプルで初心者な自分的にはわかりやすかった。
とりあえず、
sudo apt-get install apache2
ってすれば、Apache入るし、勝手に動作開始する。
Raspiのブラウザ起動して、URLの欄に
http://localhost/
って打つと、
It Works!
ってでる。そしたらOK。起動できてる。
もしくは、ifconfigかなんかでRaspiに割り当てられてるIPアドレス見て、
http://xxx.xxx.xxx.xxx
(例えば、http://192.168.0.3)とかやると、Raspiにつながって、
It Works!
って同じようにでる。

みんなRaspiに外部からアクセスするためには、ルータをいじって、ポート80を解放しましょうとか書いてたけど、自分はローカルで使いたかったので、無視した。

▪️PHP
とりあえず、なんかみんなしてるし入れといた。
sudo apt-get install php5 libapache2-mod-php5 -y
これを叩けば終わり。勝手にインストールしてくれる。


で、こっからが問題。
まず、Raspiにアクセスした時、どこのファイルが表示されているのか?という問題。
絶対パスで、/var/www/html/index.html のファイルがそれにあたる。
つまり、これを書き換えれば、自分好みのHPを表示できる。
ただし、/var/www/以下?のフォルダ、ファイルはすべてroot権限でないと編集できないようになってる。
だから、編集する時は、sudo nano index.html みたいな感じで、管理者権限で毎回実行した。
ちなみに、オリジナルのindex.htmlを変更して、戻らなくなるのが怖かったので、
sudo cp index.html index_original.html
ってして、コピー作ってから編集した。
なんか、Apacheは、index.htmlとか、index.phpとか、indexっていう名前のファイルを探して、表示してるらしい。

で、index.htmlを編集した。でも、自分はチキンなので、全部をまるっと変えるのではなく、<body> </body>の中身だけ変更。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Hello World</title>
    <style type="text/css" media="screen">
  * {
    margin: 0px 0px 0px 0px;
    padding: 0px 0px 0px 0px;
  }

  body, html {
    padding: 3px 3px 3px 3px;

    background-color: #D8DBE2;

    font-family: Verdana, sans-serif;
    font-size: 11pt;
    text-align: center;
  }

  div.main_page {
    position: relative;
    display: table;

    width: 800px;

    margin-bottom: 3px;
    margin-left: auto;
    margin-right: auto;
    padding: 0px 0px 0px 0px;

    border-width: 2px;
    border-color: #212738;
    border-style: solid;

    background-color: #FFFFFF;

    text-align: center;
  }

  div.page_header {
    height: 99px;
    width: 100%;

    background-color: #F5F6F7;
  }

  div.page_header span {
    margin: 15px 0px 0px 50px;

    font-size: 180%;
    font-weight: bold;
  }

  div.page_header img {
    margin: 3px 0px 0px 40px;

    border: 0px 0px 0px;
  }

  div.table_of_contents {
    clear: left;

    min-width: 200px;

    margin: 3px 3px 3px 3px;

    background-color: #FFFFFF;

    text-align: left;
  }

  div.table_of_contents_item {
    clear: left;

    width: 100%;

    margin: 4px 0px 0px 0px;

    background-color: #FFFFFF;

    color: #000000;
    text-align: left;
  }

  div.table_of_contents_item a {
    margin: 6px 0px 0px 6px;
  }

  div.content_section {
    margin: 3px 3px 3px 3px;

    background-color: #FFFFFF;

    text-align: left;
  }

  div.content_section_text {
    padding: 4px 8px 4px 8px;

    color: #000000;
    font-size: 100%;
  }

  div.content_section_text pre {
    margin: 8px 0px 8px 0px;
    padding: 8px 8px 8px 8px;

    border-width: 1px;
    border-style: dotted;
    border-color: #000000;

    background-color: #F5F6F7;

    font-style: italic;
  }

  div.content_section_text p {
    margin-bottom: 6px;
  }

  div.content_section_text ul, div.content_section_text li {
    padding: 4px 8px 4px 16px;
  }

  div.section_header {
    padding: 3px 6px 3px 6px;

    background-color: #8E9CB2;

    color: #FFFFFF;
    font-weight: bold;
    font-size: 112%;
    text-align: center;
  }

  div.section_header_red {
    background-color: #CD214F;
  }

  div.section_header_grey {
    background-color: #9F9386;
  }

  .floating_element {
    position: relative;
    float: left;
  }

  div.table_of_contents_item a,
  div.content_section_text a {
    text-decoration: none;
    font-weight: bold;
  }

  div.table_of_contents_item a:link,
  div.table_of_contents_item a:visited,
  div.table_of_contents_item a:active {
    color: #000000;
  }

  div.table_of_contents_item a:hover {
    background-color: #000000;

    color: #FFFFFF;
  }

  div.content_section_text a:link,
  div.content_section_text a:visited,
   div.content_section_text a:active {
    background-color: #DCDFE6;

    color: #000000;
  }

  div.content_section_text a:hover {
    background-color: #000000;

    color: #DCDFE6;
  }

  div.validator {
  }
    </style>
  </head>
  <body>
    <?php
      echo "Hello World!";
    ?>
    <?php
      echo date('Y-m-d H:i:s');
    ?>
  </body>
</html>



すると、こうなる。http://localhost を叩いた時、Hello Worldって出てれば成功。
あとは、HTMLの文法にのっとって好きに書いたら動くはず。(これはまだ
やってない)

とりあえず、index.htmlはできたので、今度は、ファイルを送信・受信したいと思った次第で。
/var/www/html/ の下に、send_text.phpと、receive_text.phpを作成する。
phpは、htmlの中に組み込める言語らしく、phpで書いた部分があれば、htmlではなく、拡張子をphpとする必要がある。ただ、phpで書いた部分がなくても、別にphpとしていて問題なく動くので、とりあえずphpとした。
cdで/var/www/html/に移動して、
sudo nano send_text.php
とすると、send_text.htmlが作成され、編集画面に遷移する。
nanoは、ただのテキストエディタ。vim使ってる多いけど、自分には難しかったよ。。。
send_text.htmlは、次の感じ。これ、どっかからコピペした気がする。
URL:http://www.php-labo.net/tutorial/php/upload.html
かな?
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>FileUploadTest</title>
</head>
<body>
<form action="http://XXX.XXX.XXX.XXX/receive_text.php" method="POST" enctype="multipart/form-data">
  <input type="file" name="file">
  <input type="submit" value="ファイルをアップロードする">
</form>

</body>
HTMLのフォームってやつを使って、ファイルをアップロードする。というか、送信する。
<form action="http://XXX.XXX.XXX.XXX/receive_text.php" method="POST" enctype="multipart/form-data">
  <input type="file" name="file">
  <input type="submit" value="ファイルをアップロードする">
</form>
っていうところが、肝。
HTMLのフォームってやつは、ボタンを勝手に作ってくれるらしい。
actionが、ボタン押したらどのファイル実行する?ってやつ。
だから、これから作るreceive_text.phpを実行してくださいってことで、これを指定。
http://XXX.XXX.XXX.XXXは、今までRaspiにアクセスしてきたIPアドレス入れる。
だから、実際には、例として、http://192.168.0.3/receive_text.php ってなる。
methodは、POST、GETとかがあるらしいが、テキストファイルとかのファイルを送る時はPOSTらしい。GETは文字列データとかかな。

次、receive_text.php作る。
sudo nano receive_text.php
send_text.phpで作ったように、receive_text.phpも作成する。
例のごとく、これもコピペなわけで・・・
URL:http://www.php-labo.net/tutorial/php/upload.html
http://www.php-ref.com/web/03_move_uploaded_file.html
send_text.phpとおなじ。
<html>
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>sample</title>
</head>
<body>
<p>
<?php

echo "Upload File Name : " , $_FILES["file"]["name"] , "<BR>";
echo "MIME Type        : " , $_FILES["file"]["type"] , "<BR>";
echo "File Size        : " , $_FILES["file"]["size"] , "<BR>";
echo "Temp File Name   : " , $_FILES["file"]["tmp_name"] , "<BR>";
echo "Err Code         : " , $_FILES["file"]["error"] , "<BR>";

if (is_uploaded_file($_FILES["file"]["tmp_name"])) {
  if (move_uploaded_file($_FILES["file"]["tmp_name"], "/var/www/html/img/" . $_FILES["file"]["name"]))
  {
    chmod("/var/www/html/img/" . $_FILES["file"]["name"], 644);
    echo $_FILES["file"]["name"] . "をアップロードしました。";
  } else {
    echo "ファイルをアップロードできません。";
  }
} else {
  echo "ファイルが選択されていません。";
}

?>
</p>
</body>

</html>
多分、ちゃんとファイルが送られてきてるのかを見るために、ファイルの情報を表示するようにちょっと追加したのか?わからんけど。。。ほぼ丸こぴですね。
ここで重要なのが、
send_text.phpの
<input type="file" name="file">
receive_text.phpの
$_FILES["file"]["name"]
の赤字部分がおなじであること。(多分)
receive_text.phpの似たような箇所($_FILES["file"])は、全部同様に一致してないといけない。
これで終わり。
receive_text.phpは、/var/www/html/img/ に送られてきたファイルを保存するだけ。
(テキストファイルなのにimgフォルダとは・・・)
なので、
htmlフォルダ内にcdで移動して、
sudo mkdir img
として、imgフォルダを作成しておく必要がある。

あとは、Raspiのブラウザ(他のPCからでもいい)で、
http://XXX.XXX.XXX.XXX/send_text.php
とすれば、さっき作ったsend_text.phpの画面が開く。
/var/www/html/以下のファイルは、こんな感じで参照できるっぽい。
ファイルを指定して、Submitボタンを押せば、自動的にreceive_text.phpの画面に遷移する。
成功したら"○○○○○をアップロードしました。"ってでるし、
失敗したら、"ファイルをアップロードできません。"ってでる。
ファイル選択せずにSubmitボタン押せば、"ファイルが選択されていません。"ってでる。

一応、/var/www/html/img/の中に、ファイルがアップロードされているかどうかを確認したらいいと思う。
cdで移動して、lsでみる。

忘れてた。
/var/www/以下の権限をrootからwww-dataに変更した。
関係あるかはわからんけど。
Apacheはwww-dataというユーザーとグループで動かされているらしい。
もしかしたら、phpからのファイルコピーとかは、これをしていないといけないのかもしれない。
あと、piユーザーで動かす時には、piユーザーをwww-dataのグループに所属させてやらないといけない。とかも書いてあったから、それもした。
http://netlog.jpn.org/r271-635/2013/01/raspberry_pi_webserver.html
http://takuya-1st.hatenablog.jp/entry/20130102/1357112844
とかを参考にした。

なんか躓きまくって、いろんなところ参照したし、いろいろ遠回りしたから、やったのはこれだけではないけど、もう書くのめんどいし終わり。



2015年9月5日土曜日

AVR コンパイルメモ -makefile を使わない-

Xcode つかってて、なんかbuildとかがうまく行かないこととか出てきた。使い方が悪いんやけど。。。
正直あんまりmakefileの中身とか理解できてないし、fuse bitの書き換えで、AVR何個か死んだし。
これ以上死んでもらうと困る・・・

ということで、makefileが何してるのかとかもちょっとだけ触れてみようと、makefileを使わずに、というか、Xcodeも使わずに、その辺のエディタを使って編集、ターミナルでたたいてbuild的なことをすることにした。

AVR : ATmega168p
CPU : 8MHz(内蔵)
プログラマ : AVR ISP MK2

まず、main.cからオブジェクトファイルを生成。main.oが作られる。
avr-gcc -Os -Wall -DF_CPU=8000000 -mmcu=atmega168p -c main.c -o main.o

次に、オブジェクトファイルmain.oから実行ファイル形式のmain.elfを生成。
avr-gcc -Os -Wall -DF_CPU=8000000 -mmcu=atmega168p -o main.elf main.o

(次に、既にあれば、main.hex ファイルを削除)
rm -f main.hex

次に、main.elfファイルからmain.hexファイルを生成。
avr-objcopy -j .text -j .data -O ihex main.elf main.hex

これで、AVRに書き込むためのファイル(main.hex)を用意できる。
プログラムのサイズを確認する場合は、次のように書く。
avr-size --format=avr --mcu=atmega168p main.elf

ちなみに、CrossPackAVRのmakefileがやってるのと一緒。

次に、書き込み。
AVRとつないでー、なんかその辺は適当に。
つなぎ終わって、電源入れたら、次のように書く。
avrdude -c avrisp2 -P usb -p atmega168p -U flash:w:main.hex:i

これで書き込まれる。今回、内蔵発振子を使って8MHzで駆動させるから、fuse bitも変更しないと行けない。 AVR calculator でググって、サイトでfuse bitを求めて、次のように書く。
avrdude -c avrisp2 -P usb -p atmega168p -U lfuse:w:0xe2:m -U hfuse:w:0xdf:m -U efuse:w:0xf9:m

ちなみに、デフォルトでは、プリスケーラが1/8になってて、1MHz駆動になってるらしい。fuse bitの中にそれを解除する所があるから、変更が必要。

これで終了。
ターミナルつかってると、なんかやってる感じでるよね。