2017年01月16日

RTC使い方

今回はSTM32のRTC機能について紹介します。


環境は、
・STM32F373CCT6
 +SW4STM32(System Workbench for STM32)
 +STM32CubeMX(F3_1.6.0)
です。

48ピン以上の多くのMPUにはVBAT端子がついており、
32.768kHz水晶発振子と電池を接続するとRTC機能が使用可能です。

また、RTCの他に64byte程度のバックアップレジスタがあり、
電池で値を保持することが可能です。
例えば、ボタンや機器の状態等を保持することに使えそうです。


STM32CubeMX上でRTCを有効化し、
ActivateClockSourceとActivateCalenderにチェックを入れます。



◆設定

RTC_TimeTypeDef sTime;
sTime.Hours = 11;
sTime.Minutes =12;
sTime.Seconds = 13;
sTime.SubSeconds = 0;
sTime.TimeFormat = RTC_HOURFORMAT_24;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;

RTC_DateTypeDef sDate;
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 15;
sDate.Year = 0;//YEARは2017でなく、ある年を基準として設定します


HAL_RTC_SetTime(&hrtc, &sTime, FORMAT_BCD);
HAL_RTC_SetDate(&hrtc, &sDate, FORMAT_BCD);

で時刻や日付をセットします。


◆読み出し

RTC_TimeTypeDef gTime;
RTC_DateTypeDef gDate;
HAL_RTC_GetTime(&hrtc, &gTime, FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &gDate, FORMAT_BIN);
printf("YY MM DD : %d , %d, %d,  ",gDate.Year,gDate.Month,gDate.Date);
printf("HH MM SS : %d , %d, %d \n",gTime.Hours,gTime.Minutes,gTime.Seconds);

で時刻や日付を読み出し可能です。

◆バックアップレジスタ
バックアップレジスタは下記の関数で読み書き可能です。

書き込み
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0,0x01234567);
読み出し
uint32_t ROM=HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0);



外付けでRTCを別途つける必要なく、
水晶発振子と電池だけで簡単にRTC機能とその周辺の機能を実装可能です。
他にADCの設定でVBATの電源電圧の読み込みが可能なようです。


実験していて驚いたこととして、
一度、基板上の電池と32.768kHz水晶発振子を接続しておけば、
コードに直しても設定が保持され、時刻も進んでいることです。

MPU内のプログラムをRTCとは関係のないコードを書き込んでも
再度、RTCのプログラムに戻すと保持されていました。


一般的なMPUのRTCは別のプログラムを書き込んだ時点でRTCが停止し、
時刻やデータが消えてしまうのが一般的です。
実験のボードで使うにもSTM32は時刻やバックアップレジスタが保持されるのは
再設定の手間が省けて便利な機能だと思いました。
VBATとして電池端子が独立しているのも扱いが楽だと思いました。

