叶鋼は午前1時に計算をする

電子工作と計算の記録

選挙とは独裁者を選ぶ手続きである

国家の価値は、結局それを構成する個人個人の価値である。

ミル

4年前のことだ。私の知人は民主党に不満を持っていた。彼は言った。

 

「国民は選挙で民主党を選んでしまったから、彼らがひどい政治をしても甘い顔をしているのだ。国民は勇気を以って間違いを認め、民主党を政権から降ろすべきだ」

 

彼は民主主義について、根本的な思い違いをしていると私は思った。

民衆がいつでも好きに政治家を選べるのが民主主義ではない。

 

いつの時代、どこの国でも、民衆は政治に容易く介入することを許されない。

そして、民主主義だろうと共産主義だろうと、全ての政治は独裁であり、全ての政治家は独裁者であり、全ての国家は独裁国家である。

独裁は、民衆の一存で変えられるようなものではない。

 

ただ一つだけ、民主主義国家に他の独裁国家と違う点があるとするならば、数年に一度だけ、選挙を通して独裁者を交代させることができるという点である。

選挙が終われば、民主主義国家と言えども、また普通の独裁国家に戻るだけだ。

 

ここで「独裁」と言えば聞こえは悪いが、これは何も悪いことではない。

政治とは時として国民の意に沿わないことを行い、国民の熱狂に巻き込まれずに冷徹な判断をしないといけない。

国民の一喜一憂で政治が迷走しては、安定した国家運営は行えない。

 

たとえば、戦前の日本。

選挙で選ばれたことが政権を握る大義名分として機能しなくなった結果、政治は「民衆の声」を大義名分とする軍部に支配された。

そして対外強行を支持する国民の声に押されて、多くの現実的な政治家の戦争不拡大路線と真逆の拡大路線に流されてしまった。

当時の日本が、民衆の声を無視できるほどの独裁国家だったならば、戦争は回避できただろう。

 

たとえば、現在の中国。

選挙がない中国では、「徳政をもって大衆に支持されている」ことだけが政権を正当化する理由になる。

だから共産党政府は過剰に国民の声に怯え、時に激しく弾圧し、時に激しく追従する。

中国が本当に安定した独裁国家ならば、政権批判も許すし、尖閣問題では民衆の反日感情を無視して妥協的な領土外交をしていたことだろう。

 

まったくもって逆説的なことながら、安定した独裁国家では言論の自由が守られ、融和的な外交が行われ、独裁力の弱い国家では言論弾圧と強圧的な外交が行われるのである。

 

当時の民主党について言えば、既に選挙で彼らを選んだ以上、政権を任されている期間に限定して、彼らには周囲の声に捉われず自分たちの信じる道を進む権利と義務がある。

 

選挙で民主党が選ばれたならば、彼らが自分たちの想像していたのと同じか違うかに関係なく、また自分が彼らに投票したか否かにも関係なく、国民総意で選んだ独裁者様として尊重せざるをえない。

選んだことを後で後悔するくらいならば、はじめから慎重に選べばよかったのだ。

また、自分の支持する党や政治家が選ばれなかったから反抗するというのでは、選挙を行う意味がない。

投票することと投票結果を受け入れることが民主主義の基本だ。

 

思っていたのと違うからという理由で、私たちが安易に彼らの道を塞ぐことはできない。

もちろん批判をするのは自由だが、その批判を聞くも聞かないも政治家の自由であり、批判に政権を変えるほどの力はない。

選挙だけが政権を変える力を持つ。

 

どうしても私たちが民主党に思うところがあり我慢ならないのならば、その思いは次の選挙のときに叩きつければいいのだ。

そして、現実にその後の選挙において、民主党は国民の思うところを叩きつけられて惨敗した。

 

さて、明日もまた選挙が行われる。

皆様におかれては、明日、投票用紙を目の前にした時、それが新しい独裁者を選ぶ手続きだということの重大性を思い出していただければ幸いである。

私は左翼なれど、今回の選挙では自民党を支持するものなり

真に恐れるべきは有能な敵ではなく無能な味方である

ナポレオン・ボナパルト

私は自民党が嫌いだ。自民党は私の敵である。

何故なら私は左翼だからだ。

(左翼の定義にも色々あるが、「福祉国家政策を重視」し、「個人の人権の尊重」している人を私は左翼と認識する。)

 

そんな左翼である私から見て、昨今の自民党の歴史に関する妄言は聞くに堪えない。

私の敵は基本的な勉強もしていないくせに、なぜか自分は歴史問題について文句を言う資格があると信じている。

 

いつか自民党の連中には妄言の報いを受けさせよう。

「今マデ虚仮ニシクレタ政治家ノ皆様。今ニ見テヲレデ御座イマスヨ」である。

 

だが、その前に私は身内の妄言を批判しなくてはいけない。

その人間が公正な人物であるかどうかは、仲間が失態を演じたときに、それを批判できるかどうかで分かる。

不公正な人物は、敵の失態は些細なものでも「信じられない卑劣漢」「このような人物を許していいのか」などと烈火のごとく批判するのに、味方の失態に対しては「批判者は心が狭く不寛容だ」「彼だけが悪いわけではない」と擁護する。

私は自分が公正でありたいので、私の仲間のことを批難する。

 

私の仲間の多くが安倍首相の行った金融政策の意味を理解していないのが痛々しい。

マクロ経済学の簡単な入門書くらい読めば、思想の左右に関係なく、デフレを終わらせることの重要性を理解できるはずだ。

金融緩和が所得に対する課税と同じ意味であり、金持ちの資産を減らし、その差額を庶民に還元する手段であることは教科書的事実だ。

 

そしてリフレーション政策の提案者であるポール・クルーグマン氏の著作を読めば、この大胆な金融緩和が理にかなった手段であることを納得し、応援する気になるはずだ。

