PIC24FのUSBモジュール内にある1msタイマー

PIC24FJ64GB002などのUSB Hostモジュールが内蔵されているPICマイコンについて、どうもこのモジュール内に独立した1msecのタイマーが内蔵されているのを知りました。プリスケーラなどの設定が不要で、1msec経つと割り込みが発生するシンプルな仕組みです。

otg_timer01

下記の例では、100ms経過ごとに26番ピン(LATB15)に接続したLEDを点滅させるプログラムになる。オシレータ、ピン設定などはMCCを使っています。

ポイントとしては、USBモジュール内にあるようなので、このモジュールの電源ONすることと、USBモジュールとそのタイマーの割り込みをONしておきます。1msごとの割り込みなので、カウンターを使って100カウントしたらON/OFFしています。

MLAやMCCでUSB機能を有効にしたときに追加されるusb_host.c内でも使っています。データシートにはレジスタぐらいしか触れてないので知りませんでした。USB機能を使うときにタイマーを使ってdelayしたくなります。このときに通常のタイマーはべつの目的にで使う使いたい?と思ってたので丁度良いです。

#include "mcc_generated_files/system.h"

static volatile uint16_t msec_count = 0; 

void __attribute__((interrupt,auto_psv)) _USB1Interrupt(){
    IFS5bits.USB1IF = 0;
    if(U1OTGIEbits.T1MSECIE && U1OTGIRbits.T1MSECIF){
        U1OTGIRbits.T1MSECIF = 1;
        msec_count += 1;
    }
}

int main(void)
{
    SYSTEM_Initialize();
    _LATB15 = 0;
    
    // usb module on
	U1PWRCbits.USBPWR = 1;
    
    // interrupt on
    U1OTGIEbits.T1MSECIE = 1;
    IEC5bits.USB1IE = 1;
    IPC21bits.USB1IP = 1;
    
    while (1){
        // interval 100msec
        if( msec_count >= 100 ){
            _LATB15 ^= 1;
            msec_count = 0;
        }
    }
    return 1;
}