forkd

Dependencies:   mbed

Fork of LG2 by Dmitry Kovalev

Committer:
Kovalev_D
Date:
Wed Feb 03 10:44:42 2016 +0300
Revision:
23:12e6183f04d4
[thyz

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kovalev_D 23:12e6183f04d4 1
Kovalev_D 23:12e6183f04d4 2 /**--------------File Info---------------------------------------------------------------------------------
Kovalev_D 23:12e6183f04d4 3 ** File name: CycleSync.c
Kovalev_D 23:12e6183f04d4 4 ** Last modified Date: 2011-09-06
Kovalev_D 23:12e6183f04d4 5 ** Last Version: V1.00
Kovalev_D 23:12e6183f04d4 6 ** Descriptions:
Kovalev_D 23:12e6183f04d4 7 **
Kovalev_D 23:12e6183f04d4 8 **--------------------------------------------------------------------------------------------------------
Kovalev_D 23:12e6183f04d4 9 ** Created by: Electrooptica Inc.
Kovalev_D 23:12e6183f04d4 10 ** Created date: 2011-09-06
Kovalev_D 23:12e6183f04d4 11 ** Version: V1.00
Kovalev_D 23:12e6183f04d4 12 ** Descriptions: There is the routines for device synchronization
Kovalev_D 23:12e6183f04d4 13 **
Kovalev_D 23:12e6183f04d4 14 **--------------------------------------------------------------------------------------------------------
Kovalev_D 23:12e6183f04d4 15 *********************************************************************************************************/
Kovalev_D 23:12e6183f04d4 16 #include "CyclesSync.h"
Kovalev_D 23:12e6183f04d4 17 #include "CntrlGLD.h"
Kovalev_D 23:12e6183f04d4 18 #include "SIP.h"
Kovalev_D 23:12e6183f04d4 19 #include "el_lin.h"
Kovalev_D 23:12e6183f04d4 20 #include "inputOutput.h"
Kovalev_D 23:12e6183f04d4 21
Kovalev_D 23:12e6183f04d4 22 uint32_t Sys_Clock; //e. counter of system ticks //r. ñ÷åò÷èê âðåìåííîé ñåòêè ñèñòåìû
Kovalev_D 23:12e6183f04d4 23 uint32_t Seconds = 0; //e. seconds from power on //r. ÷èñëî ñåêóíä îò ìîìåíòà âêëþ÷åíèÿ ïèòàíèÿ
Kovalev_D 23:12e6183f04d4 24 int32_t time_1_Sec = DEVICE_SAMPLE_RATE_uks; //e. pseudosecond timer //r. ïñåâäîñåêóíäíûé òàéìåð
Kovalev_D 23:12e6183f04d4 25 uint32_t trm_cycl;
Kovalev_D 23:12e6183f04d4 26 uint32_t count;
Kovalev_D 23:12e6183f04d4 27 int32_t PrevPeriod = 0;
Kovalev_D 23:12e6183f04d4 28 uint32_t num;
Kovalev_D 23:12e6183f04d4 29 volatile uint32_t Latch_Rdy = 0;
Kovalev_D 23:12e6183f04d4 30
Kovalev_D 23:12e6183f04d4 31 int32_t LatchPhase = INT32_MAX;
Kovalev_D 23:12e6183f04d4 32 uint32_t Ext_Latch_ResetEnable = 1;
Kovalev_D 23:12e6183f04d4 33 volatile uint32_t data_Rdy = 0;
Kovalev_D 23:12e6183f04d4 34
Kovalev_D 23:12e6183f04d4 35 uint32_t Delay_UART_Enbl = DELAY_UART_ENBL;
Kovalev_D 23:12e6183f04d4 36 //uint32_t Delay_UART_Disbl = DELAY_UART_ENBL;
Kovalev_D 23:12e6183f04d4 37
Kovalev_D 23:12e6183f04d4 38 uint32_t main_cycle_latch = 0;
Kovalev_D 23:12e6183f04d4 39 uint32_t Out_main_cycle_latch; //e. counter of main cycles between external latch pulse appearence
Kovalev_D 23:12e6183f04d4 40 uint32_t T_latch, Out_T_latch, temp_T_latch;
Kovalev_D 23:12e6183f04d4 41
Kovalev_D 23:12e6183f04d4 42 /******************************************************************************
Kovalev_D 23:12e6183f04d4 43 ** Function name: Latch_Event
Kovalev_D 23:12e6183f04d4 44 **
Kovalev_D 23:12e6183f04d4 45 ** Descriptions: Routine for latch appearing
Kovalev_D 23:12e6183f04d4 46 **
Kovalev_D 23:12e6183f04d4 47 ** parameters: None
Kovalev_D 23:12e6183f04d4 48 ** Returned value: None
Kovalev_D 23:12e6183f04d4 49 **
Kovalev_D 23:12e6183f04d4 50 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 51 void Latch_Event()
Kovalev_D 23:12e6183f04d4 52 {
Kovalev_D 23:12e6183f04d4 53 static unsigned PreLatch = 0;
Kovalev_D 23:12e6183f04d4 54 // static int cc = 0;
Kovalev_D 23:12e6183f04d4 55 if (LatchPhase < INT32_MAX) //Åñëè LatchPhase(ôëàã çàùåëêè) < ìåíüøå ìàêñèìàëüíîãî 32-õ áèòíîãî èíòà (ïðè èíèöèàëèçàöèè int32_t LatchPhase = INT32_MAX;) òî:
Kovalev_D 23:12e6183f04d4 56 {
Kovalev_D 23:12e6183f04d4 57 Latch_Rdy = 1; //e. óñòàíîâèòü ôëàã äëÿ îáðàáîòêè íèæå
Kovalev_D 23:12e6183f04d4 58 if (RgConB) //Åñëè RgConB (äîïîëíèòåëüíûé ðåãèñòð óïðàâëåíèÿ, óñòàíîâëåí â åäåíèöó ïðè èíèöèàëèçàöèè â ìýéíå) óòàíîâëåí â åäåíèöó òî:
Kovalev_D 23:12e6183f04d4 59 {
Kovalev_D 23:12e6183f04d4 60 if (PreLatch) //e. åñëè ìû îòêëàäûâàåì çàùåëêó
Kovalev_D 23:12e6183f04d4 61 PreLatch = 0;
Kovalev_D 23:12e6183f04d4 62
Kovalev_D 23:12e6183f04d4 63 else if ((LatchPhase < LPC_PWM1->TC) && (num == Sys_Clock)) //e. latch have appeared in current cycle
Kovalev_D 23:12e6183f04d4 64 {
Kovalev_D 23:12e6183f04d4 65 Latch_Rdy = 0; //e. bring it to the next cycle
Kovalev_D 23:12e6183f04d4 66 PreLatch = 1;
Kovalev_D 23:12e6183f04d4 67 }
Kovalev_D 23:12e6183f04d4 68 }
Kovalev_D 23:12e6183f04d4 69 }
Kovalev_D 23:12e6183f04d4 70 else
Kovalev_D 23:12e6183f04d4 71 Latch_Rdy = 0; //e. latch is absent
Kovalev_D 23:12e6183f04d4 72 //---------------------------temp-------------------------------
Kovalev_D 23:12e6183f04d4 73 /* Latch_Rdy = 0; //e. latch is absent
Kovalev_D 23:12e6183f04d4 74 if (cc++ == 19)
Kovalev_D 23:12e6183f04d4 75 {
Kovalev_D 23:12e6183f04d4 76 cc = 0;
Kovalev_D 23:12e6183f04d4 77 Latch_Rdy = 1;
Kovalev_D 23:12e6183f04d4 78 LatchPhase = 2500;
Kovalev_D 23:12e6183f04d4 79 } */
Kovalev_D 23:12e6183f04d4 80 //----------------------temp--------------------------------
Kovalev_D 23:12e6183f04d4 81 }
Kovalev_D 23:12e6183f04d4 82
Kovalev_D 23:12e6183f04d4 83 /******************************************************************************
Kovalev_D 23:12e6183f04d4 84 ** Function name: QEI_IRQHandler
Kovalev_D 23:12e6183f04d4 85 **
Kovalev_D 23:12e6183f04d4 86 ** Descriptions: Latch counters by reference meander
Kovalev_D 23:12e6183f04d4 87 **
Kovalev_D 23:12e6183f04d4 88 ** parameters: None
Kovalev_D 23:12e6183f04d4 89 ** Returned value: None
Kovalev_D 23:12e6183f04d4 90 **
Kovalev_D 23:12e6183f04d4 91 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 92 __irq void QEI_IRQHandler (void)
Kovalev_D 23:12e6183f04d4 93 {
Kovalev_D 23:12e6183f04d4 94 static uint32_t halfQEIPeriod = 0;
Kovalev_D 23:12e6183f04d4 95
Kovalev_D 23:12e6183f04d4 96 Cnt_curr = LPC_QEI->POS; //e. read accumulated value of counter
Kovalev_D 23:12e6183f04d4 97 if (LPC_QEI->INTSTAT & 0x0008)
Kovalev_D 23:12e6183f04d4 98 {
Kovalev_D 23:12e6183f04d4 99 data_Rdy = 0x0004; //e. data for Cnt_Pls or Cnt_Mns calculation are ready
Kovalev_D 23:12e6183f04d4 100
Kovalev_D 23:12e6183f04d4 101 if (++halfQEIPeriod & 0x0001) //e. period elapsed, we can calculate Cnt_Dif
Kovalev_D 23:12e6183f04d4 102 {
Kovalev_D 23:12e6183f04d4 103 data_Rdy = 0x000C;
Kovalev_D 23:12e6183f04d4 104 }
Kovalev_D 23:12e6183f04d4 105 }
Kovalev_D 23:12e6183f04d4 106 LPC_QEI->CLR = 0x1fff; //e. reset interrupt request //r. ñáðîñèòü çàïðîñ ïðåðûâàíèÿ
Kovalev_D 23:12e6183f04d4 107 }
Kovalev_D 23:12e6183f04d4 108 /******************************************************************************
Kovalev_D 23:12e6183f04d4 109 ** Function name: SetIntLatch
Kovalev_D 23:12e6183f04d4 110 **
Kovalev_D 23:12e6183f04d4 111 ** Descriptions: Set timer for accumulation period
Kovalev_D 23:12e6183f04d4 112 **
Kovalev_D 23:12e6183f04d4 113 ** parameters: Period of accumulation
Kovalev_D 23:12e6183f04d4 114 ** Returned value: None
Kovalev_D 23:12e6183f04d4 115 **
Kovalev_D 23:12e6183f04d4 116 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 117 void SetIntLatch(uint32_t cycle)
Kovalev_D 23:12e6183f04d4 118 {
Kovalev_D 23:12e6183f04d4 119 LPC_TIM3->TCR = 0x2; //switch off and reset timer3
Kovalev_D 23:12e6183f04d4 120 if (cycle != 0)
Kovalev_D 23:12e6183f04d4 121 {
Kovalev_D 23:12e6183f04d4 122 LPC_TIM3->MR0 = (cycle<<2); //load new value
Kovalev_D 23:12e6183f04d4 123 LPC_TIM3->TCR = 1; //switch on timer3
Kovalev_D 23:12e6183f04d4 124 }
Kovalev_D 23:12e6183f04d4 125 }
Kovalev_D 23:12e6183f04d4 126 /******************************************************************************
Kovalev_D 23:12e6183f04d4 127 ** Function name: SwitchRefMeandInt
Kovalev_D 23:12e6183f04d4 128 **
Kovalev_D 23:12e6183f04d4 129 ** Descriptions: Enable/disable interrupt from reference meander
Kovalev_D 23:12e6183f04d4 130 **
Kovalev_D 23:12e6183f04d4 131 ** parameters: switcher
Kovalev_D 23:12e6183f04d4 132 ** Returned value: None
Kovalev_D 23:12e6183f04d4 133 **
Kovalev_D 23:12e6183f04d4 134 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 135 void SwitchRefMeandInt(uint32_t s)
Kovalev_D 23:12e6183f04d4 136 {
Kovalev_D 23:12e6183f04d4 137 LPC_QEI->CLR = 0x1fff; //e. reset all interrupts //r. ñáðîñèòü âñå ïðåðûâàíèÿ
Kovalev_D 23:12e6183f04d4 138 if (s)
Kovalev_D 23:12e6183f04d4 139 LPC_QEI->IEC = 0x1fff; //e. disable direction changing interrupt //r. çàïðåòèòü ïðåðûâàíèå ïðè èçìåíåíèè íàïðàâëåíèÿ
Kovalev_D 23:12e6183f04d4 140 else
Kovalev_D 23:12e6183f04d4 141 LPC_QEI->IES = 0x0008; //e. enable direction changing interrupt //r. ðàçðåøèòü ïðåðûâàíèå ïðè èçìåíåíèè íàïðàâëåíèÿ
Kovalev_D 23:12e6183f04d4 142 }
Kovalev_D 23:12e6183f04d4 143 /******************************************************************************
Kovalev_D 23:12e6183f04d4 144 ** Function name: ExtLatch_IRQHandler
Kovalev_D 23:12e6183f04d4 145 **
Kovalev_D 23:12e6183f04d4 146 ** Descriptions: Routine for external latch appearence processing
Kovalev_D 23:12e6183f04d4 147 **
Kovalev_D 23:12e6183f04d4 148 ** parameters: None
Kovalev_D 23:12e6183f04d4 149 ** Returned value: None
Kovalev_D 23:12e6183f04d4 150 **
Kovalev_D 23:12e6183f04d4 151 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 152 __irq void EINT3_IRQHandler (void)
Kovalev_D 23:12e6183f04d4 153 {
Kovalev_D 23:12e6183f04d4 154 //LPC_GPIO2->FIOSET = 0x00000020; //e. turn on the LED
Kovalev_D 23:12e6183f04d4 155 LatchPhase = LPC_PWM1->TC; //e. read moment of latch
Kovalev_D 23:12e6183f04d4 156 LPC_TIM0->TCR = 1; //e. start Mltdrop delay timer
Kovalev_D 23:12e6183f04d4 157 LPC_GPIOINT->IO0IntClr |= 0x0000800;//e. clean interrupt request
Kovalev_D 23:12e6183f04d4 158 //LPC_GPIO2->FIOCLR = 0x00000020; //e. turn off the LED
Kovalev_D 23:12e6183f04d4 159 }
Kovalev_D 23:12e6183f04d4 160 /******************************************************************************
Kovalev_D 23:12e6183f04d4 161 ** Function name: IntLatch_IRQHandler
Kovalev_D 23:12e6183f04d4 162 **
Kovalev_D 23:12e6183f04d4 163 ** Descriptions: Routine for Internal latch appearence processing
Kovalev_D 23:12e6183f04d4 164 **
Kovalev_D 23:12e6183f04d4 165 ** parameters: None
Kovalev_D 23:12e6183f04d4 166 ** Returned value: None
Kovalev_D 23:12e6183f04d4 167 **
Kovalev_D 23:12e6183f04d4 168 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 169 __irq void IntLatch_IRQHandler (void)
Kovalev_D 23:12e6183f04d4 170 {
Kovalev_D 23:12e6183f04d4 171 //LPC_GPIO2->FIOSET |= 0x00000080; // turn on the LED
Kovalev_D 23:12e6183f04d4 172 LatchPhase =(int)LPC_PWM1->TC; //e. read moment of latch
Kovalev_D 23:12e6183f04d4 173 LPC_TIM3->IR = 0x0001; //e. clear interrupt flag
Kovalev_D 23:12e6183f04d4 174 num = Sys_Clock;
Kovalev_D 23:12e6183f04d4 175 // count++;
Kovalev_D 23:12e6183f04d4 176 //LPC_GPIO2->FIOCLR |= 0x00000080; // turn off the LED
Kovalev_D 23:12e6183f04d4 177 }
Kovalev_D 23:12e6183f04d4 178
Kovalev_D 23:12e6183f04d4 179 /******************************************************************************
Kovalev_D 23:12e6183f04d4 180 ** Function name: SwitchMode
Kovalev_D 23:12e6183f04d4 181 **
Kovalev_D 23:12e6183f04d4 182 ** Descriptions: Switch mode of device functionality
Kovalev_D 23:12e6183f04d4 183 **
Kovalev_D 23:12e6183f04d4 184 ** parameters: None
Kovalev_D 23:12e6183f04d4 185 ** Returned value: None
Kovalev_D 23:12e6183f04d4 186 **
Kovalev_D 23:12e6183f04d4 187 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 188 int SwitchMode()
Kovalev_D 23:12e6183f04d4 189 {
Kovalev_D 23:12e6183f04d4 190 //-----------------------disable latch sources ---------------------
Kovalev_D 23:12e6183f04d4 191 SetIntLatch(0); //e. disable internal latch
Kovalev_D 23:12e6183f04d4 192 LPC_TIM3->IR = 0x0001; //e. clear internal latch interrupt request
Kovalev_D 23:12e6183f04d4 193
Kovalev_D 23:12e6183f04d4 194 LPC_GPIOINT->IO0IntEnR &= ~0x0000800; //e. disable external latch
Kovalev_D 23:12e6183f04d4 195 LPC_GPIOINT->IO0IntClr |= 0x0000800; //e. clean external latch interrupt request
Kovalev_D 23:12e6183f04d4 196
Kovalev_D 23:12e6183f04d4 197 LPC_TIM0->TCR = 2; //e. stop and reset the multidrop delay timer
Kovalev_D 23:12e6183f04d4 198 LPC_TIM0->IR = 0x03F; //e. clear internal latch interrupt request
Kovalev_D 23:12e6183f04d4 199 //----------------------wait while UART and DMA are active-------------
Kovalev_D 23:12e6183f04d4 200 if ( LPC_GPDMACH1->CConfig & DMA_BUSY) //e. if DMA channel is busy, wait //r. åñëè êàíàë ïåðåäà÷è çàíÿò, æäàòü
Kovalev_D 23:12e6183f04d4 201 return 0;
Kovalev_D 23:12e6183f04d4 202 LPC_GPDMACH1->CConfig &= ~DMAChannelEn; //e. disable DMA for UART transmition
Kovalev_D 23:12e6183f04d4 203 LPC_GPDMACH2->CConfig &= ~DMAChannelEn;
Kovalev_D 23:12e6183f04d4 204
Kovalev_D 23:12e6183f04d4 205 if (!(LPC_UART1->LSR & TRANS_SHIFT_BUF_EMPTY)) //e. transmit buffer is not empty //r. ïåðåäàþùèé áóôåð íå ïóñò
Kovalev_D 23:12e6183f04d4 206 return 0;
Kovalev_D 23:12e6183f04d4 207 LPC_UART1->FCR |= 0x4; //e. reset TX FIFO
Kovalev_D 23:12e6183f04d4 208
Kovalev_D 23:12e6183f04d4 209 LPC_TIM0->IR = 0x3F; //e. clear all interrupt flags
Kovalev_D 23:12e6183f04d4 210 //---------------------configure a new exchanging parameters------------
Kovalev_D 23:12e6183f04d4 211 if (Device_Mode > 3) //e. external latch mode enabled
Kovalev_D 23:12e6183f04d4 212 {
Kovalev_D 23:12e6183f04d4 213 LPC_TIM0->MR0 = 10;
Kovalev_D 23:12e6183f04d4 214 LPC_TIM0->MR1 = 50; //e. /10 = delay before enable signal (us)
Kovalev_D 23:12e6183f04d4 215 // LPC_UART1->FCR &= ~0x08; //e. TX FIFO is not source for DMA request
Kovalev_D 23:12e6183f04d4 216
Kovalev_D 23:12e6183f04d4 217 // LPC_SC->DMAREQSEL = 0xC; //e. external latch delay timer is source for DMA request
Kovalev_D 23:12e6183f04d4 218 // LPC_GPIOINT->IO0IntEnR |= 0x0000800; //e. enable rising edge interrupt
Kovalev_D 23:12e6183f04d4 219 }
Kovalev_D 23:12e6183f04d4 220 else //e. internal latch mode enabled
Kovalev_D 23:12e6183f04d4 221 {
Kovalev_D 23:12e6183f04d4 222 LPC_TIM0->MR0 = 10;
Kovalev_D 23:12e6183f04d4 223 LPC_TIM0->MR1 = 5000; //e. /10 = delay before enable signal (us)
Kovalev_D 23:12e6183f04d4 224 // LPC_SC->DMAREQSEL = 0x3; //e. FIFO generate DMA request
Kovalev_D 23:12e6183f04d4 225
Kovalev_D 23:12e6183f04d4 226 // LPC_SC->EXTINT = 0x8; //e. clean interrupt request
Kovalev_D 23:12e6183f04d4 227 }
Kovalev_D 23:12e6183f04d4 228
Kovalev_D 23:12e6183f04d4 229 UART_SwitchSpeed(SRgR & 0x0030);
Kovalev_D 23:12e6183f04d4 230
Kovalev_D 23:12e6183f04d4 231 if (Device_Mode == DM_INT_LATCH_DELTA_PS)
Kovalev_D 23:12e6183f04d4 232 SetIntLatch(50000);
Kovalev_D 23:12e6183f04d4 233 return 1;
Kovalev_D 23:12e6183f04d4 234 }
Kovalev_D 23:12e6183f04d4 235
Kovalev_D 23:12e6183f04d4 236 /******************************************************************************
Kovalev_D 23:12e6183f04d4 237 ** Function name: ServiceTime
Kovalev_D 23:12e6183f04d4 238 **
Kovalev_D 23:12e6183f04d4 239 ** Descriptions: Routine for pseudoseconds counting
Kovalev_D 23:12e6183f04d4 240 **
Kovalev_D 23:12e6183f04d4 241 ** parameters: None
Kovalev_D 23:12e6183f04d4 242 ** Returned value: None
Kovalev_D 23:12e6183f04d4 243 **
Kovalev_D 23:12e6183f04d4 244 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 245 void ServiceTime(void)// ïñåâäîñåêóíäíûé ñ÷åò÷èê.
Kovalev_D 23:12e6183f04d4 246 {
Kovalev_D 23:12e6183f04d4 247 time_1_Sec -= PrevPeriod;
Kovalev_D 23:12e6183f04d4 248
Kovalev_D 23:12e6183f04d4 249 if (time_1_Sec < (PrevPeriod>>1)) //1 sec elapsed with accurate 0.5 of main period
Kovalev_D 23:12e6183f04d4 250 {
Kovalev_D 23:12e6183f04d4 251 time_1_Sec = DEVICE_SAMPLE_RATE_uks;
Kovalev_D 23:12e6183f04d4 252 Seconds++;
Kovalev_D 23:12e6183f04d4 253 }
Kovalev_D 23:12e6183f04d4 254 if (Seconds == 3) { Seconds++;close_all_loops();}
Kovalev_D 23:12e6183f04d4 255 Sys_Clock++; //e. increment of the system clock register //r. èíêðåìåíò ðåãèñòðà âðåìåííîé ñåòêè ñèñòåìû
Kovalev_D 23:12e6183f04d4 256 PrevPeriod = LPC_PWM1->MR0;
Kovalev_D 23:12e6183f04d4 257 } // ServiceTime
Kovalev_D 23:12e6183f04d4 258
Kovalev_D 23:12e6183f04d4 259 /******************************************************************************
Kovalev_D 23:12e6183f04d4 260 ** Function name: WDTFeed
Kovalev_D 23:12e6183f04d4 261 **
Kovalev_D 23:12e6183f04d4 262 ** Descriptions: Feed watchdog timer to prevent it from timeout
Kovalev_D 23:12e6183f04d4 263 **
Kovalev_D 23:12e6183f04d4 264 ** parameters: None
Kovalev_D 23:12e6183f04d4 265 ** Returned value: None
Kovalev_D 23:12e6183f04d4 266 **
Kovalev_D 23:12e6183f04d4 267 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 268 void WDTFeed( void )
Kovalev_D 23:12e6183f04d4 269 {
Kovalev_D 23:12e6183f04d4 270 LPC_WDT->FEED = 0xAA; /* Feeding sequence */
Kovalev_D 23:12e6183f04d4 271 LPC_WDT->FEED = 0x55;
Kovalev_D 23:12e6183f04d4 272 return;
Kovalev_D 23:12e6183f04d4 273 }
Kovalev_D 23:12e6183f04d4 274
Kovalev_D 23:12e6183f04d4 275 /******************************************************************************
Kovalev_D 23:12e6183f04d4 276 ** Function name: CounterIquiryCycle_Init
Kovalev_D 23:12e6183f04d4 277 **
Kovalev_D 23:12e6183f04d4 278 ** Descriptions: CounterIquiryCycle_Init setup demanded GPIOs for PWM1,
Kovalev_D 23:12e6183f04d4 279 ** reset counter, all latches are enabled, interrupt
Kovalev_D 23:12e6183f04d4 280 ** on PWMMR0, install PWM interrupt to the VIC table.
Kovalev_D 23:12e6183f04d4 281 **
Kovalev_D 23:12e6183f04d4 282 ** parameters:
Kovalev_D 23:12e6183f04d4 283 ** Returned value:
Kovalev_D 23:12e6183f04d4 284 **
Kovalev_D 23:12e6183f04d4 285 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 286 void CounterIquiryCycle_Init(uint32_t cycle)
Kovalev_D 23:12e6183f04d4 287 {
Kovalev_D 23:12e6183f04d4 288 //PWM1 enabled after reset by default
Kovalev_D 23:12e6183f04d4 289 LPC_SC->PCLKSEL0 &= ~(3<<12);
Kovalev_D 23:12e6183f04d4 290 LPC_SC->PCLKSEL0 |= (1<<12); //PWM1 is synchronized by CCLK (100 MHz)(CCLK) PCLKSEL0 - Peripheral Clock Selection registers.
Kovalev_D 23:12e6183f04d4 291
Kovalev_D 23:12e6183f04d4 292 LPC_PWM1->TCR = TCR_RESET; /* Counter Reset */ //#define TCR_RESET 0x00000002 èíêðåìåíòèðîâàòü ñ÷åò÷èê ïðè ñïàäåíèè èìïóëüñà ÏÂÌ.
Kovalev_D 23:12e6183f04d4 293 LPC_PWM1->MCR = PWMMR0I |PWMMR0R; //generate interrupt and reset timer counter ( PWMMR0I - ïðåðûâàíèå ãåíåðèðóåòñÿ êîãäà PWMMR0 ñîâïîäàåò ñî çíà÷åíèåì PWMTC. )
Kovalev_D 23:12e6183f04d4 294 // ( PWMMR0R - ñáðàñûâàåò PWMTC ïðè ñîâïîäåíèè PWMTC è PWMMR0. )
Kovalev_D 23:12e6183f04d4 295
Kovalev_D 23:12e6183f04d4 296 LPC_PWM1->CCR = 0x1; //ðàçðåøèòü ïðåðûâàíèå òîëüêî ïðè ñîâïàäåíèè PWMTC ñ PWMMR0 (åùå ÷òî òî ñâÿçàíî ñ çàãðóçêîé ÒÑ)
Kovalev_D 23:12e6183f04d4 297
Kovalev_D 23:12e6183f04d4 298
Kovalev_D 23:12e6183f04d4 299 PrevPeriod = 10000;
Kovalev_D 23:12e6183f04d4 300 LPC_PWM1->MR0 = PrevPeriod; /* set PWM cycle */// çàäàíèå ïåðèîäà ñáðîñà ñ÷åò÷èêà.
Kovalev_D 23:12e6183f04d4 301 LPC_PWM1->PCR = PWMENA1; //e. single edge control mode, PWM1 out enabled only âêëþ÷åíèå âûõîäà ØÈÌ 1.
Kovalev_D 23:12e6183f04d4 302 LPC_PWM1->LER = LER0_EN ; //e. enable updating of register
Kovalev_D 23:12e6183f04d4 303 LPC_PWM1->TCR = TCR_CNT_EN | TCR_PWM_EN; /* counter enable, PWM enable */ //âêëþ÷åíèå ñ÷åò÷èêà è ØÈÌ
Kovalev_D 23:12e6183f04d4 304
Kovalev_D 23:12e6183f04d4 305 NVIC_DisableIRQ(PWM1_IRQn);//çàïðåòèòü ïðåðûâàíèå.
Kovalev_D 23:12e6183f04d4 306
Kovalev_D 23:12e6183f04d4 307
Kovalev_D 23:12e6183f04d4 308 return ;
Kovalev_D 23:12e6183f04d4 309 }
Kovalev_D 23:12e6183f04d4 310
Kovalev_D 23:12e6183f04d4 311 __irq void TIMER0_IRQHandler()
Kovalev_D 23:12e6183f04d4 312 {
Kovalev_D 23:12e6183f04d4 313 int val = LPC_TIM0->IR;
Kovalev_D 23:12e6183f04d4 314 LPC_TIM0->IR |= 3;
Kovalev_D 23:12e6183f04d4 315
Kovalev_D 23:12e6183f04d4 316 if (val & 1) //MAT 1.0 interrupt
Kovalev_D 23:12e6183f04d4 317 {
Kovalev_D 23:12e6183f04d4 318 LPC_GPIO2->FIOSET |= 1<<6; // turn on the LED
Kovalev_D 23:12e6183f04d4 319 LPC_TIM0->IR |= 1;
Kovalev_D 23:12e6183f04d4 320 return;
Kovalev_D 23:12e6183f04d4 321 }
Kovalev_D 23:12e6183f04d4 322 if (val & 2) //MAT 1.1 interrupt
Kovalev_D 23:12e6183f04d4 323 {
Kovalev_D 23:12e6183f04d4 324 LPC_GPIO2->FIOCLR |= 1<<6; // turn on the LED
Kovalev_D 23:12e6183f04d4 325 LPC_TIM0->IR |= 2;
Kovalev_D 23:12e6183f04d4 326 return;
Kovalev_D 23:12e6183f04d4 327 }
Kovalev_D 23:12e6183f04d4 328 if (val & 4) //MAT 0.2 interrupt
Kovalev_D 23:12e6183f04d4 329 {
Kovalev_D 23:12e6183f04d4 330 // LPC_GPIO0->FIOSET2 |= 0xFF; //set P0.23
Kovalev_D 23:12e6183f04d4 331 // LPC_GPIO2->FIOSET |= 0x00000040; // turn on the LED
Kovalev_D 23:12e6183f04d4 332 // LPC_TIM0->IR |= 4;
Kovalev_D 23:12e6183f04d4 333 return;
Kovalev_D 23:12e6183f04d4 334 }
Kovalev_D 23:12e6183f04d4 335 return;
Kovalev_D 23:12e6183f04d4 336 }
Kovalev_D 23:12e6183f04d4 337
Kovalev_D 23:12e6183f04d4 338 /******************************************************************************
Kovalev_D 23:12e6183f04d4 339 ** Function name: ExtLatch_Init
Kovalev_D 23:12e6183f04d4 340 **
Kovalev_D 23:12e6183f04d4 341 ** Descriptions: Initialization of external latch
Kovalev_D 23:12e6183f04d4 342 **
Kovalev_D 23:12e6183f04d4 343 ** parameters: None
Kovalev_D 23:12e6183f04d4 344 ** Returned value: None
Kovalev_D 23:12e6183f04d4 345 **
Kovalev_D 23:12e6183f04d4 346 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 347 void ExtLatch_Init()
Kovalev_D 23:12e6183f04d4 348 {
Kovalev_D 23:12e6183f04d4 349 LPC_PINCON->PINSEL4 &= ~0xC000000; //e. èñïîëüçîâàòü P2.13 êàê GPIO.
Kovalev_D 23:12e6183f04d4 350 LPC_PINCON->PINSEL0 &= ~0x0C00000; //e. èñïîëüçîâàòü P0.11 êàê GPIO.
Kovalev_D 23:12e6183f04d4 351 LPC_GPIO0->FIODIR &= ~0x0000800; //e. èñïîëüçîâàòü P0.11 âõëîä.
Kovalev_D 23:12e6183f04d4 352 LPC_GPIOINT->IO0IntEnR &= ~0x0000800; //e. îòêëþ÷èòü âíóòðåííþþ çàùåëêó.
Kovalev_D 23:12e6183f04d4 353 LPC_GPIOINT->IO0IntClr |= 0x0000800; //e. ñáðîñèòü çàïðîñû íà ïðåðûâàíèÿ
Kovalev_D 23:12e6183f04d4 354
Kovalev_D 23:12e6183f04d4 355 NVIC_EnableIRQ(EINT3_IRQn); // ðàçðåøèòü ïðåðûâàíèÿ.
Kovalev_D 23:12e6183f04d4 356
Kovalev_D 23:12e6183f04d4 357 //+++++++ initialization of timer for multidrop delay generation+++++++++++++++++++++++
Kovalev_D 23:12e6183f04d4 358 //e. TIMER0 enabled by default
Kovalev_D 23:12e6183f04d4 359 LPC_SC->PCLKSEL0 &= ~(3<<2); //e. ñáðîñèòü ÷àñòîòó òàéìåðà 0
Kovalev_D 23:12e6183f04d4 360 LPC_SC->PCLKSEL0 |= (3<<2); //e. óñòàíîâèòü ÷àñòîòó òàéìåðà 0 íà CLK/8.
Kovalev_D 23:12e6183f04d4 361 LPC_TIM0->PR = 0; //e. óñòàíîâèòü äåëèòåëü ÷àñòîòû â 0.
Kovalev_D 23:12e6183f04d4 362 LPC_TIM0->IR = 0x3F; //e. î÷èñòèòü ôëàãè ïðåðûâàíèé.
Kovalev_D 23:12e6183f04d4 363 LPC_TIM0->MCR = 1 |(1<<3)|MR1_RESET |MR1_STOP; //e. ñáðîñèòü è îñòàíîâèòü òàéìåð ïîñëå ñîâïàäåíèÿ MR1 è TC.
Kovalev_D 23:12e6183f04d4 364 LPC_TIM0->CCR = 0; //e. ñîäåðæèìîå òàéìåðà çàãðóæàåòñÿ ïðè ïîÿâëåíèè ïåðåäíåãî ôðîíòà çàùåëêè.
Kovalev_D 23:12e6183f04d4 365 LPC_TIM0->CTCR = 0; //e. timer0 â ðåæèìå òàéìåðà.
Kovalev_D 23:12e6183f04d4 366
Kovalev_D 23:12e6183f04d4 367 LPC_TIM0->MR0 = /*Device_blk.Address**/10; //e. delay before UART transmitter loading
Kovalev_D 23:12e6183f04d4 368 LPC_TIM0->MR1 = /*Device_blk.Address**/5000; //e. delay before UART transmitter start
Kovalev_D 23:12e6183f04d4 369 //e. set first empty) event of timer
Kovalev_D 23:12e6183f04d4 370 NVIC_DisableIRQ(TIMER0_IRQn);
Kovalev_D 23:12e6183f04d4 371 }
Kovalev_D 23:12e6183f04d4 372 /******************************************************************************
Kovalev_D 23:12e6183f04d4 373 ** Function name: IntLatch_Init
Kovalev_D 23:12e6183f04d4 374 **
Kovalev_D 23:12e6183f04d4 375 ** Descriptions: Initialization of iternal latch cycle generation
Kovalev_D 23:12e6183f04d4 376 **
Kovalev_D 23:12e6183f04d4 377 ** parameters: None
Kovalev_D 23:12e6183f04d4 378 ** Returned value: None
Kovalev_D 23:12e6183f04d4 379 **
Kovalev_D 23:12e6183f04d4 380 ******************************************************************************/
Kovalev_D 23:12e6183f04d4 381 void IntLatch_Init()
Kovalev_D 23:12e6183f04d4 382 {
Kovalev_D 23:12e6183f04d4 383 LPC_SC->PCONP |= (1<<23); //âêëþ÷èò TIME3(òàéìåð)
Kovalev_D 23:12e6183f04d4 384 //e. by default timer3 mode is not counter (T3CTCR[1,0]=0)
Kovalev_D 23:12e6183f04d4 385
Kovalev_D 23:12e6183f04d4 386 LPC_SC->PCLKSEL1 &= SYNC_CLCK4; // ÷àñòîòà âõîäíîãî ñèãíàëà ðàâíà CLCK/4
Kovalev_D 23:12e6183f04d4 387 LPC_SC->PCLKSEL1 |= (1<<14); // timer 3 input frequency equal to CLCK/4
Kovalev_D 23:12e6183f04d4 388
Kovalev_D 23:12e6183f04d4 389 // LPC_PINCON->PINSEL1 |= (3<<16); //e. CAP 3.1 is connected to P0.24
Kovalev_D 23:12e6183f04d4 390 //e. by default CAP3.0 is connected to timer3
Kovalev_D 23:12e6183f04d4 391 LPC_TIM3->PR = 0; //e. óñòàíîâèòü ïðåääåëèòåëü òàéìåðà3 íà 0.
Kovalev_D 23:12e6183f04d4 392 LPC_TIM3->IR = 0x0001; //e. î÷èñòèòü ôëàãè ïðåðûâàíèé.
Kovalev_D 23:12e6183f04d4 393 LPC_TIM3->MCR = MR0_RESET |MR0_INT_EN |MR0_NO_STOP; // óñòàíîâêà ôëàãîâ ïðåðûâàíèé êîòîðûå âûïîëíÿþòñÿ ïðè ñîâïàäåíèè òàéìåðà è ÌÑR.
Kovalev_D 23:12e6183f04d4 394 LPC_TIM3->CCR = 0x0001; //ñîäåðæèìîå ñ÷åò÷èêà çàãðóæàåòñÿ ïî ïðèõîäó ïåðåäíåãî ôðîíòà çàùåëêè.
Kovalev_D 23:12e6183f04d4 395
Kovalev_D 23:12e6183f04d4 396 NVIC_EnableIRQ(TIMER3_IRQn); //ðàçðåøèòü ïðåðûâàíèÿ.
Kovalev_D 23:12e6183f04d4 397 }
Kovalev_D 23:12e6183f04d4 398 /*****************************************************************************
Kovalev_D 23:12e6183f04d4 399 ** Function name: WDTInit
Kovalev_D 23:12e6183f04d4 400 **
Kovalev_D 23:12e6183f04d4 401 ** Descriptions: Initialize watchdog timer, install the
Kovalev_D 23:12e6183f04d4 402 ** watchdog timer interrupt handler
Kovalev_D 23:12e6183f04d4 403 **
Kovalev_D 23:12e6183f04d4 404 ** parameters: None
Kovalev_D 23:12e6183f04d4 405 ** Returned value: true or false, return false if the VIC table
Kovalev_D 23:12e6183f04d4 406 ** is full and WDT interrupt handler can be
Kovalev_D 23:12e6183f04d4 407 ** installed.
Kovalev_D 23:12e6183f04d4 408 **
Kovalev_D 23:12e6183f04d4 409 *****************************************************************************/
Kovalev_D 23:12e6183f04d4 410 uint32_t WDTInit( void )
Kovalev_D 23:12e6183f04d4 411 {
Kovalev_D 23:12e6183f04d4 412 NVIC_DisableIRQ(WDT_IRQn);
Kovalev_D 23:12e6183f04d4 413
Kovalev_D 23:12e6183f04d4 414 LPC_WDT->TC = WDT_FEED_VALUE; // once WDEN is set, the WDT will start after feeding
Kovalev_D 23:12e6183f04d4 415 LPC_WDT->MOD = WDEN;
Kovalev_D 23:12e6183f04d4 416
Kovalev_D 23:12e6183f04d4 417 LPC_WDT->FEED = 0xAA; // Feeding sequence
Kovalev_D 23:12e6183f04d4 418 LPC_WDT->FEED = 0x55;
Kovalev_D 23:12e6183f04d4 419
Kovalev_D 23:12e6183f04d4 420 return 1;
Kovalev_D 23:12e6183f04d4 421 }
Kovalev_D 23:12e6183f04d4 422 /******************************************************************************
Kovalev_D 23:12e6183f04d4 423 ** End Of File
Kovalev_D 23:12e6183f04d4 424 ******************************************************************************/