デフレという怪物が、どれだけ多くの人を苦しめてきたかは知れば知るほど胸が痛む。

この巨大な怪物を倒す方法を自ら実践することは、日本だけの得になるのではなく、同様の症状で苦しむユーロや世界各国の範となる。これは真に世界平和に貢献する尊い行為である。

確かにそれは失敗するかもしれない。

それでも他にどのような選択肢があるだろうか?

 

もし金融緩和なしに増税だけをしていれば、日本は最悪な状況になっていただろう。

私は左翼なので財政を改善して、社会福祉を維持するために増税するには賛成だ。いつか誰かがやらなくてはいけないことだ。

だから、1回目の増税には賛成だった。

それが景気に悪影響を与えることは自明だったが、それでもあれだけの大規模金融緩和との組み合わせならば、被害を最小限に抑えられると読んでいた。

しかし、現実は私の予想を上回った。私が思うよりも消費は回復しなかった。

ならば残念だが次の増税は延期すべきだ。今は何よりもデフレ脱却が最優先事項だ。

現在でも私は増税による財政再建には賛成だが、今回はまだその時期でないことを認めるくらいの理解力は持っている。

 

日本の社会福祉は危機的な状況にある。今より負担を増やしても、今と同様のサービスを維持するのは不可能だ。

今の日本に求められるのは、景気回復と財政再建のバランスを綱渡りのように取ることができる政権だ。

 

「金持ちや大企業から税金を取れば増税は不要だ」と唱える連中は、ただの脳内お花畑人間なので、問題外である。

あんなのは左翼でも何でもなく、ただの酔っ払いだ。仲間と呼ぶのもおぞましい。

自分たちの何が間違っているか自分で理解できない彼らには、説明しても無駄だろうからここには書かない。

そもそも、その法外な主張を立証する責任は彼らにあるので、私が説明してやる義理もない。

彼らには総括あるのみだ。

 

民主党は「官僚の既得権益を削れば良い」「無駄をなくせば財政再建する」という嘘で国民を騙して、時間を浪費して事態を悪化させ、未だにそのことを反省も謝罪もしていないので、まったく信用できない。

 

景気回復に有効と思われる手段を採用しつつ、財政再建の道も模索している。

そのような均衡の取れた政策を採用しているのは、今のところ自民党だけだ。

ならば、どれだけ嫌いな連中であっても、彼らを支持する以外の選択はない。

 

私の仲間は基本的な勉強もしていないくせに、なぜか自分は経済政策について文句を言う資格があると信じている。

その挙句に、「アベノミクスでは金持ちしか得をしない」「株主や資本家や大企業だけを優遇している」などと妄言をばらまく。

そのような見識しか持ち合わせない不勉強さで経済政策を批判し、弱者の味方のつもりでいるとは、見ているこちらが恥ずかしくなる。

あんな連中が同じ思想に属する味方だと思うと、心底うんざりする。

 

結局、自分に都合の良いものしか見たくないというのが人間だ。

左翼の一部(大部分?)はアベノミクスが成功してもらっては困るのだ。

敵のおかげで日本が幸福になってもらっては困るのだ。

だからアベノミクスの失敗を願い、日本人の不幸を願い、強弁を重ねてアベノミクスを批判する。

私は大嫌いなはずの自民党の人に向かって、「こちらの身内が妄言で迷惑をおかけして、誠に申し訳ありません」と謝罪したくなる。

もちろん私ごときに左翼を代表して謝罪する権利などないことは百も承知だ。

  

現在、弱い立場の労働者や若者を使い捨てにしてきた企業が赤字に陥っている。

それは何故か?私たちの活動が功を奏したからだろうか?

答えは否。

アベノミクスで賃金や有効求人倍率が増加し、それらの企業はたちまち人手不足になったからだ。

 

現在、年金財政が改善し、貧しい人々にも福祉の恩恵が届きそうな光明が見えている。

それは何故か?私たちが悪い官僚や悪徳資本家を懲らしめたからだろうか?

答えは否。

アベノミクスで株価が上昇し、年金の運用状況が改善したからだ。

 

将来、デフレが終わり、金持ちの実質資産は目減りし、その恩恵が庶民に還元される可能性がある。

それは何故か?私たちの革命が成就したからだろうか?

答えは否。

大胆な金融緩和だけが、デフレを終わらせうる最後の希望だからだ。

それは悲しいことに失敗する可能性も十分にある。

だが、わずかな可能性にかけて努力しているのは、アベノミクスだけなのだ。

 

敵のことを、これだけ褒めないといけない私の絶望があなた方に分かるだろうか?

それでも、認めるべきことは、認めないといけない。

 

私たちは経済を学び、福祉を学び、軍事を学び、科学を理解しないといけない。

間違った思想に基づいた科学は間違っているとした、ルイセンコの悲劇を繰り返してはいけない。

 

敵が良いことをするはずがないという思い込みを捨てなくては私たち左翼に未来はない。

敵の行いでも、良いことは認め、模倣しなくては私たち左翼の存在価値はない。

今の私たちは、日本の明るい未来を呪い、それを全力で妨害しようとする魍魎だ。

 

次の選挙で「自民党に投票するな」と言うのは、「日本人は地獄へ落ちてください」とお願いするに等しい。

私は嫌いな連中をこらしめるためならば、他人が地獄に落ちても良いと思えるほど図々しくはない。

 

私は善人に導かれて地獄に行くよりは、悪人の運転する車に乗って繁栄した未来に行きたい。

もし善人と一緒に地獄に行かないことを悪徳と責める人がいれば、「あなたの自己満足につきあって心中するつもりはない」と答えよう。

他人を不幸にしてでも貫くべき正義などはないと私は信じている。

 

だから私は血の涙を流しながら私の仲間に訴える。

「次の選挙では、自民党に投票しろ」と。

