LPC1343 32bit Timerの割り込み処理
出来た事
1.32bit Timerの割り込み処理
- NVIC_EnableIRQ(TIMER_32_1_IRQn)で割り込み有効化
- cr_startup_lpc13.cの中で該当の関数を探す
- Example codeでリセットなどを確かめる
今日は割り込みにチャレンジ!!
書き方なんぞ良くわかってなかったですがイロイロ調べて何とかできました。
NVIC_EnableIRQ(TIMER_32_1_IRQn);
この記載で割り込みを有効にする。(32bitタイマーの割り込み有効)
そして、割り込みの関数の記載の仕方は
Projectのscrの中にある
cr_startup_lpc13.c に入ってます。
それらしき名前のものできっと正しいです。
ちなみに32bit タイマーの割り込み関数は
void TIMER32_0_IRQHandler(void)
void TIMER32_1_IRQHandler(void)
の2つで、今回はCT32B1を使うのでTIMER32_1_IRQHandlerの方を使います。
今回はPWMのDutyを変えてLEDの調光を行いました。
回路は前回と同じです。AD2(P1_1)を使います(=CT32BMAT0)
動作は以下の図のようにPWMのdutyを変えて明るさを変化させます。
PWMの1周期は100Hzです。
0.1秒毎に5%ずつDutyを減らして5%になったら95%にして繰り返しです。
95%→90%→・・・・5%→95%
この0.1秒毎にDutyを変化させることをTimerの割り込みで実行します。
コードです。
#ifdef __USE_CMSIS
#include "LPC13xx.h"
#endif#include
#include
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;
int main(void) {
volatile static int i = 0 ; // dummy counterNVIC_EnableIRQ(TIMER_32_1_IRQn); // enable Timer32_1 interrupt handler
// 32bit counter
LPC_SYSCON->SYSAHBCLKCTRL |=0x400; // Timer32B1 Turn ON
LPC_IOCON->JTAG_TDO_PIO1_1 =0x83; // PIO1_1 as 32B1_MAT0
LPC_TMR32B1->PR =7200-1; // 10kHz(Max 32bit dec:4294967295)
LPC_TMR32B1->PWMC |=0x01; // MAT0 as PWM
LPC_TMR32B1->MCR =0x600; // MR3 as Period of 32B1 and interrupt
LPC_TMR32B1->MR0 =50; // PWM High
LPC_TMR32B1->MR3 =100; // PWM Period 10kx100=100Hz
LPC_TMR32B1->TCR =2; // TCR Reset
LPC_TMR32B1->TCR =1; // TCR start// Enter an infinite loop
while(1) { // Infinite loop
i++; // dummy count.
}
return 0 ;
}void TIMER32_1_IRQHandler(void) {
static int t = 0 ; // interrupt counter
static int duty=50; // duty counter
if(t>=9){ //100 Hz x10=0.1s
t=0;
LPC_TMR32B1->MR0 =duty;
if(duty>=95){
duty=5;
}else{
duty=duty+5;
}
}else{
++t;
}
LPC_TMR32B1->IR=0x08; //clear interrupt flag
}
最初に以下でタイマーの割り込みを有効にしておく必要があります。
NVIC_EnableIRQ(TIMER_32_1_IRQn); // enable Timer32_1 interrupt handler
MR3でタイマーのリセットと割り込みを発生させる設定です。
LPC_TMR32B1->MCR =0x600; // MR3 as Period of 32B1 and interrupt
PWMの周期は10kHz x100カウントで100Hzになるようにしました。
LPC_TMR32B1->PR =7200-1; // 10kHz(Max 32bit dec:4294967295)
LPC_TMR32B1->MR3 =100; // PWM Period (Max 32bit dec:4294967295)
割り込みの中はPWM 100cyc毎にDutyを5%ずつ上げて95%になったら5%に戻す記載ですが
特記すべきところは以下です。
LPC_TMR32B1->IR=0x08; //clear interrupt flag
Example codeにも合ったので追加しときました。
今回はMR3を割り込みに使っているので対応するIRレジスタに1を書いてリセットしています。
ちなみに0を書いたり、この記載がなかったりするとおかしな動作をしました。