posted by Crescent at 00:00| Comment(0) | TrackBack(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2017年01月11日

SMD部品の取り外し

今回はSMD部品(表面実装部品)を取り外しの実験についてご紹介します。


色々基板を試作していると失敗してしまうこともあります。
失敗した基板はともかく、実装した部品がもったいないと思っていました。
ただ、SMD部品の場合、取り外しで細く複数ある足を綺麗に外すのは
かなり難易度が高くなります。



SMD取り外し用の特殊な半田ごて工具を持ち合わせていないため、
安く綺麗に取り外す方法を検討していました。



今回は基板を再利用するのでなく、部品を再利用するため、
SMD部品の足をバーナーで熱して外す方法を試してみました。



バーナーといってもアウトドア用のバーナーは炎が太いため、
周辺のチップや基板を焼いてしまいます。
今回はポケトーチという小型で安価なバーナーを
ホームセンターで購入し、実験してみました。




小型でも1300度の炎になるため、
ある程度距離を離して全体をまんべんなくあぶる感じで。
5秒くらいあぶるとピンセットで横に動くようになり、
そのまま持ち上げると簡単に外れました。

img1.jpg


最初に加減が分からず、
熱し過ぎて基板のパターンが焼けて剥がれてしまいました(ピンセット先部分)。
他の部分は綺麗に取れました。

img2.jpg



今回外したチップはD-PAK、TQFP44pin、SSOP24pinです。
鉛フリーはんだのため、融点が高く取り外しに苦労すると思いましたが、
思った以上に簡単に外れました。
一部熱し過ぎてパッケージ部分が欠けてしまいましたが、
IC自体の動作には問題ありませんでした。


ただ、チップの耐久温度を超えている可能性が高いため、
動作保証はできないですね。
評価実験用のチップとして第2の人生を活躍してもらいたいと思います。



ポケトーチは炎が細いため、SMD部品の取り外しバーナーとしては
かなり使いやすいと思いました。


工具箱にあっても損はないツールの1つだと思いました。
バーナーは高温なのでやけどや火事には充分気をつけてください。

特にポケトーチはボタンから離しても
残留ガスで数秒火がついたままになるので、
要注意です。
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2017年01月06日

UART受信について

今回はSTM32でのUART受信処理について紹介します。


環境はこれまで同様、
・STM32F303K8
 +SW4STM32(System Workbench for STM32)
 +STM32CubeMX(F3_1.6.0)
です。


STM32F3系でなかなかUartの受信ができず、
DMAを使うしかないかなと諦めかけていましたが、
原因が分かったため、紹介します。
(This report is wrote about
  not called HAL_UART_RxCpltCallback probrem)


CubeMXのUart設定でNVIC Settingの
USART Global InterruptをEnableにするとUART受信で
HAL_UART_RxCpltCallback
という関数が呼び出されます。


uart.png

ただ、HALライブラリのバグで呼び出せないという不具合がありました。
不具合ではなく、最終的に関数の呼び出しが必要と判明しました。
対処方法#1で受信できるようになります。

対処方法#1は下記の通りです。
(The coping process #1 is following)

@HAL_UART_RxCpltCallbackを追加。
  (ADD HAL_UART_RxCpltCallback func.)

char UART1_Data;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
     if(UartHandle->Instance==USART1){
          HAL_UART_Receive_IT(&huart1, (uint8_t*) &UART1_Data, 1);      
    }
 }

Amain関数内の初期化後にUartの設定と割り込み有効化
 (Set Uart variable and enable interrupt after init.)

HAL_UART_Receive_IT(&huart1, (uint8_t*) &UART1_Data, 1);

while(1)
{
~~~



以上の設定を行うことで
1文字受信毎にHAL_UART_RxCpltCallbackが呼び出されました。

uart2.png



【参考 reference】
対処方法#2は下記の通りです。
(The coping process #2 is following)


@HAL_UART_RxCpltCallbackを追加。
  (ADD HAL_UART_RxCpltCallback func.)

char UART1_Data;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
     if(UartHandle->Instance==USART1){
          HAL_UART_Receive_IT(&huart1, (uint8_t*) &UART1_Data, 1);      
    }
 }

Amain関数内の初期化後にUartの設定と割り込み有効化
 (Set Uart variable and enable interrupt after init.)

 //Initially pointer is not set!
  huart1.pRxBuffPtr=(uint8_t *)&UART1_Data;  //IMPORTANT!!
 huart1.RxXferCount=1;  //IMPORTANT!!
  huart1.Mask=255;  //If not set, lost first string.
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);

while(1)
{
~~~


Bstm32f3xx_it.c内のUSART1_IRQHandler関数を修正
 (Fix USART1_IRQHandler func in stm32f3xx_it.c)

void USART1_IRQHandler(void)
{
  huart1.RxState=HAL_UART_STATE_BUSY_RX;  //IMPORTANT!!
  HAL_UART_IRQHandler(&huart1);
}
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2017年01月01日

新年挨拶とGitHub公開

あけましておめでとうございます。
今年もよろしくお願いいたします。

2017年の目標は2016年の目標で出来なかった部分をやります!

・ProjectionBallの多機能化
 -Wifi接続機能 
 -数字などの表示機能

・新デバイスの研究と開発
 -倒立振子を応用したデバイス
 -ハプティクス技術を応用したデバイス
 -IoT系のデバイス
 -電子工作便利ツール

上記デバイス群の販路拡大を目指します。



早速、年末年始で検討したProjectionBallの多機能化の1つ、
Wifi接続機能を実装しました!


iphone.PNG


コードをGitHubに公開しましたので、
ESP-WROOM-02とProjectionBallをお持ちの方は
ぜひ、ProjectionBallをスマートフォンから操作してみてください!


また、他の描画ソフトウェアもコードをGitHubに公開しました。
順次公開できる範囲でソフトウェアやライブラリ群を増やしていく予定です。


また、GitHubの使い方に慣れていないので
リンクや内容は随時変更する予定です。

よろしくお願いいたします。

posted by Crescent at 00:00| Comment(0) | TrackBack(0) | お知らせ | このブログの読者になる | 更新情報をチェックする

2016年12月22日

冬コミ出展告知


今回は直近のイベントを告知させて頂きます。


12/29(木)  東京ビックサイトにて開催される
コミックマーケットにProjectionBallを出展します。


クラウドファンディング時に支援して頂いた親方様からお誘いを受け、
出展することになりました。


Projection Ballの技術解説やクラウドファンディングの経験など
まとめた記事を寄稿させて頂きました。

1日目参加される方はお立ち寄りいただければと思います。
1日目 木曜日 西1ホール む13aでお待ちしております。


**************
コミックマーケットC91
12/29(木)1日目 @東京ビックサイト
西1ホール む13a
親方プロジェクト
**************


よろしくお願いいたします。
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | イベント | このブログの読者になる | 更新情報をチェックする