【BLEを使う】nRF51822 のAdvertisingパケットとScanパケットの作成(Peripheral側)

神は細部に宿る

いままでの記事はこちらをご覧ください。

  

BLE接続が確立していない段階では、BLEのスレーブがアドバタイジングパケットを発信し、接続できるセントラルに自分の存在を報せます。

NordicのサンプルプログラムではソフトウェアS110で用意された諸々の関数や定義を用いてアドバタイジングパケットやスキャンパケットを作成しています。

今回はその作成方法について説明します。  

設定しないといけない主な項目は以下になります。

 

①Adv PDU

アドバタイジングパケットのヘッダーの上位4bitです。 以下の種類があります。

値[3:0]Type接続性スキャン指向性
0000ADV_IND有り有り無し
0001ADV_DIRECT_IND有り無し有り
0010ADV_NONCONN_IND無し無し無し
0110ADV_SCAN_IND無し有り無し

 

②AD Type

AD Dataの先頭に配置される1byteのデータです。

多くの種類がありますが、今回説明するのは以下になります。

DataType
0x0Flags
0x03Complete List of 16-bit Service Class UUIDs
0x07Complete List of 128-bit Service Class UUIDs
0x08Shortened Local Name
0x09Complete Local Name
0x0ATx Power Level
0x19Appearance

 

では、実際にこれらの設定をプログラムに反映させてみます。

 

Adv PDU

アドバタイジングPDUは、構造体ble_gap_adv_params_tのtypeで設定します。

ble_gap_adv_params_tの構造は以下を参照してください。

nRF5 SDK guides - Nordic DevZone

 

サンプルプログラムの多くでは、advertising_start関数やadvertising_init関数などでプログラム冒頭に設定されています。

例えば、以下のサンプルプログラムにおけるmain.cの関数advertising_startのadv_params.typeがそれになります。

nrf51-ble-app-lbs/main.c at master · NordicPlayground/nrf51-ble-app-lbs · GitHub

    adv_params.type        = BLE_GAP_ADV_TYPE_ADV_IND;

設定する項目は以下の定数のどれかを選択してください。

Type定義
ADV_INDBLE_GAP_ADV_TYPE_ADV_IND0x00
ADV_DIRECT_INDBLE_GAP_ADV_TYPE_ADV_DIRECT_IND0x01
ADV_NONCONN_INDBLE_GAP_ADV_TYPE_ADV_NONCONN_IND0x03
ADV_SCAN_INDBLE_GAP_ADV_TYPE_ADV_SCAN_IND0x02

アドバタイジングPDUは4種類ありますがADV_DIRECT_IND は使うべきではありません。

 

Flags

Flagsは必須設定項目です。

構造体ble_advdata_tのflags.sizeとflags.p_dataを設定してください。

ble_advdata_tの構造は以下を参照してください。

https://devzone.nordicsemi.com/documentation/nrf51/4.3.0/html/structble__advdata__t.html

例えば、以下のサンプルプログラムにおけるmain.cの関数advertising_initをご覧ください。

nrf51-ble-app-lbs/main.c at master · NordicPlayground/nrf51-ble-app-lbs · GitHub

advertising_initの変数flagsで設定しているのが分かります。

    uint8_t       flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;      

すると以下のようにflagsのサイズと設定値が自動的に更新されます。

    advdata.flags.size              = sizeof(flags);               
    advdata.flags.p_data            = &flags;               

flagsには、以下のいずれかの定数を設定してください。

定義
BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE0x01
BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE0x02
BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED0x04
BLE_GAP_ADV_FLAG_LE_BR_EDR_CONTROLLER0x08
BLE_GAP_ADV_FLAG_LE_BR_EDR_HOST0x10
BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE (BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE
|BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED)
BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE (BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE
| BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED)

 

DEVICE_NAME

ユーザーが任意につけられる装置の名前です。

例えば、iphone(central)にadvertisingパケットが検知されたときに、iphoneのアプリ画面上にこの装置名が表示されます。  

DEVICE_NAMEはプログラム中の以下の定数に入力してください。 例えば、以下のサンプルプログラムにおけるmain.cの43行目がそれです。

nrf51-ble-app-lbs/main.c at master · NordicPlayground/nrf51-ble-app-lbs · GitHub

#define DEVICE_NAME                     "LedButtonDemo"          

定義したDEVICE_NAMEはmain.cの関数gap_params_initにおいてアドバタイジングパケットに組み込まれているのが分かります。

    err_code = sd_ble_gap_device_name_set(&sec_mode,          
                                          (const uint8_t *)DEVICE_NAME,           
                                          strlen(DEVICE_NAME));          

また、DEVICE_NAMEについては、DEVICE_NAMEの全文字を使うComplete local name(AD typeは0x09)か先頭の数byteのみを短縮名として使うShortened Local Name(AD typeは0x08)を指示します。

短縮名を使用する場合、完全なDEVICE_NAMEはGATTのdevice name characteristicを使って読み出せます。

どちらを使用するかは、構造体ble_advdata_tのname_typeで設定してください。

例えば、サンプルプログラムのmain.cの関数advertising_initのadvdata. name_typeがそれです。

    advdata.name_type               = BLE_ADVDATA_FULL_NAME; 

advdata.name_typeには、以下のいずれかの定数を設定します。

定義意味
BLE_ADVDATA_NO_NAME装置名なし
BLE_ADVDATA_SHORT_NAME装置名短縮
BLE_ADVDATA_FULL_NAME 装置名Full

 

外部装置

APPEARANCE(外部装置)は、main.cの関数gap_params_initの sd_ble_gap_appearance_setで設定することでアドバタイジングパケットに組み込まれます。

nrf51-ble-app-lbs/main.c at master · NordicPlayground/nrf51-ble-app-lbs · GitHub

    err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT);
    APP_ERROR_CHECK(err_code);

