浜松市にいる組み込みおやじ-電子工作、回路設計、ファーム TIPS

このブログはビーコンの代表である菅原が、電気電子、電子工作、組み込みソフトウェアなどで、自分が苦労したところや面白い発見などを記事にしていきます。電子工作やマイコンに親しむ人が少しでも増えたらという思いでつづります。
やっぱり、電子工作が好きなんですよ。
nRF52 P0.10,P0.9が操作できない問題について
0

    nRF52で P0.9,P0.10が操作できなくて、ちょっとはまったのでメモしておく。

     

    P0.9,p0.10を出力に設定しても、ポートの操作ができない問題に直面。

    これは NRF_UICR->NFCPINSの設定が 1になっていて、P0.9,P0.10を NFCで使うモードになっているためと判明。

    ちなみに、デフォルト値は1 なので、なにもしないと NFCモードになる。
     

    で プロジェクトの中でNRF_UICR->NFCPINSの設定をしているところがあるのではないかと検索すると、一つだけヒット。。

    CONFIG_NFCT_PINS_AS_GPIOSを定義しておけば、P0.9,P0.10をGPIOとして設定するコードが有効になるので、GPIOとして使えるようになる。

     

    NRF_UICRは不揮発メモリなので一度設定してしまえば、電源を再投入してもリセットしてもGPIOモードのままになる。

     

    CONFIG_NFCT_PINS_AS_GPIOSの定義が見当たらなかったので、 該当する  #if defined (CONFIG_NFCT_PINS_AS_GPIOS)の直前に定義してみたところ、設定が書き換わり、P0.9,P0.10のポート操作ができるようになった。

     

    system_nrf52.c 140行目あたり(nRF5_SDK_11.0.0_89a8197)

            // add by sugawara
    #define     CONFIG_NFCT_PINS_AS_GPIOS 1

        /* Configure NFCT pins as GPIOs if NFCT is not to be used in your code. If CONFIG_NFCT_PINS_AS_GPIOS is not defined,
           two GPIOs (see Product Specification to see which ones) will be reserved for NFC and will not be available as
           normal GPIOs. */

        #if defined (CONFIG_NFCT_PINS_AS_GPIOS)
            if ((NRF_UICR->NFCPINS & UICR_NFCPINS_PROTECT_Msk) == (UICR_NFCPINS_PROTECT_NFC << UICR_NFCPINS_PROTECT_Pos)){
                NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos;
                while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
                NRF_UICR->NFCPINS &= ~UICR_NFCPINS_PROTECT_Msk;
                while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
                NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos;
                while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
                NVIC_SystemReset();
            }
        #endif

    | ビーコン菅原 | nRF5x Nordic | 12:15 | comments(0) | trackbacks(0) |
    nRF5x をGCCでコンパイルする。(暫定)
    0

      JUGEMテーマ:組み込み開発

       

      nR52をGCCでコンパイルしたので、メモとする。

      いつもは恵まれた統合開発環境を使っていたこともあり、GCCを使う機会が無かったこともあり、なおかつ、Linux使いというわけでもなく、なじみが無かったので、結構苦労した。

       

      参考にしたサイト

      GCC ARM Toolchainでmbedをオフラインビルド

       

      ここより抜粋

      GCC ARM Toolchainのインストール

      gcc-arm-none-eabi-4_8-2013q4-20131204-win32.exeをダウンロードして、実行する。

      忘れずに、最後はAdd path to environment variableにチェックを入れる。(環境変数を追加してくれる)

      Gnu Makeの追加

      C:¥Program Files (x86)¥GNU Tools ARM Embedded¥4.8 2013q4¥binに下記のファイルを追加する。

      make.exe
      libiconv2.dll
      libintl3.dll
      上記ファイルは、sorceforge.netのmake-3.81-bin.zipとmake-3.81-dep.zipの中にある。
      引用終わり・・

      --

      ということで、

      今回は ble_app_nrsをコンパイルしてみたかったので

      ・・・¥nRF5_SDK_12.2.0_f012efa¥examples¥ble_peripheral¥a_ble_app_hrs¥pca10040¥s132¥armgcc

      のディレクトリまでおりて

      makeを実行。

      するとなにやらエラーが出てくる。

       

      ¥nRF5_SDK_12.2.0_f012efa¥components¥toolchain¥gcc¥Makefile.windows

      の中を見てみると

      インストールされているコンパイラのバージョンが違っていて、そのためにインストールされているフォルダが違っていた。

      4.9 2015q3 を 4.8 2014q3 に書き換えた。

       

      GNU_INSTALL_ROOT := C:/Program Files (x86)/GNU Tools ARM Embedded/4.8 2014q3
      GNU_VERSION := 4.9.3
      GNU_PREFIX := arm-none-eabi
       

      再び makefileのフォルダでmake.exeを実行するとコンパイルがあっさり通った。

       

      Keil の統合開発環境で見てみるとよくわかるが、Nordicが提供しているプロジェクトは階層構造が結構複雑だ。

      CUIの環境ではこれを見渡すのが難しいことと、いまのままではデバッガが使えない。いろいろと改善の余地があるけれど、まずはこれで開発を進めていく。

       

       

       

       

      | ビーコン菅原 | nRF5x Nordic | 09:06 | comments(0) | trackbacks(0) |
      nRF51のサンプルソースは内部クロックに設定されている。
      0
        JUGEMテーマ:組み込み開発

        nRF51 はNordic社のARMデバイスとなりますが、Bluetooth LEのプロセッサとして、あちこちのBLEのモジュールに搭載されています。

        で、このデバイスは低消費電力であったり、ソフトウェアを介さずにペリフェラルを連結できたり、というハードウェアの魅力もありますが、サンプルソースが公開されていて、それをベースに開発が始められるということで、サポートが充実していることもよいですね。

        で、前回はまったところを報告したいと思います。

        タイマーとADCを接続して、定期的なサンプリングをしたかったのですが、どうもサンプル周期の精度が悪いということがありました。
        nRF51は 内蔵の16Mhz RCクロックと 外部に 16MHz/32Mhzの水晶振動子を接続して 16MHzのクロックを発生できます。
        私が参考にしたNordicのサンプルソースでは 内部クロックを使用していました。
        そのために、サンプル周期がぴたりとあわないということです。

        2.4GHzの無線を使用しているので、クロックは水晶振動子に違いないと思い込んでおりました。
        無線に関するところは、専用に精度がよいクロック源を使っているかもしれません。

        外部クロックに切り替えたところ、一定の値を示すようになりました。

        ちなみに 外部クロックに切り替えるサンプルソースです。
        nRF51で。動作しています

        // 外部クロック(32MHzクリスタル)に切り替える
        NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
        NRF_CLOCK->TASKS_HFCLKSTART    = 1;
        while ( NRF_CLOCK->EVENTS_HFCLKSTARTED == 0){
            // イベント待ち
            __NOP();
        }
         
        | ビーコン菅原 | nRF5x Nordic | 21:50 | comments(0) | trackbacks(0) |
              1
        2345678
        9101112131415
        16171819202122
        23242526272829
        30      
        << April 2017 >>
        + RECOMMEND
        + RECOMMEND
        + SELECTED ENTRIES
        + RECENT COMMENTS
        + RECENT TRACKBACK
        + CATEGORIES
        + ARCHIVES
        + つぶやき
        + MOBILE
        qrcode
        + LINKS
        + PROFILE