Interface誌 付属FM3基板 で タイマ割り込みがようやく使えるようになりました。デュアルタイマ、多機能タイマ何れもタイマ割り込みによるLEDの点滅が実現できました。
苦戦1週間余り、富士通からダウンロードしたサンプルプログラム(mb9bf51xt_dualtimer-v10)を幾度も見直すのですが、これが難解、ただ単に、ただ単に3つのレジスタを設定するだけでタイマを使えるようになるはず、と思いながら、解読。
レジスタおよび、レジスタの項目ごとの設定順をああでもない、こうでもないと。
実際にタイマが機能し始めたとき、このプログラムは何度か試したと思い。なんでこんな簡単なプログラムに手間取ったのか、少々じくじたる思い。
以下にそのプログラムソースを記します。(最も簡単なタイマ割り込みプログラム。
◎多機能タイマについて。
多機能タイマのユニット2(3つ目のユニット)が機能しない。富士通のデータシート等を見ると、MB9BF610Tシリーズの多機能タイマは3(最大)となっていて、ほかの資料も最大3ユニット、「ほんとは2ユニット、1ユニット??」という気になる。
また、多機能タイマのコーディングでは、しばらく、ユニットと、チャネルとを取り違えるミスをしていて気が付かなかった。凡ミスでユニット2が機能しないだけのことかもしれません。
=======デュアルタイマ main.c ========
#include "mcu.h"
static volatile uint16_t int_count;
void DT_Handler(void)
{
/* Clear Interrupt */
FM3_DTIM->TIMER1INTCLR = 0xffffffffU;
int_count++;
int_count &= 0x7fff;
FM3_GPIO->PDOR5_f.P1 = (int_count & 0x0040) >>6;
FM3_GPIO->PDOR5_f.P2 = (int_count & 0x0100) >>8;
}
int32_t main(void)
{
int i;
int_count = 0;
// for LED1
bFM3_GPIO_DDRF_P3=1;
// Test Output Port (LED_A LED_B LED_C)
bFM3_GPIO_DDR5_P0=1;
bFM3_GPIO_DDR5_P1=1;
bFM3_GPIO_DDR5_P2=1;
// Configuration ( Dual Timer )
/* Clear Interrupt */
FM3_DTIM->TIMER1INTCLR = 0xFFFFFFFFU;
FM3_DTIM->TIMER1CONTROL =0x00000000U;
FM3_DTIM->TIMER1CONTROL_f.ONESHOT =0;
FM3_DTIM->TIMER1CONTROL_f.TIMERMODE =1;
FM3_DTIM->TIMER1CONTROL_f.TIMERPRE0 =0;
FM3_DTIM->TIMER1CONTROL_f.TIMERPRE1 =0;
FM3_DTIM->TIMER1CONTROL_f.TIMERSIZE =1;
FM3_DTIM->TIMER1CONTROL_f.INTENABLE =1;
FM3_DTIM->TIMER1LOAD = 0xFFFFFFFFU;
/* enable interrupt */
NVIC_EnableIRQ(DTIM_QDU_IRQn);
//Set the count cycle
FM3_DTIM->TIMER1LOAD = 0x00020000;
FM3_DTIM->TIMER1CONTROL_f.TIMEREN =1;
while(1){
for(i=0;i<200000;i++){
bFM3_GPIO_PDORF_P3 =1;
}
for(i=0;i<200000;i++){
bFM3_GPIO_PDORF_P3 =0;
}
}
}
=======多機能タイマ main.c ========
#include "mcu.h"
static volatile uint16_t int_count;
void MFT_FRT_IRQHandler(void)
{
/* Clear Interrupt */
FM3_MFT0_FRT->TCSA0_f.ICLR = 0x00;
int_count++;
int_count &= 0x7fff;
FM3_GPIO->PDOR5_f.P0 = (int_count & 0x0020) >>5;
FM3_GPIO->PDOR5_f.P1 = (int_count & 0x0040) >>6;
FM3_GPIO->PDOR5_f.P2 = (int_count & 0x0080) >>7;
}
int32_t main(void)
{
int i;
int_count = 0;
// LED1
bFM3_GPIO_DDRF_P3=1;
// Test Output Port (LED_A LED_B LED_C)
bFM3_GPIO_DDR5_P0=1;
bFM3_GPIO_DDR5_P1=1;
bFM3_GPIO_DDR5_P2=1;
// Configuration ( // Configuration ( Multi-function Timer ))
FM3_MFT0_FRT->TCSA0 = 0x00;
FM3_MFT0_FRT->TCSA0_f.CLK0 = 0x01;
FM3_MFT0_FRT->TCSA0_f.CLK1 = 0x01;
FM3_MFT0_FRT->TCSA0_f.CLK2 = 0x00;
FM3_MFT0_FRT->TCSA0_f.CLK3 = 0x00;
FM3_MFT0_FRT->TCSA0_f.MODE = 0x00;
FM3_MFT0_FRT->TCSA0_f.SCLR = 0x00;
FM3_MFT0_FRT->TCSA0_f.STOP = 0x01;
FM3_MFT0_FRT->TCSA0_f.BFE = 0x00;
FM3_MFT0_FRT->TCSA0_f.ICRE = 0x01;
FM3_MFT0_FRT->TCSA0_f.ICLR = 0x00;
FM3_MFT0_FRT->TCSA0_f.IRQZE = 0x00;
FM3_MFT0_FRT->TCSA0_f.IRQZF = 0x00;
FM3_MFT0_FRT->TCSA0_f.ECKE = 0x00;
FM3_MFT0_FRT->TCSB0 = 0x00000000;
FM3_MFT0_FRT->TCDT0 = 0x0000;
NVIC_EnableIRQ(FRTIM_IRQn);
FM3_MFT0_FRT->TCSA0_f.SCLR = 0x01;
//Set the count cycle
FM3_MFT0_FRT->TCCP0 = 0x1000;
FM3_MFT0_FRT->TCSA0_f.STOP = 0x0;
while(1){
for(i=0;i<200000;i++){
bFM3_GPIO_PDORF_P3 =1;
}
for(i=0;i<200000;i++){
bFM3_GPIO_PDORF_P3 =0;
}
}
}
0 件のコメント:
コメントを投稿