APPEARANCE(外部装置)は以下の定義から適切なものを選択します。

nRF5 SDK guides - Nordic DevZone

また、APPEARANCEを使用する場合、構造体ble_advdata_tのinclude_appearanceを設定してください。

例えば、以下のサンプルプログラムにおけるmain.cの関数advertising_initをご覧ください。

nrf51-ble-app-lbs/main.c at master · NordicPlayground/nrf51-ble-app-lbs · GitHub

    advdata.include_appearance      = true;

 

TX power

送信出力はプログラム中でBLE_GAP_AD_TYPE_TX_POWER_LEVELで設定します。

#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL                      0x0A /**< Transmit power level. */    

 

スキャン応答によるデータ送信

アドバタイジングパケットは31bytesしか使用できないので、必要な情報を伝えきれないことがあります。

その場合は、centralからのスキャン要求に対するスキャン応答においてデータを追加で送信できます。

ちなみにcentralからのスキャン要求が送信されるタイミングは、centralがperipheralからのアドバタイジングパケットを検知した直後になります。  

またスキャンパケットに乗せるデータは構造体ble_advdata_tを持つ変数を追加でもう1個作成してください。

例えば、以下のサンプルプログラムにおけるmain.cの関数advertising_initをご覧ください。

nrf51-ble-app-lbs/main.c at master · NordicPlayground/nrf51-ble-app-lbs · GitHub

サンプルプログラムでは以下の2つを作成しています。

    ble_advdata_t advdata;
    ble_advdata_t scanrsp;

スキャン応答でデータを送信する場合は、関数ble_advdata_setの2番目の引数に上で作成したスキャンパケットデータの先頭アドレス&scanrspを設定します。

スキャンパケットに何もデータを乗せない場合は2番目の引数をNULLにしておきます。

    //スキャンパケットに何もデータを乗せない場合           
    //err_code = ble_advdata_set(&advdata, NULL);              
    //スキャンパケットでデータを送信する場合            
    err_code = ble_advdata_set(&advdata, &scanrsp);          

 

サービスUUID(BLE SIGで定義済みのUUIDを使用する場合)

ここではBLE SIGであらかじめ定義されているサービスUUIDを、アドバタイジングパケットで送信する場合を考えます。

サービスUUIDの設定は、構造体ble_advdata_tのuuids_complete.uuid_cntとuuids_complete.p_uuidsを設定してください。

例えば、以下のサンプルプログラムにおけるmain.cの関数advertising_initをご覧ください。

nrf51-ble-app-lbs/main.c at master · NordicPlayground/nrf51-ble-app-lbs · GitHub  

main.cにおいて ble_uuid_t adv_uuidsで設定します。サンプルプログラムと異なり、以下は既存のサービスを使う場合の設定です。

    ble_uuid_t adv_uuids[] = {{BLE_UUID_BATTERY_SERVICE, BLE_UUID_TYPE_BLE}};

ble_uuid_t adv_uuidsの1番目の引数がUUIDのデータを示し、2番目の引数がUUIDのtypeを示しています。

BLE SIGで定義されたサービスUUIDを使用する場合は、BLE_UUID_TYPE_BLEを指定します。

1番目の引数には、あらかじめ定義されたサービスUUIDが使用できます。(プログラムではble_srv_common.hで定義されています。)

すると以下のように設定値が自動的に更新されます。

    advdata.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]); 
    advdata.uuids_complete.p_uuids  = adv_uuids;    

 

また、サービスUUIDが複数の場合は、以下のようにして指定します。

    ble_uuid_t adv_uuids[] =
    {
        {BLE_UUID_HEART_RATE_SERVICE,         BLE_UUID_TYPE_BLE},
        {BLE_UUID_BATTERY_SERVICE,            BLE_UUID_TYPE_BLE},
        {BLE_UUID_DEVICE_INFORMATION_SERVICE, BLE_UUID_TYPE_BLE}
    };

 

サービスUUID(カスタムUUIDを使用する場合)

ここではサービスUUIDを自分で作成し、スキャンパケットで送信する場合を考えます。

既存のサービスのときと同様にble_uuid_t adv_uuidsを設定します。

    ble_uuid_t adv_uuids[] = {{LBS_UUID_SERVICE, m_lbs.uuid_type}};

ble_uuid_t adv_uuidsの1番目の引数は自分で作成したUUIDを指定します。

UUIDにはnRFgo StudioのUUID生成ツールで作成したBase UUIDを使用しました。

nRF8001 Configurationを選択します。

f:id:yegang:20141025152945j:plain

nRF80001 SetupからEdit 128-bit UUIDsを選択します。

f:id:yegang:20141025153001j:plain

Add newで新しいUUIDを作成します。

f:id:yegang:20141025153013j:plain

プログラムにおいては、xxxxを0000で埋めて、下位byteから2byteずつ配置してください。

例)UUID = 1234xxxx-5678-9ABC-DEFA-132547698BACの場合、プログラムのどこかに以下のUUIDを定義します。

以下の例では、作成したUUIDのxxxxの部分に任意の4桁の数字を代入して、Service UUIDと複数のCharacteristic UUIDを作成しています。

#define LBS_UUID_BASE {0xAC, 0x8B, 0x69, 0x47, 0x25, 0x13, 0xFA, 0xDE, 0xBC, 0x9A, 0x78, 0x56, 0x00, 0x00, 0x34, 0x12}            
#define LBS_UUID_SERVICE 0x1523         
#define LBS_UUID_LED_CHAR 0x1525        
#define LBS_UUID_BUTTON_CHAR 0x1524

uuid_type は関数sd_ble_uuid_vs_addを使うことで各SeviceやCharacteristicに組み込まれます。

詳細はサービス初期化関数で説明します。

