【PIC32MX370F512H】タイマーを使ってみる。

2021年2月22日

PIC32MXのタイマー機能概要

2種類のタイマーがあり、
・タイマーAは16bitタイマー。
・タイマーBは16/32bitいずれかを選択できるタイマー。T32bitで選択
今回はタイマーAの16bitタイマーを使ってみます。

参照

リファレンスマニュアルDS61105F_JPを参照しました。
設定は16bitPICとほとんど変わりありません。
以前作成した記事
【dsPIC33FJ128MC802】タイマー機能を使ってみる。をそのまま流用しました。

クロックの設定

クロックのソースはシステムクロックではなくペリフェラルクロックなので注意が必要です。
今回はコンフィグレーションで「システムクロックの1/2設定」としました。
 FPBDIV = DIV_2

T1CONレジスタの設定

ほとんどのbitは「0」でOKです。
①TimerONbitの設定:タイマ有効
「T1CONbits.ON = 1」
1でタイマが有効となります。
②TCKPSbitの設定:タイマ入力クロックのプリスケール
「 T1CONbits.TCKPS = 0b00;」
00は「1:1」となります。

プログラム

10msec毎にポートDのbit9をパタパタさせます。
システムクロックは、外付けセラロック10MHzを1/2で5MHzを入力し
PLLで24倍して100MHzにしてます。
2014/9/21:訂正)
システムクロックは内部発振8MHzを1/2で4MHz入力して
PLLで24倍だから96MHz。
タイマークロックソースはペリフェラルクロックを用います。
ペリフェラルクロックはシステムクロックを1/2しましたので48MHzとなります。

#include <stdio.h>
#include <plib.h>
#include <p32xxxx.h>
#include <stdlib.h>
#include "my_header.h"
//== configuration
//== OSC:8MHz SYSCLK:80MHz= OSC_8/PLLI_2=4MHz*MUL_20 ====================
#pragma config FNOSC=FRCPLL     //Oscillator_selection_bits(FNOSC)
#pragma config POSCMOD=OFF      //secondary_Oscillator_Enable(FSOSCEN)
//#pragma config FNOSC=PRIPLL     //Oscillator_selection_bits(FNOSC)
//#pragma config POSCMOD=XT      //secondary_Oscillator_Enable(FSOSCEN)
#pragma config FPLLMUL=MUL_24   //PLL_Multiplier(FPLLMUL)
#pragma config FPLLIDIV=DIV_2   //PLL_input_driver(FPLLIDIV)
#pragma config FPLLODIV=DIV_1   //PLL_output_clock_divider(FPLLODIV)
#pragma config FPBDIV=DIV_2     //Peripheral_clock_divisor(FPBDIV)
#pragma config FSRSSEL = PRIORITY_7 //shadow_register_set_priority_select(FSRSSEL)
#pragma config PMDL1WAY = OFF       //peripheral_module_disable_configuration(PMDL1WAY)
#pragma config IOL1WAY = OFF        //peripheral_pin_select_configuration(IOL1WAY)
#pragma config FSOSCEN = OFF        //secondary_oscillator_enable(FSOCEN)
#pragma config IESO = OFF           //internal_external_switch_over(IESO)
#pragma config OSCIOFNC = OFF   //CLKO_output_signal_active_on_the_OSCO_pin(OSCIOFNC)
#pragma config FCKSM = CSDCMD   //clock_switching_and_monitor_selection(FCKSM)
#pragma config WINDIS = OFF     //watchdog_timer_is_in_non-window_mode(WINDIS)
#pragma config FWDTEN=OFF       //watchdog_timer_window_enable(FWDTEN)
#pragma config DEBUG = OFF      //debugger_is_disable(DEBUG)
#pragma config JTAGEN = OFF     //JTAG_disable
#pragma config ICESEL=ICS_PGx3  //ICE_ICD_Comm_channel_select(ICESEL)
#pragma config PWP = OFF        //program_flash_write_protect(PWP)
#pragma config BWP = OFF        //boot_flash_write_protect_bit(BMP)
#pragma config CP = OFF         //code_protect(CP)
//== function_prototype ====================================================
//== array_initialize ==================================================
unsigned char string_box1[15] = "abcdefg¥r¥n" ;
unsigned char rev_data[] = "----¥r¥n";             //UART_receive_string
unsigned char tes_d[49000];
//== main_function ====================================================
int main(void) {
//== OSC =================================================
SYSTEMConfigPerformance(96000000);    //system_clock_96MHz
//== JTAG ================================================
//DEVCFG0bits.JTAGEN = 0;             //JtagDisable
CFGCONbits.JTAGEN = 0;              //JtagPortDisable
//== PORT ================================================
TRISB = 0x00000000;
TRISC = 0x00000000;
TRISD = 0x00000000;
TRISE = 0x00000000;
TRISF = 0x00000000;
TRISG = 0x00000000;
ANSELB = 0x00000000;
ANSELC = 0x00000000;
ANSELD = 0x00000000;
ANSELE = 0x00000000;
ANSELF = 0x00000000;
ANSELG = 0x00000000;
//== T1CON ===============================================
T1CON = 0x00000000;     //Clear
T1CONbits.TON = 0;      //<15>Timer1_OFF
T1CONbits.TSIDL = 1;     //<13>Idelmode:SleepStop
T1CONbits.TGATE = 0;    //<7>Gatetime:OFF
T1CONbits.TCKPS = 0B00; //PS1:1
T1CONbits.TCS = 0;      //ClockSource:INT
IEC0bits.T1IE = 0;      //Interrupt:disable
IPC1bits.T1IP = 0;      //InterruptLevel:0
//== Interrupt ENABLE ===========================================
//INTCONbits.MVEC   = 1;      //Multi_Vector
//asm volatile("ei");         //Enable_Interrup
//== preprocessing ==============================================
//== while ======================================================
while(1)
{
LATDbits.LATD9 = !LATDbits.LATD9;
delay_ms(10);
}//while(1)
}//int main(void)
//== delay_us ==============================================================
void delay_us(unsigned int usec)
{
TMR1 = 0;   //TMR1=0
T1CONbits.TON = 1;    //Timer1_start
PR1 = 47;   //
unsigned int i;
for(i=0; i<usec; i++)
{
while(!IFS0bits.T1IF);  //Timer1Interrupt(IFS0bits.T1IF==0)
IFS0bits.T1IF = 0;  //InterruptFlagDown
}//for(i=0; i<usec; i++)
}//void delay_us(unsigned int usec)
//== delay_ms ==============================================================
void delay_ms(unsigned int msec)
{
unsigned int i;
for(i=0; i<msec; i++)
{
delay_us(1000);      //call:1000usec
}//for
}//void delay_ms(unsigned int msec)
//== end ==============================================================

出力波形の確認

PIC32MX370F512Hでタイマー機能を使う
オシロでポート制御にてタイマー機能を確認

ピンク色の波形が出力波形です。
ちゃんと10msec毎に出力が切り替わってます。
一応成功みたい。

よろしければバナーをクリックお願いします!