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

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

    JUGEMテーマ:組み込み開発

     

    nRFのスタックの指定についてメモ。

    nRF52シリーズのマイコンのBLEプロジェクトをarm-none-eabi-gccで開発しているがスタックは指定をしないと0x2000となっている。これを変更したい場合 Makefileの ASMFLAGS に -D__STACK_SIZE=(スタックサイズ)の指定をする。

    # Assembler flags common to all targets
    ASMFLAGS += -x assembler-with-cpp
    ASMFLAGS += -D__STACK_SIZE=2048
    ASMFLAGS += -DNRF52
    ASMFLAGS += -DNRF52_PAN_36
    ASMFLAGS += -DNRF52_PAN_64
    ASMFLAGS += -DSOFTDEVICE_PRESENT
    ASMFLAGS += -DBOARD_PCA10040

     

    これはcomponents/toolchain/gcc/gcc_startup_nrf52.S  (または gcc_startup_nrf51.S)

    で __STACK_SIZE が定義されていたら、それをスタックサイズとする。定義がなければ 8192とする。

    ( gcc_startup_nrf51.Sでは 定義が無い場合 2048にする。)

        .section .stack
        .align 3
    #if defined(__STARTUP_CONFIG)
        .equ    Stack_Size, __STARTUP_CONFIG_STACK_SIZE
    #elif defined(__STACK_SIZE)
        .equ    Stack_Size, __STACK_SIZE
    #else
        .equ    Stack_Size, 8192
    #endif
        .globl __StackTop
        .globl __StackLimit
    __StackLimit:
        .space Stack_Size
        .size __StackLimit, . - __StackLimit
    __StackTop:
        .size __StackTop, . - __StackTop
     

     

    components/toolchain/arm/arm_startup_nrf52.S

    を確認したところ スタックに関しては同様の記述だったので、 Keilの環境でもアセンブラのオプションに__STACK_SIZE= スタックサイズ の指定を加えたら良いと思われる。

    | ビーコン菅原 | nRF5x Nordic | 04:01 | comments(0) | trackbacks(0) |
    fstrageの処理中にリセット動作が起こる。
    0

      nRF52で、外付けADCで常時サンプリングするプログラムを開発している。

      ここで 設定を変えたいがために Nordicが提供しているライブラリ FlashStrageという仕組みを使っている。

      サンプルソースを元にコーディングしたが、イレース動作か書き込み動作でリセットしてしまうと言うことが起きていた。

       

      FlashStrageは Bluetooth動作にも配慮した動作をする。ソースを参照してみると fs_eraseとかfs_store などの消去、書き込みのコマンドを発行しても即座に動作せずに、一旦キューに蓄えておいて、動作できるタイミングで順次実行しているようだ。

      海外のサイトなどを当たっても、Nordicのサイトでも特に実装上の注意書きはない。

       

      いろいろ動作のタイミングを探っていたが、ADCのアクセスのタイミングとバッティングしたときにリセット動作が起こっているらしいとわかってきた。

      ADCとnRF52は SPIのインターフェースで以下の手順で通信する。

       

      ・ADC発行のデータレディー信号を割込みにして、割り込み処理内でSPIで該当するレジスタを読み込む

      ・SPI通信終了のハンドラでデータを取得

       

      今回は測定値を保存するなどではなく設定の時だけ FlashStrageを使いたいので、以下の対策をした。

      ADC動作中はFlashStrageを発行しない。(発行を一時待つ)

      FlashStrage動作中はADCの割込みを無視する。

       

      ということでバッティングを回避する処理を入れたら、問題のリセット動作は発生しなくなった。

       

       

      JUGEMテーマ:組み込み開発

      | ビーコン菅原 | nRF5x Nordic | 06:56 | comments(0) | trackbacks(0) |
      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) |
           1234
        567891011
        12131415161718
        19202122232425
        262728293031 
        << August 2018 >>
        + RECOMMEND
        + RECOMMEND
        + SELECTED ENTRIES
        + RECENT COMMENTS
        + RECENT TRACKBACK
        + CATEGORIES
        + ARCHIVES
        + つぶやき
        + MOBILE
        qrcode
        + LINKS
        + PROFILE