サンプルプログラムでは、サービスUUIDはスキャンパケットで送信するので、advdataパラメータではなく、scanrspパラメータに格納されています。

また、ble_advdata_setの2番目の引数には&scanrspを指定しています。

【BLEを使う】KeilとNordicのサンプルプログラムでHRM1017を開発する

The examples in the SDK does not include the softdevice merged into the .hex file, as the mbed projects does.

What you will have to do is to perform the same operation as an exported mbed project (to Keil uVision)

Problem on Keil 5 compiled nRF51 SDK sample, deploy to nRF51822-mKIT - Nordic Q&A - Nordic DevZone - Nordic DevZoneより引用

いままでの記事はこちらをご覧ください。

  

今回はKeilで作成したアプリケーションをmbed HRM1017で動かす方法について説明します。

アプリケーションはNordicが公開しているサンプルプログラムとソフトデバイスS110を流用します。

 

Nordicの公開サンプルをKeilでビルドしてhexファイルを作成し、そのhexファイルをmbedに書き込んでも動作しません。

何故なら、ソフトデバイスがhexファイルには含まれていないからです。  

Nordicのサンプルはソフトデバイス領域にソフトデバイスをあらかじめ書き込んであることを前提にしており、サンプルからビルドしたhexファイルはアプリケーション領域に書き込まれ、ソフトデバイス領域から必要な関数を呼び出して使用しています。

一方でmbed HRM1017のサンプルプログラムはソフトデバイスと一緒にhexファイルが作成されています。

Noridicのサンプルプログラムをmbed HRM1017で使用したければ、同じようにソフトデバイスも含めてhexファイルを作成しないといけません。
その方法は以下に書いてあります。

https://devzone.nordicsemi.com/question/12350/problem-on-keil-5-compiled-nrf51-sdk-sample-deploy-to-nrf51822-mkit/

念のため、上のサイトとまったく同じことを繰り返し説明します。

 

Projectsのrootフォルダを右クリックしてオプションを選択します。

f:id:yegang:20141023104313j:plain

オプションのUserタブのRun User Program After Bulid/RebuildのRUNをチェックし、以下を記述します。

mergehex -m !H \(ソフトデバイスの格納場所)/s110_nrf51822_6.0.0_softdevice.hex -o $H@H.hex

ソフトデバイスはNordicからダウンロードしたS110の最新版を選択しました。

f:id:yegang:20141023104242j:plain

 また、mbed HRM1017には外部クロックがないので、サンプルプログラムのmain.cにおいてクロック設定を内部クロックに変更します。

tatic void ble_stack_init(void)   
{   
    uint32_t err_code;  
    
    // Initialize the SoftDevice handler module.    
    //SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, false);   
    SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_RC_250_PPM_4000MS_CALIBRATION, false);   

nrf_sdm.hの構造体RF_CLOCK_LFCLKSRCSに他のクロック設定の定義もあるので、使用ボードに適したものを選択ください。

以上の変更後にビルドしたhexファイルをmbed HRM1017に書き込めば、サンプルプログラムがHRM1017でも動きます。

【BLEを使う】開発環境メモ:Keil v5でNordicサンプルプログラムを開くと毎回エラーが出る場合の対応

Has anyone tried Keil 5.11? I get a parsing error when installing/repairing SDK when it imports the device pack into Keil. 5.10 works great.

Keil 5.11 Device pack parsing error - Nordic Q&A - Nordic DevZone - Nordic DevZoneより引用

Keil v5でNordicから提供されているnRF51のサンプルプログラムを起動時に、毎回「Error loading software packs...」というエラーメッセージが出る問題の解決方法を以下に示します。

f:id:yegang:20140927171534j:plain

Error loading software packs

C:\Keil_v5\ARM\PACK\NordicSemiconductor\nRF_DeviceFamilyPack\1.0.3\NordicSemiconductor.nRF_DeviceFamilyPack.pdsc(60,49):

Error parsing node '#text' :no declaration found for element 'swdconfig' C:\Keil_v5\ARM\PACK\NordicSemiconductor\nRF_DeviceFamilyPack\1.0.3\NordicSemiconductor.nRF_DeviceFamilyPack.pdsc(60,49):

Error parsing node '#text' :attribute 'default' is not declared for element 'swdconfig' C:\Keil_v5\ARM\PACK\NordicSemiconductor\nRF_DeviceFamilyPack\1.0.3\NordicSemiconductor.nRF_DeviceFamilyPack.pdsc(60,49):

Error parsing node '#text' :attribute 'clock' is not declared for element 'swdconfig' C:\Keil_v5\ARM\PACK\NordicSemiconductor\nRF_DeviceFamilyPack\1.0.3\NordicSemiconductor.nRF_DeviceFamilyPack.pdsc(117,18):

Error parsing node '#text' :element 'swdconfig' is not allowed for content model '((((processor,debugconfig),(compile|memory|algorithm|book|description|feature|environment|debugport|debug|trace|debugvars)|sequences)),device),subFamily)'

このエラーに対する対応はNORDIC DEVELOPER ZONEにありました。

Keil 5.11 Device pack parsing error - Nordic Q&A - Nordic DevZone - Nordic DevZone

swdconfigは現在のCMSIS-Packでは削除されているのに、それを使う指示が残っていることが問題の原因のようです。

http://www.keil.com/pack/doc/CMSIS/Pack/html/_pack_format.html

そのため以下の場所にあるNordicSemiconductor.nRF_DeviceFamilyPack.pdscのswadconfigをコメントアウトしてからkeilを再スタートすることで問題は解決します。

C:\Keil_v5\ARM\Pack\NordicSemiconductor\nRF_DeviceFamilyPack\1.0.3 NordicSemiconductor.nRF_DeviceFamilyPack.pdsc

60行目 修正前

        <swdconfig default="1" clock="2000000"/>

