WAVプレーヤーの製作(その10 タッチパネルの割り込み処理)

stm32マイコンのお勉強も既に10回にもなってしまいました。今回はstm32で割り込み処理を行います。

おっと、半月以上ブログ更新をしていなかったら、ブログ編集画面のアイコン群が一部リニューアルされてます。
特に使う「画像挿入」が「ファイル挿入」に変わってます。機能が変わったのかな?

最初にお勉強対象の姿を

【ファイラー画面】
stm32_proj_33.jpg

前回の黄色のバックから薄い水色にしました。
本当は透過できる文字を使い、綺麗な画像の上にファイル名を載せたいのですが、透過文字を使うことや、
何と言ってもメモリが既に440kを超えているのでSTBee環境(512k)ではチョット無理そうです。

【音楽再生画面】
stm32_proj_34.jpg

白い文字やアイコン、枠が目立つようにファイラー画面よりも少し濃い目の水色にしましたが、デジカメ映像は色が薄く写ります。

音楽を再生しながらアイコンボタンをタッチするには、ポーリング処理でだけではちょっと難しそうなので、タッチパネルの割り込み機能を使う必要があります。但し、割り込み後にタッチした座標を得ることはできないので、Play中にタッチ座標のポーリング処理を行いながら、割り込み処理ではタッチ座標からアイコンの位置を判別しそのアイコン番号を得るという処理をしています。
これで取得したアイコン番号から、ボリュームやバスブースト処理はPlayルーチン内で処理します。曲の一時停止はPlay内で行うことになりますが、曲の移動などはPlayを呼び出すルーチンに戻ってから、Playを呼び直すという方法が良いかもしれません。

画面の下にvs1011を使った再生部とイヤホンが見えてます。再生しながら割り込み時の音の状態(音量の増減、バスブーストの効き方、音切れ状態等)を確認しています。

音量調整時は瞬間的に曲再生が中断されるので、小さなプッという音が入りますが、レベルが小さいのでさほど気になりません。音量調整量は2dBピッチにしましたが細かすぎるようです。倍か3倍ピッチ程度が良さそうです。しつこくアイコンを押していると、音楽再生が止まって動かなくなることがあります。これは原因調査と対策を考えねばなりません。
バスブーストのやり方は以前、pic24fでプレーヤーを作ってみた時のpicfunの記事を参考にしています。この時はバスブーストを試さなかったのですが、曲目によっては有用な場合もあるようです。

picfunの記事を読んでいて気が付いたのですが、vs1011eには単一周波数の音を出す機能もあるので、1kHz等を出してオーディオ系統の歪率なども計測する価値はあるかなあ、等とも思いました。さて音源そのものの品質はOKなのでしょうかね?


画面に載せている透過アイコンを自前で作ろうと試みましたが挫折してます。

GIMP2で外側を透過にしたpngファイルを作成します。24x24 pixelを拡大した画像です。
stm32_proj_36.jpg

とんすけさんのブログページで透過画像の作り方を学びました。
ここで紹介されている、pngtopnpやppmtobmpは、最終的にこちらのページでダウンロードしました。

これでできたのがこのbmp24ビット画像です。GIMP2に読み込ませて表示しています。
stm32_proj_37.jpg

残るは最終工程のrgb565画像生成です。

ところが、とんすけさん作のコマンド、bmp2lcd_rgb565のcソースをどうやってもコンパイルできません。
標準入出力の*stdinなどを exturn宣言しているところでのエラーを処置するスキルがありません。
仕方なく、cソースを参考にvb6で処理ツールを作ってみました。

あじゃ! 何だこれは
stm32_proj_35.jpg

どっかのビット処理にミスがありそうですが、1日かかっても解決しませんでした(まだしぶとくやるつもりですが・・・)

しょうがないので、先のプレイ画面のアイコンはとんすけさんのソースから借用いたしました。
とんすけさんのアイコンはとても繊細で良くできています。光が上から当たるのでそのグラディーションが綺麗です。そういう意味でも私のアイコンはまだぜんぜんダメレベルですね(笑) とんすけさんはホントにアマチェアなんでしょうか?ネ
まあ、私のレベルが低すぎるということで納得してますが。


さて本題の割り込み処理ですが、これには例によってすっかり嵌まり込みましたヨ。
以下、備忘録です。

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

・stm32で割り込み処理(今回はGPIOピンからの割り込みに限定します)するための手順は
(私がここで記載する必要は殆ど無いのですが、1.~5.はmiqnnetに詳しく記載されてます

1.GPIOにクロックの供給と初期化を行う
2.割り込み(EXTI)に使用するGPIOの指定を行う
3.割り込みEXTIの初期化を行う (私の理解ですが、EXTIは割り込みをするそのもの)
4.NVICの設定  (私の理解は、NVICは割り込みを管理するもの)
5.割り込みした処理を行うハンドラーを作る

6.割り込みの許可、不許可を制御する

*私が陥ったミスは、「2.~4.を連続して設定しないと割り込みが機能しない」ということでした。

(動作したコード例)

#define  PEN_PORT                       GPIOE
#define  PEN_GPIO_RCC                   RCC_APB2Periph_GPIOE
#define  PEN_PIN                        GPIO_Pin_3

void NVIC_TOUCHConfiguration(void)
{
  GPIO_InitTypeDef   GPIO_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  //T_PEN
  RCC_APB2PeriphClockCmd(PEN_GPIO_RCC | RCC_APB2Periph_AFIO,ENABLE);
  GPIO_InitStructure.GPIO_Pin = PEN_PIN; //PEN_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(PEN_PORT, &GPIO_InitStructure);

  GPIO_EXTILineConfig(PEN_PORTSOURCE, PEN_PINSORCE);

  EXTI_InitStructure.EXTI_Line = EXTI_Line3;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

意外に net に記載が無かった(少なかった?)のが、割り込みを禁止したり許可したりする処理です。
音楽プレーヤーでは再生を行っている時間の隙間を狙って割り込みをする必要があるが、再生のデータをプレーヤーに転送している最中に割り込まれたくないので、禁止・許可の処理が必須です。
私は以下のコードを使いました。

void NVIC_enable_TOUCH(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

void NVIC_disable_TOUCH(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  NVIC_Init(&NVIC_InitStructure);
}



まだ これからPlay 画面から中断させたり、戻す、進む、また進度表示や早送り等の機能も実装させたいと思います。

今のサイズは、STBee基板、TFT LCD基板、これを繋ぐ基板(SD,DACを積む)の3層重ねなので大分ごっついです。液晶を基板レスのものを使い、CPU+SD+DAC+電源を載せたスペシャル基板を作れば1枚構成で行ける目算があります。
JTAG等の書き込みやIOピン等も用意すればスペシャル改造も可能になれば更にGoodかな?

いっそのこと、CPUは407系を使えば1MEGAメモリなのでいろいろな機能を拡張できる。

想いは広がります。






コメントの投稿

非公開コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

No title

コメント頂いた方へ

メール送ってありますが届いているでしょうか?
プロフィール

haiga

Author:haiga
私のブログへようこそ!
電気オンチが始めた自作オーディオです
2010/3/17 電子工作をプラスしました。

自作オーディオの楽しみ共有のため、私が作ったパーツ提供をしてます。質問や要望を遠慮なくコメント欄に書き込んでください。

FC2カウンター
その日1回目にアクセスいただいた方の総カウントです
最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード