ãšã³ããªãŒ
ãªããªãŒã
ååã®èšäºãæžããŠãããããªãã®æéãçµã¡ãŸããããè¬çœªããŸãïŒè©Šéšãå ¥åŠãç 究éå§ã ã»ãã·ã§ã³ããŸã é ããæè²ããã»ã¹ããã§ã«ããã»ã©æéããããŠããªãå ŽåãK1986BE92QIã®éçºã«é¢ããèšäºãæžãç¶ããããšãã§ããŸãã
äœæ¥èšç»
以åã®èšäºãžã®ã³ã¡ã³ãã§ã¯ãã¬ãžã¹ã¿èšå®ãä»ããŠãã€ã¯ãã³ã³ãããŒã©ãŒã䜿çšããã ãã§ãªããSPLïŒèªååšèŸºæ©åšã»ããã¢ããçšãŠãããŒãµã«ã©ã€ãã©ãªãŒïŒã䜿çšããããšãã«ããŒããããã«æ±ããããŸããã CMSISã䜿çšããŠæåã§æ§æãã代ããã«SPLã䜿çšããèªæã¯çŽ æŽããããã®ã§ãããåžžèã«åããŠãå¯èœãªéãSPLã䜿çšãå§ããå¯èœæ§ãé«ããããç§ãã¡ãæåã«å§ãããšãã¯ããŸããã§ããã ããã§ãããã€ãã®åšèŸºãããã¯ãæåã§æäœããããšãåŠãã ã®ã§ãSPLã«è§ŠããŠãå®éã®ã¿ã¹ã¯ã§äž¡æ¹ã®ã¢ãããŒãã®å¹çãæ¯èŒã§ããŸãã
ç®ç
æè²äžã®ç®æšãšããŠãPWM-aïŒãã«ã¹å¹ å€èª¿ïŒã䜿çšããŠLEDãç¹æ» ãããåšæ³¢æ°ã§ãã¿ã³ã調æŽããŸãã ãã¿ã³ã¯ãå¥ã®ã¿ã€ããŒã«ããå²ã蟌ã¿ã§ãããŒãªã³ã°ãããŸããããŒãªã³ã°æã«ã¯ã2çªç®ã®LEDã®ç¶æ ãå転ããŸãã ãã®ã¿ã¹ã¯ãå®è£ ããã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
1.æåå¶åŸ¡çšã«LEDã«æ¥ç¶ãããå ¥åºåããŒãã®åºåãæ§æããŸãã ãã®LEDã¯ãå²ã蟌ã¿ã«å ¥ã£ãŠãã¿ã³ãããŒãªã³ã°ããããšã瀺ããŸãã
2. 2çªç®ã®LEDã«æ¥ç¶ãããå ¥åºåããŒãã®åºåãã¿ã€ããŒããã®å¶åŸ¡ã¢ãŒãã«èšå®ããŸãã ããã¯ãæåã®ã¿ã€ããŒããã®PWMä¿¡å·ãäŸçµŠãããå Žæã§ãã
3.æåã®ã¿ã€ããŒãã2çªç®ã®LEDã«PWMä¿¡å·ãäŸçµŠããã¢ãŒãã«èšå®ããŸãã
4.ããŒãããŒãªã³ã°ããå²ã蟌ã¿ãããªã¬ãŒããã¿ã€ããŒãæ§æããŸãã
5.ã¿ã€ããŒã¬ãã«ïŒç¹å®ã®ã€ãã³ãçšïŒããã³2çªç®ã®ã¿ã€ããŒå šäœããã®å²ã蟌ã¿ãã¯ã¿ãŒã®äžè¬çãªããŒãã«ã¬ãã«ã§ã®å²ã蟌ã¿ã®äœ¿çšãèš±å¯ããŸãã
æåãã¥ãŒãã³ã°
ã¿ã€ããŒ1. PWMã®å®è£
ãã®èšäºã§æ¢ã«ã¿ã€ããŒã«ééããŠããŸã ã ãããããã®æç¹ã§ã¯ãŸã£ããç°ãªãç®æšããããçŸåšã®ã»ããã¢ããã¯äžèšã®èšäºã§èª¬æãããã®ãããå°ãè€éã§ãã
å§ããŸãããã
- æåã«ãã¿ã€ããŒãåæåããé¢æ°ã®ç©ºã®ã·ã§ã«ãäœæããŸãã å
¥åã§ã¯ãPWMé床ãç¹åŸŽä»ããå€ããšãå¿
èŠããããŸãã 圌女ã¯çµ¶å¯Ÿã«ã©ããªååã§ãæ§ããŸããã
ããšãã°ãããã// . void initTimerPWMled (uint32_t PWM_speed) { }
- 次ã«ãã¿ã€ããŒã®æ§é ãæãåºããŠãã ããã
ã¿ã€ããŒæ§é
ãã€ã¯ãã³ã³ãããŒã©ã®3ã€ã®ã¿ã€ããŒãã¹ãŠã®æ§é ã¯åãã§ãã åã¿ã€ããŒã«ã¯4ã€ã®ãã£ãã«ãããããããããããã£ããã£ãã¢ãŒããšPWMã§åäœã§ããŸãã åŸè ã«èå³ããããŸãã åãã£ã³ãã«ã«ã¯åºåããããŸãã 2ïŒ2ïŒãçŽæ¥ãããã³å転ã ãçŽæ¥ãã«èå³ããããŸãã PWMä¿¡å·ãçæããããã®åºåãšããŠãæåã®ã¿ã€ããŒã®æåã®ãã£ã³ãã«ã®åºåã䜿çšããŸãã ã¬ãžã¹ã¿ã«ç§»ãåã«ãã¡ã€ã³ã¿ã¹ã¯ã匷調ããŸããç®æšã¯ããã°ããåŸ ã£ãåŸãã¿ã€ããŒèªäœãåºåã®ç¶æ ãåšæçã«å€æŽããããšã§ãã - ã¿ã€ããŒã®æ§æãéå§ããåã«ãI / OããŒãã®åºåãæ§æããŠãã¿ã€ããŒãæäœããå¿
èŠããããŸãã ããã§ãI / OããŒãã®åºåãæ§æããæ¹æ³ã«ã€ããŠè©³ãã説æããŸããã
æåã®ã¿ã€ããŒã®æåã®ãã£ãã«ã®çŽæ¥åºåã䜿çšããããšã«ããŸããã
調æ»çµæã®ååã¯æ¬¡ã®ãšããã§ãã
ãããã£ãŠããã£ãã«TMR1_CH1ãå¿ èŠã§ãã
圌ãèŠã€ããŸãããã芧ã®ããã«ã代æ¿æ©èœã«ãã£ãŠãã£ãã«PA1ã«æ¥ç¶ãããŠããŸãã TMR1_CH1ã«æ¥ç¶ãããŠãããã³ããŸã ãããšããäºå®ã«ãããããããPA1ã䜿çšããŸãã
ãããè¡ãã«ã¯ãããŒãã«ã¯ããã¯ãé©çšãïŒåæã«ã¿ã€ããŒ1ã«ïŒãåºåã代æ¿æ©èœã¢ãŒãã«ããå¿ èŠããããŸããMDR_RST_CLK->PER_CLOCK |= RST_CLK_PCLK_TIMER1|RST_CLK_PCLK_PORTA; // A. MDR_PORTA->OE |= (1<<1); // . MDR_PORTA->FUNC |= (2<<(1*2)); // - . MDR_PORTA->ANALOG |= (1<<1); // . MDR_PORTA->PWR |= (3<<(1*2)); // .
- 次ã«ãã¯ããã¯ä¿¡å·ãã¿ã€ããŒèªäœã«éä¿¡ã§ããããã«ããå¿
èŠããããŸãïŒæ¢ã«ãªã³ã«ããŠããŸãããã«ãŠã³ãããä¿¡å·ã¯æäŸããŠããŸããïŒã ããã«ã¯MDR_RST_CLK-> TIM_CLOCKã¬ãžã¹ã¿ããããŸãã TIM_CLOCKããã§ã¯ãã¿ã€ããŒã«ã¿ã€ãã³ã°ãé©çšããã ãã§ãã
MDR_RST_CLK->TIM_CLOCK |= RST_CLK_TIM_CLOCK_TIM1_CLK_EN; // .
- ãããŠä»-ã¿ã€ããŒèªäœã®ã¬ãžã¹ã¿ã ã¿ã€ããŒã«ã¯å€æ°ã®ã¬ãžã¹ã¿ããããŸãããåãã£ãã«ã®å¶åŸ¡ã¬ãžã¹ã¿ã®æ§é ã¯åãã§ããããããããã®ã»ãšãã©ã¯äºãã«ã³ããŒããŸãã æåã«ãã¿ã€ããŒå
šäœã®ã¬ãžã¹ã¿ãæ€èšãã次ã«ç¹å®ã®ãã£ãã«ã«ã€ããŠæ€èšããŸãã
- CNTã¬ãžã¹ã¿ã¯ãåºç€ãšåŒã°ããŸãã ããããåç
§ããšæ¯èŒãããå€ã§ãããå¶ç¶ã®å Žåãäœããã®ã¢ã¯ã·ã§ã³ãçºçããŸãã ã¿ã€ããŒãã«ãŠã³ããå§ããã®ã¯åœŒãšäžç·ã§ãã
ãã®äŸã§ã¯ããŒãã«çããããšã§ååã§ãã ãªã³ã«ãããšãã¯ãŒãã«ãªã£ãŠããã¯ãã ã£ããšããäºå®ã«ããããããã念ã®ããããªã»ããããæ¹ãè¯ã ãœãããŠã§ã¢ã®åèµ·ååŸããã®å€ããŒãã«ãªããªãå¯èœæ§ããããŸãã
CNT
MDR_TIMER1->CNT = 0; // 0.
- PSG ãã®ã¬ãžã¹ã¿ã¯ãå
¥åä¿¡å·ãåå²ãã圹å²ãæãããŸãã ãã®äŸã§ã¯ã1ç§ããã8000000ãã«ã¹ãã¿ã€ããŒå
¥åã«äŸçµŠããïŒããã©ã«ãã§ã¯ã³ã³ãããŒã©ãŒåšæ³¢æ°ã¯8 MHz = 8000000 Hzã§ããããïŒãã¿ã€ããŒã®åã«é€æ°ã䜿çšããŸããã§ããã 説æãããããããã«ãéžæããé€æ°ããã1ãæžç®ãããã®æ°å€ãã¬ãžã¹ã¿ã«å
¥ããå¿
èŠããããŸãã ãªããªã éè·¯ã®PWMåšæ³¢æ°ã0.5 Hzãã250 Hzã«å€æŽããäºå®ã§ãïŒ2ç§ããšã®ãã£ããããç¹æ»
ãããèæãççŒã«äŒŒãã人éã®ç®ã«ã¯åºå¥ã§ããªãããªãã«ãŒãŸã§ïŒããã®åŸãé©åãªååšåšã¯32000ã«ãªããŸããæ°åã ãããã£ãŠãCNTã®32,000ãã£ãã¯ããšã«ïŒèšå®ã«å¿ããŠïŒãŠããããè¿œå /æžå°ãããŸãã
PSG
MDR_TIMER1->PSG = 32000-1; // TIM_CLK/32000.
- ARR CNTçªå·ãæ¯èŒãããã®ã¯ãã®çªå·ã§ãã 250ãã£ãã¯ããããããããã¯1ç§ãªã®ã§ããã®æéã®ååãéžæããŠãLEDã1ç§éã«2åç¶æ
ãå€æŽã§ããããã«ããŸãã ããã¯ãã¿ã€ããŒåæåé¢æ°ãåŒã³åºããšãã«æå®ããæ°å€ã§ãã ARR
MDR_TIMER1->ARR = PWM_speed; // 1 250 . 2 .
- äžè¬çãªã¿ã€ããŒèšå®ãæŽçãããŠããŸãã åºåçšã®ä¿¡å·ã®èšå®ãšã¿ãªãããšãã§ããŸãã ãã£ãã«ããšã«ãç¬èªã®ä¿¡å·ãèšå®ã§ããŸãã ãã®å ŽåïŒæåã®ãã£ãã«ã®å ŽåïŒãã¬ãžã¹ã¿CH1_CNTRLãæ©èœããŸãã äžèšã§åæããããã«ãåºåã«ã¯åžžã«äœããã®ä¿¡å·ãå¿
èŠã§ãã ã0ããŸãã¯ã1ãã®ããããã ãããããŸãŒã³ãã¯å¿
èŠãããŸããã ãããŠãã0ããšã1ãã®äž¡æ¹ãçããæéééã§ããå¿
èŠããããŸãã ãããã®ç®çã®ããã«ãREFä¿¡å·ããããŸãã ã1ããŸãã¯ã0ãã®ããããã§ãã ãŸããCNT == ARRã®å Žåã¯ãã€ã§ãå€ãå€æŽã§ããŸãã ãããè¡ãã«ã¯ãOCCMã»ã«ã«0x03ïŒ0b011ïŒãæžã蟌ãå¿
èŠããããŸãã ä»ã®ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒã¯ããã©ã«ãã§ç§ãã¡ã«åã£ãŠããŸãã
CH1_CNTRL
MDR_TIMER1->CH1_CNTRL = 3<<TIMER_CH_CNTRL_OCCM_Pos; // REF, CNT = CCR;
- 次ã«ããã£ãã«åºåãæ§æããå¿
èŠããããŸãã æåã®ãã®ã䜿çšããããšã«åæããŸããã ããã§ã¯ãã¬ãžã¹ã¿ãŒCH1_CNTRL1ãå¿
èŠã§ãã æ¢ã«REFä¿¡å·ãçæããŠããŸãã ããã§ããçŽæ¥ãåºååºåãèšå®ããããã«REFãé©çšããã ãã§ãã SELOãšSELOEã®ãããã°ã«ãŒããæ··åããªãããšãéèŠã§ãã SELOã¯åºåããä¿¡å·ãéžæããSELOEã¯åºåãåºåãããã©ãããéžæããŸã ã CH1_CNTRL1
MDR_TIMER1->CH1_CNTRL1 = (2<<TIMER_CH_CNTRL1_SELO_Pos) // c REF. | (1<<TIMER_CH_CNTRL1_SELOE_Pos); // .
- ããã§ãäžå€®ã¬ãžã¹ã¿ã§ã¿ã€ããŒããªã³ã«ããå¿
èŠããããŸãïŒã¿ã€ããŒå
šäœãçµäºããåŸã«ã®ã¿äœ¿çšããå¿
èŠãããããã以åã¯æå³çã«èæ
®ããŸããã§ããïŒã CNTRL
MDR_TIMER1->CNTRL = TIMER_CNTRL_CNT_EN; // .
- ãã®çµæãPWMã¢ãŒãã§ã¿ã€ããŒãåæåããäœæ¥é¢æ°ãšãè«çã¬ãã«ã®çºæ¯ãçºçããåºåãååŸããŸãã æçµåæåé¢æ°TIMER1
// . void initTimerPWMled (uint32_t PWM_speed) { MDR_RST_CLK->PER_CLOCK |= RST_CLK_PCLK_TIMER1|RST_CLK_PCLK_PORTA; // A. MDR_RST_CLK->TIM_CLOCK |= RST_CLK_TIM_CLOCK_TIM1_CLK_EN; // . MDR_PORTA->OE |= (1<<1); // . MDR_PORTA->FUNC |= (2<<(1*2)); // - . MDR_PORTA->ANALOG |= (1<<1); // . MDR_PORTA->PWR |= (3<<(1*2)); // . MDR_TIMER1->CNT = 0; // 0. MDR_TIMER1->PSG = 32000-1; // TIM_CLK/32000. MDR_TIMER1->ARR = PWM_speed; // 1 250 . 2 . MDR_TIMER1->CH1_CNTRL = 3<<TIMER_CH_CNTRL_OCCM_Pos; // REF, CNT = CCR; MDR_TIMER1->CH1_CNTRL1 = (2<<TIMER_CH_CNTRL1_SELO_Pos) // c REF. | (1<<TIMER_CH_CNTRL1_SELOE_Pos); // . MDR_TIMER1->CNTRL = TIMER_CNTRL_CNT_EN; // . }
- CNTã¬ãžã¹ã¿ã¯ãåºç€ãšåŒã°ããŸãã ããããåç
§ããšæ¯èŒãããå€ã§ãããå¶ç¶ã®å Žåãäœããã®ã¢ã¯ã·ã§ã³ãçºçããŸãã ã¿ã€ããŒãã«ãŠã³ããå§ããã®ã¯åœŒãšäžç·ã§ãã
ã¿ã€ããŒ2.ããŒãªã³ã°ããŒã®å²ã蟌ã¿ãåŒã³åºããPWMåšæ³¢æ°ãå€æŽããŸãã
ããã§ãããŒãæŒããããã©ããã確èªããæŒãããããšã«åºã¥ããŠPWMã®åšæ³¢æ°ãå€æŽããã¿ã¹ã¯ã«çŽé¢ããŠããŸãã ãªãªãŒã¹ã確èªããã«ãããŒããŒãã«æ¯ç§25ååãåãããŸãã ããã«ãããæŒããããšãã«PWMãã©ã¡ãŒã¿ãŒããã倧ããå®è¡ããæ©äŒãäžããããŸãã- ã¿ã€ããŒãèšå®ããåã«ããããã°ããŒãã«ãããã¹ãŠã®ããŒã®åºåãæ§æããŸãã ãããã¯æ¬¡ã®ããã«æ¥ç¶ãããŸããã芧ã®ãšãããããŒã¯3ã€ã®ç°ãªãããŒãã«æ¥ç¶ãããŠããŸãã ãããã£ãŠã3ã€ã®ããŒããã¹ãŠãæ§æããå¿ èŠããããŸãã è·³ãè¿ãã«å¯Ÿããç· ãä»ããšã³ã³ãã³ãµä¿è·ãããŒãäžã«ãã§ã«ååšããå éšç· ãä»ãããªã³ã«ããå¿ èŠããªãããšã«æ³šæããŠãã ããã ããŒãèšå®ã§ã¯ãç¹°ãè¿ãééããŸããã
æçµçãªåæåã³ãŒãã¯æ¬¡ã®ããã«ãªããŸããå®çŸ©ããŸãã// . #define DOWN_MSK (1<<1) // PORTE #define SELECT_MSK (1<<2) // PORTC #define LEFT_MSK (1<<3) // PORTE #define UP_MSK (1<<5) // PORTB #define RIGHT_MSK (1<<6) // PORTB #define PWRMAX_UP_MSK (3<<2*5)// PORTB #define PWRMAX_RIGHT_MSK (3<<2*6) #define PWRMAX_SELECT_MSK (3<<2*2)// PORTC. #define PWRMAX_DOWN_MSK (3<<2*1)// PORTE. #define PWRMAX_LEFT_MSK (3<<2*3)
èšå®æ©èœèªäœã
// B, C, E , // . // inc . void initPinForButton (void) { MDR_RST_CLK->PER_CLOCK |= RST_CLK_PCLK_PORTB|RST_CLK_PCLK_PORTC|RST_CLK_PCLK_PORTE; // B, C, E. MDR_PORTB->OE &= ~((uint32_t)(UP_MSK|RIGHT_MSK)); // . MDR_PORTB->FUNC &= ~((uint32_t)(UP_MSK|RIGHT_MSK)); // - . MDR_PORTB->ANALOG |= UP_MSK|RIGHT_MSK; // . MDR_PORTB->PULL &= ~((uint32_t)(UP_MSK|RIGHT_MSK|UP_MSK<<16|RIGHT_MSK<<16)); // . MDR_PORTB->PD &= ~((uint32_t)(UP_MSK|RIGHT_MSK|UP_MSK<<16|RIGHT_MSK<<16)); // 200 // . MDR_PORTB->PWR |= PWRMAX_UP_MSK|PWRMAX_RIGHT_MSK; // . MDR_PORTB->GFEN |= UP_MSK|RIGHT_MSK; // ( 10 ). MDR_PORTC->OE &= ~((uint32_t)(SELECT_MSK)); // . MDR_PORTC->FUNC &= ~((uint32_t)(SELECT_MSK)); // - . MDR_PORTC->ANALOG |= SELECT_MSK; // . MDR_PORTC->PULL &= ~((uint32_t)(SELECT_MSK|SELECT_MSK<<16)); // . MDR_PORTC->PD &= ~((uint32_t)(SELECT_MSK|SELECT_MSK<<16)); // 200 . // . MDR_PORTC->PWR |= PWRMAX_SELECT_MSK; // . MDR_PORTC->GFEN |= SELECT_MSK; // ( 10 ). MDR_PORTE->OE &= ~((uint32_t)(DOWN_MSK|LEFT_MSK)); // . MDR_PORTE->FUNC &= ~((uint32_t)(DOWN_MSK|LEFT_MSK)); // - . MDR_PORTE->ANALOG |= DOWN_MSK|LEFT_MSK; // . MDR_PORTE->PULL &= ~((uint32_t)(DOWN_MSK|LEFT_MSK|DOWN_MSK<<16|LEFT_MSK<<16)); // . MDR_PORTE->PD &= ~((uint32_t)(DOWN_MSK|LEFT_MSK|DOWN_MSK<<16|LEFT_MSK<<16)); // 200 . // . MDR_PORTE->PWR |= PWRMAX_DOWN_MSK|PWRMAX_LEFT_MSK; // . MDR_PORTE->GFEN |= DOWN_MSK|LEFT_MSK; // ( 10 ). }
- ãã¹ãŠã®ã¿ã€ããŒã®æ§é ã¯åãã§ãããããç¹å®ã®ãã€ã³ããŸã§ã®2çªç®ã®ã¿ã€ããŒèšå®ã¯åã®ã¿ã€ããŒãšåãã«ãªããŸãã ãŸããã¿ã€ããŒãåæåããé¢æ°ãäœæããŸãã 圌女ã¯ç§ã«ãšã£ãŠãã®ããã«èŠããŸãã
// 25 . void initTimerButtonCheck (void) { }
- ããã«ããã¹ãŠãæåã®ã¿ã€ããŒã®å Žåãšåãã§ãARRã®ã¿ã125ïŒ0.5ç§ïŒã§ã¯ãªãã10ïŒ1/25ïŒã§ãã ã¬ãžã¹ã¿ãŒå å¡«
MDR_RST_CLK->PER_CLOCK |= RST_CLK_PCLK_TIMER2; // 2. MDR_RST_CLK->TIM_CLOCK |= RST_CLK_TIM_CLOCK_TIM2_CLK_EN; // . MDR_TIMER2->CNT = 0;// 0. MDR_TIMER2->PSG = 32000-1; // TIM_CLK/32000. MDR_TIMER2->ARR = 10; // 1 250 . 25 => 250/25=10.
- 次ã«ãCNTãšARRãäžèŽãããšãã«äžæããå¿
èŠããããŸãã ããã«ã¯ãIEã¬ãžã¹ã¿ãå¿
èŠã§ãã äžæãåŒãèµ·ããããŸããŸãªã±ãŒã¹ã®äžã§ãæãåçŽãªãã®ãå¿
èŠã§ãïŒCNT_ARR_EVENT_IEã IE
MDR_TIMER2->IE = TIMER_IE_CNT_ARR_EVENT_IE; // CNT ARR.
- ããã§ãCNT == ARRã§å²ã蟌ã¿ãçºçããŸããã ãã ããããã©ã«ãã§ã¯ã¿ã€ããŒå
šäœããã®å²ã蟌ã¿ã¯çŠæ¢ãããŠãããããäœãæäŸãããŸããã ããã¯ãNVICã³ã³ãããŒã©ãŒã®ã¿ã€ããŒå
šäœããã®å²ã蟌ã¿ãèš±å¯ããããšã§ä¿®æ£ã§ããŸãã åã®èšäºã§ããã§ã«åœŒã«å¯ŸåŠããŸããã ãããããã®åŸãããããã©ãã·ã¥ããŸããã å²ã蟌ã¿ãæå¹ãŸãã¯ç¡å¹ã«ããããã«ãCMSISã«ã¯ç¬èªã®æ©èœããããŸãã ãããã¯1ã€ã®SIã³ãã³ãã®åçŽãªãã¯ãã§ãããããæããããšã¯ãããŸããã ãã ããã³ãŒãã®å¯èªæ§ã¯å€§å¹
ã«åäžããŸãã 䜿çšã§ããCMSISã³ãã³ãã¯æ¬¡ã®ãšããã§ãããããããé¢æ°NVIC_EnableIRQãå¿ èŠã§ãã
ãã®ãã©ã¡ãŒã¿ãŒã¯ãMDR32Fx.hãã¡ã€ã«ã®è¡šã«ãããŸãã/* MDR32Fx Interrupt Number Definition */ typedef enum IRQn { /*---- Cortex-M3 Processor Exceptions Numbers --------------------------------*/ NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt *///!< NonMaskableInt_IRQn HardFault_IRQn = -13, /*!< 3 Hard Fault Interrupt *///!< HardFault_IRQn MemoryManagement_IRQn = -12, /*!< 4 Memory Management Interrupt *///!< MemoryManagement_IRQn BusFault_IRQn = -11, /*!< 5 Bus Fault Interrupt *///!< BusFault_IRQn UsageFault_IRQn = -10, /*!< 6 Usage Fault Interrupt *///!< UsageFault_IRQn SVCall_IRQn = -5, /*!< 11 SV Call Interrupt *///!< SVCall_IRQn PendSV_IRQn = -2, /*!< 14 Pend SV Interrupt *///!< PendSV_IRQn SysTick_IRQn = -1, /*!< 15 System Tick Timer Interrupt *///!< SysTick_IRQn /*---- MDR32Fx specific Interrupt Numbers ------------------------------------*/ CAN1_IRQn = 0, /*!< CAN1 Interrupt *///!< CAN1_IRQn CAN2_IRQn = 1, /*!< CAN1 Interrupt *///!< CAN2_IRQn USB_IRQn = 2, /*!< USB Host Interrupt *///!< USB_IRQn DMA_IRQn = 5, /*!< DMA Interrupt *///!< DMA_IRQn UART1_IRQn = 6, /*!< UART1 Interrupt *///!< UART1_IRQn UART2_IRQn = 7, /*!< UART2 Interrupt *///!< UART2_IRQn SSP1_IRQn = 8, /*!< SSP1 Interrupt *///!< SSP1_IRQn I2C_IRQn = 10, /*!< I2C Interrupt *///!< I2C_IRQn POWER_IRQn = 11, /*!< POWER Detecor Interrupt *///!< POWER_IRQn WWDG_IRQn = 12, /*!< Window Watchdog Interrupt *///!< WWDG_IRQn Timer1_IRQn = 14, /*!< Timer1 Interrupt *///!< Timer1_IRQn Timer2_IRQn = 15, /*!< Timer2 Interrupt *///!< Timer2_IRQn Timer3_IRQn = 16, /*!< Timer3 Interrupt *///!< Timer3_IRQn ADC_IRQn = 17, /*!< ADC Interrupt *///!< ADC_IRQn COMPARATOR_IRQn = 19, /*!< COMPARATOR Interrupt *///!< COMPARATOR_IRQn SSP2_IRQn = 20, /*!< SSP2 Interrupt *///!< SSP2_IRQn BACKUP_IRQn = 27, /*!< BACKUP Interrupt *///!< BACKUP_IRQn EXT_INT1_IRQn = 28, /*!< EXT_INT1 Interrupt *///!< EXT_INT1_IRQn EXT_INT2_IRQn = 29, /*!< EXT_INT2 Interrupt *///!< EXT_INT2_IRQn EXT_INT3_IRQn = 30, /*!< EXT_INT3 Interrupt *///!< EXT_INT3_IRQn EXT_INT4_IRQn = 31 /*!< EXT_INT4 Interrupt *///!< EXT_INT4_IRQn }IRQn_Type;
2çªç®ã®ã¿ã€ããŒãå¿ èŠã§ãã ãããã£ãŠãé¢æ°ã¯æ¬¡ã®ããã«ãªããŸããNVIC_EnableIRQ(Timer2_IRQn); // .
- ã¿ã€ããŒããªã³ã«ããã ãã§ãæçµæ©èœã¯æ¬¡ã®åœ¢åŒã«ãªããŸãã ããŒãªã³ã°ãã¿ã³ã®ã¿ã€ããŒ2ã®åæåã// 1ç§ããã25åå²ã蟌ã¿ãçæããã¿ã€ããŒãèšå®ããŸãã
void initTimerButtonCheckïŒvoidïŒ
{
MDR_RST_CLK-> PER_CLOCK | = RST_CLK_PCLK_TIMER2; //ã¿ã€ããŒ2ã®ã¯ãããã³ã°ããªã³ã«ããŸãã
MDR_RST_CLK-> TIM_CLOCK | = RST_CLK_TIM_CLOCK_TIM2_CLK_EN; //åºåãæåãªãã§ã¯ããã¯ãæäŸããŸãã
MDR_TIMER2-> CNT = 0; // 0ããã«ãŠã³ãããŸãã
MDR_TIMER2-> PSG = 32000-1; //ã¿ã€ããŒã¯TIM_CLK / 32000ã«ãªããŸãã
MDR_TIMER2-> ARR = 10; // 1ç§250ãã£ãã¯ã æ¯ç§25ã®ããŒãªã³ã°=> 250/25 = 10ã§ãã
MDR_TIMER2-> IE = TIMER_IE_CNT_ARR_EVENT_IE; // CNTãšARRã®äžèŽã«ããå²ã蟌ã¿ãæå¹ã«ããŸãã
NVIC_EnableIRQïŒTimer2_IRQnïŒ; //ã¿ã€ããŒå šäœããã®å²ã蟌ã¿ãæå¹ã«ããŸãã
MDR_TIMER2-> CNTRL = TIMER_CNTRL_CNT_EN; //ã¿ã€ããŒããªã³ã«ããŸãã
} - 次ã«ãå²ã蟌ã¿ãã³ãã©ãŒãäœæããå¿
èŠããããŸãã ãã®ååã¯ãstartup_MDR32F9Qx.sãã¡ã€ã«ã§å³å¯ã«ä¿®æ£ãããŠããŸãã ã¿ã€ããŒå
šäœã«å¯ŸããŠ1ã€ã®å²ã蟌ã¿ãã¯ã¿ãŒã®ã¿ããããŸãã ããã«ãããã¹ãŠã®ååã¯çŽæçã§ãã ããã¯Timer2_IRQHandlerãšåŒã°ããŸãã å
¥åãã©ã¡ãŒã¿ãŒã空ã®é¢æ°ãäœæããŸãã ãããŠãæåã®ã³ãã³ãã§å²ã蟌ã¿ãã©ã°ãã¯ãªã¢ããå¿
èŠããããŸãããã®ãããããã«ããŸããã ãã以å€ã®å Žåãå²ã蟌ã¿ãçµäºããåŸãæåã«æ»ããŸãã ãŸããæåŸã«ãã©ã°ããªã»ããããããšãäžå¯èœã§ããããã¯ããå®å
šã«ãªã»ãããããã®ã«ååãªæéããªãããã®çµæãæªä¿åã®ãã©ã°ã§å²ã蟌ã¿ãçºçããããã§ãã å²ã蟌ã¿ãçµäºããåã«ããã©ã°ã®ãªã»ãããšå²ã蟌ã¿ã®çµäºãåé¢ããã³ãã³ããå°ãªããšã1ã€å¿
èŠã§ãã STATUSã¬ãžã¹ã¿ã®ãã©ã°ãã¯ãªã¢ã§ããŸãã ã¹ããŒã¿ã¹ã¿ã€ããŒããã®ã€ãã³ãã¯1ã€ãã䜿çšããªããããã¬ãžã¹ã¿å šäœã«ã0ããå®å šã«æžã蟌ãããšãã§ããŸãã è€æ°ã®ã€ãã³ããããå ŽåããŸãã©ã®ã€ãã³ããçºçãããã確èªããå¿ èŠããããŸãã ãã®å Žåãé¢æ°ã¯æ¬¡ã®åœ¢åŒã«ãªããŸãã
void Timer2_IRQHandler (void) { MDR_TIMER2->STATUS = 0; // . . // . }
- èšäºã®åé ã§ãå²ã蟌ã¿ã«å
¥ããšãLEDã®ç¶æ
ãå€æŽããŠãå²ã蟌ã¿ãåŠçãããããšã瀺ãããšã«ããŸããã ãããè¡ãã«ã¯ãPC0ããã³PC1ãã³ã«æ¥ç¶ããã2ã€ã®ã«ã¹ã¿ã LEDã®ããããã䜿çšããå¿
èŠããããŸãã LEDãæ¥ç¶ããŸãããã®ç®çã§PC0ã䜿çšããããšããå§ãããŸãïŒããŒãäžã§ã¯å·ŠåŽã«ãããŸãïŒã ãŸããPC1ã«æ¥ç¶ãããŠããLEDã¯ããã€ã¯ãã³ã³ãããŒã©ãŒã®åºåããåæããã¯ã€ã€ãŒã§PA1ïŒPWMåºåïŒã«æ¥ç¶ããå¿ èŠããããŸãã
LEDã®åæåã¯æ¬¡ã®ããã«ãªããŸãããã®é¢æ°ã¯äž¡æ¹ã®LEDãèšå®ããŸããã 2çªç®ã®ãã®ã¯åæããïŒãžã£ã³ããŒïŒãéãã¯ãããŸããã// . #define LED0 (1<<0) // PORTC. #define LED1 (1<<1) // PORTC. #define PWRMAX_LED0 (3<<2*0) // . #define PWRMAX_LED1 (3<<2*1) // C . void initPinPortCForLed (void) { MDR_RST_CLK->PER_CLOCK |= RST_CLK_PCLK_PORTC; // C. MDR_PORTC->OE |= LED0|LED1; // . MDR_PORTC->FUNC &= ~((uint32_t)(LED0|LED1)); // - . MDR_PORTC->ANALOG |= LED0|LED1; // . MDR_PORTC->PULL &= ~((uint32_t)(LED0|LED1|LED0<<16|LED1<<16)); // . MDR_PORTC->PD &= ~((uint32_t)(LED0|LED1|LED0<<16|LED1<<16)); // 200 . // . MDR_PORTC->PWR |= PWRMAX_LED0|PWRMAX_LED1; // . MDR_PORTC->GFEN &= ~((uint32_t)(LED0|LED1)); // . }
- ããŒã«åãåãããŠãPWMã¿ã€ããŒã®ARRã®å€ãå€æŽããã ãã§ãã ãããããã¿ã³ã¯3ã€ã®ç°ãªãããŒãã«æ¥ç¶ãããŠããŸãã ãã¡ãããæãªããã®æ¹æ³ã§ãããŸããŸããã ããŒãå
šäœããå€ãååŸãããã¹ã¯ã䜿çšããŠç¹å®ã®çµè«ã確èªããã«ã¯ããã®å ŽåãBitBandingã䜿çšããæ¹ãã¯ããã«äŸ¿å©ã§ãã 詳现ã«è§Šããªãå Žåã¯ãåšèŸºé åã®åãããïŒå
¥åºåããŒããå«ãïŒã«ç¬èªã®32ãããã»ã«ããããŸãã ã1ããŸãã¯ã0ãã®ãããããæžã蟌ãŸããŸãã ãããã®ç¶æ
ã«å¿ããŠã éåžžã®ã¬ãžã¹ã¿ãšåæ§ã«ãããã䜿çšã§ããŸãã ãšã³ããªã1ãã¯ãå®ã¬ãžã¹ã¿ã®ç®çã®ãããã«1ãäžããŸãã ã0ã-ããããã0ããããã®ã»ã«ã®ã¢ãã¬ã¹ãååŸããããã«ãéåžžã«äŸ¿å©ãªã«ããã·ã¹èšç®æ©ã䜿çšã§ããŸãã äŸãèŠãŠã¿ãŸãããã ããŒãBã®ãã³5ã«æ¥ç¶ãããUPããŒããããŸããããã¥ã¡ã³ãã«ç§»åããŠãããŒãBã®ã¬ãžã¹ã¿ã®ã¢ãã¬ã¹ã確èªããŸã ããã«ãããã®ã¢ãã¬ã¹ããã¬ãžã¹ã¿ããã£ãŒã«ãã«å ¥åããããããããã£ãŒã«ãã«5.ãæžã蟌ããšãåºåã§0x43600014ãåŸãããŸãã ããŒãBã®ããã5ã§äœæ¥ããã®ã¯ããã®ã¢ãã¬ã¹ã®ã»ã«ã§äœæ¥ããŠããŸãããããã0x43600014 = 1ãæžã蟌ãã ãã§ã¯äžå¯èœã§ãã ãã ãã*ïŒuint32_t *ïŒ0x43600014 = 1-å¯èœã§ãã
ããã§ãåæ§ã®æ¹æ³ã§ããã¿ã³ã«æ¥ç¶ããããã¹ãŠã®åºåãæžãæããããšãã§ããŸããåãããšãLEDã«ã€ããŠãå®è¡ã§ããŸãã// . #define DOWN_FLAG *(uint32_t*)0x43900004 #define SELECT_FLAG *(uint32_t*)0x43700008 #define LEFT_FLAG *(uint32_t*)0x4390000c #define UP_FLAG *(uint32_t*)0x43600014 #define RIGHT_FLAG *(uint32_t*)0x43600018
#define LED0_FLAG *(uint32_t*)0x43700000
- çŸåšã¯ããã¿ã³ã®ããŒãªã³ã°ãšã¿ã€ããŒ1ã®ã¬ãžã¹ã¿ARRã®å€æŽãèšé²ããã ãã§ãã çµæã®é¢æ°ã¯æ¬¡ã®ããã«ãªããŸããint PWM_speed = 125;
void Timer2_IRQHandlerïŒvoidïŒ
{
MDR_TIMER2-> STATUS = 0; //ãã©ã°ãã¯ãªã¢ããŸãã å¿ ç¶çã«æåã®ããŒã ã
LED1_FLAG =ïŒLED1_FLAG; //å²ã蟌ã¿ãåŠçãããããšã瀺ããŸãã
ifïŒUP_FLAG == 0ïŒPWM_speed--; //ããããã®ããŒãæŒãããŠãããã©ããã確èªããŸãã æŒãããå Žåã¯ãé »ç¹ã«äœããããŠãã ããã
else ifïŒDOWN_FLAG == 0ïŒPWM_speed ++;
else ifïŒLEFT_FLAG == 0ïŒPWM_speed--;
else ifïŒRIGHT_FLAG == 0ïŒPWM_speed ++;
ifïŒPWM_speed <1ïŒPWM_speed = 1; //åšæ³¢æ°ã250 Hzã0.5 Hzã®ç¯å²ãè¶ ããªãããšã確èªããŸãã
ãã以å€ã®å ŽåïŒPWM_speed> 500ïŒPWM_speed = 500;
MDR_TIMER1-> ARR = PWM_speed; //é »åºŠãå€æŽããŸãã
} - ã¡ã€ã³é¢æ°mainã«ã¯ãäžèšã®ãã¹ãŠã®é¢æ°ã®åæã®ã¿ãå«ãŸããŸãã ãããªæãã§ããint mainïŒvoidïŒ
{
initTimerPWMledïŒPWM_speedïŒ; // PWMãå®è¡ããŸãã ãã©ã¡ãŒã¿ãŒã¯PWMé床ã§ãã
initPinForButtonïŒïŒ; //ãã¿ã³ãã«ã¹ã¿ãã€ãºããŸãã
initPinPortCForLedïŒïŒ; // LEDæäœïŒããŒãèªã¿åãããŸãïŒã
initTimerButtonCheckïŒïŒ; //ã¿ã€ããŒãåæåããŸãã
ïŒ1ïŒ
{
}
}
çµè«ã®ä»£ããã«
ãã®èšäºã§ã¯ãSPLã©ã€ãã©ãªãŒã䜿çšããã«ã¿ã¹ã¯ã®å®è£ ã調ã¹ãŸããã 次ã®èšäºã§ã¯ãåãã¿ã¹ã¯ãå®è£ ããŸãããSPLã®ã¿ã䜿çšããŠçµæãæ¯èŒããŸãã
githubã®æçµãããžã§ã¯ã
å°ããªè¿œå
çŸæç¹ã§ã¯ãMilanderã¯SPLã®æ°ããæ¹èšçããªãªãŒã¹ããŠããŸãã æ®å¿µãªããããŸã å®å šãªããŒãžã§ã³ã§ã¯ãããŸããã çŸåšã®ããŒãžã§ã³ã§ã¯ãkeilãŠã£ã³ããŠã§ã¬ãžã¹ã¿ã®ç¶æ ãèŠãããšãã§ããŸããã ããããããã«ãã«ããŒãžã§ã³ããªãªãŒã¹ããããã®æ¬ ç¹ãä¿®æ£ãããŸãã æ°ããããŒãžã§ã³ãè©ŠããŠã¿ãã人ã®ããã«-ããã«ããããªãããžã§ã¯ããžã®ãªã³ã¯ããããŸã ã
以åã®èšäºã®ãªã¹ãã
- 1. STM32F103ããK1986BE92QIã«æž¡ããŸãã ãŸãã¯ããã·ã¢ã®ãã€ã¯ãã³ã³ãããŒã©ã®æåã®ç¥ãåãã
- 2. STM32ãããã·ã¢ã®ãã€ã¯ãã³ã³ãããŒã©ãŒK1986BE92QIã«æž¡ããŸãã keilã§ãããžã§ã¯ããèšå®ããLEDãç¹æ» ãããŸãã
- 3. STM32ãããã·ã¢ã®ãã€ã¯ãã³ã³ãããŒã©ãŒK1986BE92QIã«æž¡ããŸãã ã·ã¹ãã ã¿ã€ããŒïŒSysTickïŒã
- 4. STM32ãããã·ã¢ã®ãã€ã¯ãã³ã³ãããŒã©ãŒK1986BE92QIã«æž¡ããŸãã ã¯ããã¯èšå®
- 5. STM32ãããã·ã¢ã®ãã€ã¯ãã³ã³ãããŒã©ãŒK1986BE92QIã«æž¡ããŸãã å®çšåïŒé³å£°ãçæããã³åçããŸãã ããŒã1ïŒç©åœ¢ããã³æ£åŒŠæ³¢ä¿¡å·ãçæããŸãã DACã®ãã¹ã¿ãªã³ã°ïŒDACïŒã
- 6. STM32ãããã·ã¢ã®ãã€ã¯ãã³ã³ãããŒã©ãŒK1986BE92QIã«æž¡ããŸããå®çšåïŒé³å£°ãçæããã³åçããŸããããŒã2ïŒæ£åŒŠæ³¢ä¿¡å·ãçæããŸããDMAããã¹ã¿ãŒããŸãã
- 7. STM32 198692QI. : . : . DMA + .
- 8. STM32 198692QI. : . : .