60行目 修正後

        <!--<swdconfig default="1" clock="2000000"/>-->

Jlink SWD clockパラメータはSegger device用に自動的に照会されるので、このコメントアウトが悪さをすることはないそうです。

先に引用した質問サイトの回答者によると、コメントアウトしてからも、動作で特に問題は起きていないとのことです。

また、私の環境でも動作に問題は起きていません。

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

テスト投稿

ウイグル族出身の経済学者、イリハム・トフティ氏が国家分裂罪で無期懲役の判決を受けた。

イリハム・トフティ氏は穏健派である。ウイグル族の独立を訴えたわけではない。 「現行の中国の体制と憲法の枠組みを尊重し、憲法や法律で保障されているはずの言論や宗教活動の自由を訴える姿勢を明確にしていた」人物である。

氏は熱い情熱と理性的な思考を併せ持った人物である。 そのような人物を含めた多くの穏健派を、中国共産党は次々と逮捕し、弾圧を強めている。

ttp://d.hatena.ne.jp/kaikaji/20140202

ttp://d.hatena.ne.jp/kaikaji/20100722

彼の提案する路線でウイグル族の平和が訪れることを私は切望していた。 だが、結局は 私が予測した通りの中国の未来が来ようとしている。 それは、私がよく知る過去の中国そのものでもある。 中国は終わりのないテロとの戦いに突入しようとしている。

穏健派の弾圧が、過激派の台頭を招いているからだ。 当然と言えば、当然の話だ。

穏健派の弾圧は、穏健派支持者を絶望させて過激派に転向させた。 また、穏健派の失敗は、過激派の「ほら、あんな軟弱な方法ではダメなんだ」というセリフに説得力を与えた。 人徳に優れ敬愛されていた穏健派は、過激派からさえも慕われ、過激派の行動を抑えていた。 しかし、敬愛すべき人が悲惨な目にあったことで、過激派は復讐に燃え、以前より更に過激になってしまった。 責任ある地位やリーダ的存在だった穏健派の抜けた穴を、ことごとく過激派が埋めてしまった。 今はどのリーダーも多かれ少なかれ過激派に親和的な人々だ。

中国共産党がことごとく穏健派を弾圧した後に残ったのは、熱い情熱で短絡的な行動を起こす人間と冷酷な目的のために理性的に動く人間だけになった。 彼らのは最終目的は明確だ。中国社会の崩壊である。 共生を唱えた穏健派が否定されたのだから、残された選択肢は「自分たちを縛る束縛の破壊」しかない。

中国共産党がどうしてこのような行動を取ったか理解に苦しむ。 過激派を弾圧できる自信があるのだろうか。もしそうだとしたら、あまりにも相手を甘く見すぎている。 建国以来、一度も本物のテロリストと対峙したことのない彼らは、ウルチェムの恐ろしさを知らない。 温和な民衆や学生を楽しく殴って、簡単に撃ち殺してきた今までのようにはいかないのである。

私は具体的に過激派の計画のことは何も知らないが、彼らが手本としているイスラム過激派の行動や、歴史の実例から、ある程度の推測はできる。 以下に、少々長くなるが、不愉快で恐ろしい私の妄想を書き連ねる。理性と知性のある人は、決して本気にしないでいただきたい。 釣り記事に簡単に騙される、情弱のド低脳野郎だけが、以下の文章を読んで「大変だー!どうしよう!」と大騒ぎすればいい。

過激派の作戦は二面的であるはずだ。 表では、彼らは小規模なテロや破壊行為を繰り返すだろう。目的は中国社会を不安定にさせることだ。 それらのテロの一つ一つは小さくて中国全体に与えるダメージはほとんどない。100人や1000人の民衆を殺したところで、中国はそんな犠牲はものともせず磐石であり続ける。 だが、そのような騒乱が何度も続けば、民衆は不安になり、政府も面子を潰される。

また、有力者の子弟を誘拐して、身代金を取ることも行うだろう。 誘拐するのは、常に複数の子弟だ。 もし、一人の子弟を解放した後に、それを警察や軍関係者に漏らせば、手元に残る別の子弟を殺害する。 この誘拐の連鎖で逮捕される危険性を少しでも小さくする。

また、ある政治家同士を仲違いさせたい場合にも誘拐は使える。まず彼らの子弟を誘拐し、片方の政治家の子弟を解放した後、「解放された側の家族が軍に訴えた」という理由をつけて残った別の政治家の子弟を殺すのである。 そうすることで、子弟を殺された側の政治家は、解放された側の政治家を恨むようになる。

経済面での崩壊を狙って、不動産価値の高い地域で頻繁にテロを起こして、不動産価値を下げることも目論むだろう。 重要な鉄道施設の破壊も行うだろう。

社会不安をもたらすために、あらゆる行動が実行される。その実行役である熱情的で短慮な人々は、それらの活動で使い捨てられる。計画実行後、実行者の生存確率は0に等しい。 一方で、一連の計画を立て、それを実行させるのは、冷酷で理性的な人々だ。

裏では、彼らは本格的な中国崩壊の準備を進めることだろう。 テロで国を壊すことができないことを知っている彼らは、外の手を借りて中国を破壊しようとしている。 彼らは、中国を日米と戦争させることで、中国の崩壊を促すことが、最も現実的だと考えている、はずだ。

だが、民主主義国家ではない中国で、ましてやウイグル族である彼らが、国の進む方向を決められるわけはない。 ならば、彼らは自分たちに都合の良い人物を助けて出世させることで、自分たちの望む方向に国を誘導しようとする。

中国共産党において、テロとの戦いは、その勝利者に栄光をもたらす。 テロの弾圧に成功した政治家は、必ず出世する。 ならばテロを作り出す彼らは、栄誉ある勝利者も自由自在に作り出すことができるのだ。

過激派にとって都合の良い人物。 それはウイグル族を情け容赦なく弾圧する人物である。 逆ではない。 何故なら、過激派にとって憎しみは力であり、自分たちを育む栄養だからだ。 弾圧が厳しくなればなるほど、仲間は増え、活動は盛んになる。 だから情け容赦ない政治家こそが、彼らにとっては「ハッピー、うれピー。よろピくねーーー」な人物なのである。

彼らは驚くべきことに、穏健派を逮捕させることさえする。 今更、穏健派が戻ってきて、活動の勢いを削がれては困るのである。 死んだ英雄だけが良い英雄なのだ。 穏健派は、弾圧と悲劇の象徴として、ウイグル族の怒りを悲しみを喚起させる存在でなくてはならない。 そのためには、過激派は穏健派を今後も弾圧して欲しいと願っている。 拷問の末に殺してくれたら最高に都合が良い。

中国政府が国際的圧力に屈して穏健派を解放しないように、 彼らは「穏健派解放」を要求してテロ行為を行うだろう。 そうすることで、「穏健派を解放することはテロリストの要求に屈したことになる」という状況を作り上げる。 これで穏健派が解放される心配はなくなって安心だ。

また、時折、テロの情報を弾圧政治家に流して、テロを未然に防がせる。 こうすることで、都合の良い政治家を出世させ、更に彼らとの信頼関係さえ築ける。 テロ情報提供による懸賞金ももらえる。 政治家は彼らのことを、金のために仲間を裏切った内通者程度にしか考えていないだろう。 実際、彼らは政治家に都合の良いことしかしないので、何かが発覚する恐れもない。 彼らがテロリストと連絡を取っても、政治家には自分たちのスパイが活躍しているようにしか見えない。おかげで彼らは逮捕や弾圧の心配なく計画を進められる。

この方法には、更なる応用がある。 数万人を巻き込む大規模なテロが計画され、それは実行寸前に一人の英雄的な軍人の行動で未然に防がれる。 その英雄的軍人は、日米との戦争を日頃から強く主張する人物であり、彼の成功は好戦派の勢力拡大につながる。 もちろん大規模なテロを実行寸前まで進めるのも、その情報を英雄的軍人に提供するのも、同じ彼らの仕業だ。

数万人を殺した程度で中国が崩壊するわけはない。それが無駄なことは彼らが一番よく知っている。 小規模なテロを頻繁に起こすことの方が有効で、大規模テロを起こしても良いことは何もない。 大規模テロは自分たちの評判を地に落とし、組織を壊滅させるほどの本格的な軍事作戦が開始されてしまう。

彼らの目的は、自分たちに都合の良い軍人を出世させることだ。 それは日米との戦争をためらわない好戦的な軍人だ。

以上は全て私の妄想であり、何ら具体的な裏づけや根拠があるわけではない。 このような妄想的記事が、ごくわずかな一部の知能の低い少数派の誤読により、 いたずらに社会不安を招いたり、ウイグル族に対する偏見や差別が助長されてしまうことを、私は極度に恐れる。

だが、中国共産党の穏健派弾圧が、一部の心無い過激派を喜ばせ、彼らの活動を助け、世界に大災難をもたらす恐れがあることは強く自覚していなくてはいけない。 だから私はこの記事を書かないといけなかった。 "理性と知能のある大多数の人物ならば、漢族とウイグル族の共生を願う私の真意を正しく理解し、現在の穏健派の弾圧を深く憂慮し、その解放のために行動を起こしてくれると私は信じている。

穏健派は中国と世界の未来に平和と安定をもたらす国の宝であることに気づいて欲しい。 そして、その宝を今すぐに、宝を置くに相応しい場所に戻して欲しい。 彼らは、食事も満足に与えられない牢屋の中に、決して置いてはいけない人々なのだ。 全てが手遅れになる前に、穏健派が次々と謎の死を遂げる前に、間違いが改められることを望む。 私の知っている未来が来る前に。どうか、その前に。

【BLEを使う】nRF51822 のUART機能を使う

このUARTというのは Universal Asynchronous Receiver Transmitter の略でシリアル通信装置の一種です。

1バイト8ビットのデータを1本の電線で送るために、時系列にデータを分解して、1ビットづつ出力(送信)または入力(受信)します。

最近のほとんどのマイコンには、UART機能が搭載されていますのでマイコン間のデータ交換や、変換ICを使用しRS232C規格の通信としてパソコンとデータのやり取りをすることも可能です。

マイコンメーカーによってはUART以外に独自の呼び方をするメーカーもあります。

例えば、PICはUSARTと呼び、ルネサス製H8マイコンはUART機能を持った内蔵デバイスのことをSCIといいます。

http://www.ele-lab.com/tips_uart.htmlより引用

いままでの記事はこちらをご覧ください。

  

今回はnRF51822のUART機能の使い方を説明します。

 

今まではBLEで無線送信する方法ばかり説明してきましたが、そのBLEが送信する当のデータは、外部から取り込まないといけません。

UART通信やSPI通信はセンサや外部のマイコンからデータを取り込むための手段であり、それらの使用は必須と言えます。

今回は、nRF51822のUART機能を使用してみます。

  

・端子配置

nRF51822で面白いと思ったのは、周辺機能に対応する特定の端子がないということです。

例えば、ルネサスマイコンでは、TX機能を持つのはPORT1.6で、RX機能を持つのはPORT1.7と割り当てられていた場合、それらの機能を使いたい場合はPORT1.6とPORT1.7を使うしかありません。

(多くの場合、別端子に同じ機能が割り当てられていますが、使う端子が決められているという点では同じです。)

一方で、nRF51822の場合、機能に割り当てる端子は自分で設定して決めてやります。

端子番号0から31の中から、使いたい端子を選んで、機能を割り当てます。

例えば後述するレジスタPSELRXDについて

PSELRXD = 16;

と設定すれば、端子P0.16がRX端子となります。

開発キットの場合、この設定によりコネクタP2の29番がRX端子になります。

f:id:yegang:20140914151237j:plain

(nRF51822_Development_Kit_User_Guide_v1.4の 5.1.4より引用)

レジスタの値を変えれば、RX端子も変わります。実際に私はPSELRXD = 20に変更して、実際にRX機能がP0.20になったことを確認しました。

 

レジスタ

UARTに関連するレジスタは以下になります。

名称初期値
RXD 0x00000000受信したRXデータ
TXD 0x00000000転送するTXデータ
ENABLE0x00000000 0x00000000:UART禁止
0x00000004:UART許可
PSELRTS 0xFFFFFFFF 0~31:RTSに使用する端子番号
0xFFFFFFFF:UART使用禁止
PSELTXD 0xFFFFFFFF 0~31:TXDに使用する端子番号
0xFFFFFFFF:UART使用禁止
PSELCTS 0xFFFFFFFF 0~31:CTSに使用する端子番号
0xFFFFFFFF:UART使用禁止
PSELRXD 0xFFFFFFFF 0~31:RXDに使用する端子番号
0xFFFFFFFF:UART使用禁止
ERRORSRC 0x00000000 bit0
0:Overrunエラー未発生
1:Overrunエラー発生
bit1
0:Parityエラー未発生
1:Parityエラー発生
bit2
0:Framingエラー未発生
1:Framingエラー発生
bit3
0:ブレーク条件未発生
1:ブレーク条件発生
CONFIG 0x00000004 bit0
0:フロー制御禁止
1:フロー制御許可
bit2:bit1
0x00:Parityなし
0x07?:Parityあり
BAUDRATE 0x01980000ボーレート

 

・初期設定

PSELTXDレジスタとPSELRXDレジスタにより、TX機能とRX機能端子を割り当てるか設定します。

また、TX機能を割り当てた端子を出力端子に設定して、初期値をHigh出力にします。RX機能を割り当てた端子を入力端子に設定します。

 

CONFIGレジスタでフロー制御やパリティビットを使うかどうかを決めます。

フロー制御を有効にした場合は、PSELRTSレジスタとPSELCTSレジスタにより、RTS機能とCTS機能端子を割り当てるか設定します。

また、RTS機能を割り当てた端子を出力端子に設定して、初期値をHigh出力にします。CTS機能を割り当てた端子を入力端子に設定します。

 

BAUDRATEレジスタで通信速度を何bpsにするか決めます。

 

最後にENABLEレジスタをUART許可にすれば、UART初期設定完了です。

 

・送信

タスク信号STARTTX taskを1にすると送信シーケンスが始まります。

TXDレジスタに書き込むことで送信されます。イベント信号EVENTS_TXDRDYが1になると送信完了です。

EVENTS_TXDRDYを監視して、1になるまで待機してから、EVENTS_TXDRDYを0にクリアします。

STOPTX taskにより送信シーケンスは停止します。

 

・受信

タスク信号STARTRX taskを1にすると受信シーケンスが始まります。

イベント信号EVENTS_RXDRDYが1になると受信データが在ることを意味します。

EVENTS_RXDRDYを監視して、1になるまで待機してから、RXレジスタのデータを読み込み、EVENTS_RXDRDYを0にクリアします。

STOPRX taskにより受信シーケンスは停止します。

 

・関数

Noridicが提供するサンプルプログラムは以下になります。

nRF5 SDK guides - Nordic DevZone

 

・simple_uart_get

1byte受信関数

 

・simple_uart_get_with_timeout

タイムアウト機能付き1byte受信関数。タイムアウト時間はmsec単位で指定可能。

 

・simple_uart_put

1byte送信関数

 

・simple_uart_putstring

文字列送信関数

 

・simple_uart_config

UART初期設定関数。ボーレート初期設定値38400bps。

 

・補足

UARTのサンプルプログラムをKeilで開くとnrf_dleay.hにErrorが表示されることがありますが、コンパイルは正常に行えます。特定のバージョンのKeil環境に由来する無視しても問題ない擬似エラーです。

The Keil shows an error when #include "nrf_delay.h" - Nordic Q&A - Nordic DevZone - Nordic DevZone

 

・実験

Norodicが提供しているuart_exampleを使用してみました。

まずはビルドして書き込みます。このサンプルプログラムはS110ドライバが書き込まれていると書き込みできないので、一度Erase allでS110を消してから、Programで書き込みます。

f:id:yegang:20140914151300j:plain

最初はnRFGoマザーボードでプログラムを走らせ、送信は正常に行えたのですが、受信はうまくいきませんでした。

プログラムの問題ではなく、UARTケーブルとnRFGoマザーボードとパソコンの相性が悪いからだと考え、自作の評価ボードで試したところ正常に送受信できるようになりました。

f:id:yegang:20140914151316j:plain

 

追記

 

・受信割り込み

受信による割り込みを発生させたい場合は、UARTの初期設定に以下を追加します。

    NRF_UART0->INTENSET      |= (UART_INTENSET_RXDRDY_Enabled << UART_INTENSET_RXDRDY_Pos );
    
    NVIC_EnableIRQ(UART0_IRQn);

以上を追加すると、受信時に関数UART0_IRQHandlerが呼び出されます。

例えば、UART0_IRQHandlerにおいて、受信データを変数に格納し、そのデータをそのまま送信する処理をさせてみます。

void UART0_IRQHandler(void)
{
        uint8_t cr = simple_uart_get();
        simple_uart_putstring((const uint8_t *)"\n\rYour input is ");
        simple_uart_put(cr);
}

キーボードから文字を入力すると、受信割り込みによりUART0_IRQHandlerの処理が実行されているのが確認できます。

f:id:yegang:20140920134017j:plain