void Timer_t::Init() { #if defined STM32L1XX if(ANY_OF_3(ITmr, TIM9, TIM10, TIM11)) PClk = &Clk.APB2FreqHz; else PClk = &Clk.APB1FreqHz; if (ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } else if(ITmr == TIM4) { rccEnableTIM4(FALSE); } else if(ITmr == TIM6) { rccEnableAPB1(RCC_APB1ENR_TIM6EN, FALSE); } else if(ITmr == TIM7) { rccEnableAPB1(RCC_APB1ENR_TIM7EN, FALSE); } else if(ITmr == TIM9) { rccEnableAPB2(RCC_APB2ENR_TIM9EN, FALSE); } else if(ITmr == TIM10) { rccEnableAPB2(RCC_APB2ENR_TIM10EN, FALSE); } else if(ITmr == TIM11) { rccEnableAPB2(RCC_APB2ENR_TIM11EN, FALSE); } #elif defined STM32F0XX if (ITmr == TIM1) { rccEnableTIM1(FALSE); } else if(ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } #ifdef TIM6 else if(ITmr == TIM6) { rccEnableAPB1(RCC_APB1ENR_TIM6EN, FALSE); } #endif else if(ITmr == TIM14) { RCC->APB1ENR |= RCC_APB1ENR_TIM14EN; } #ifdef TIM15 else if(ITmr == TIM15) { RCC->APB2ENR |= RCC_APB2ENR_TIM15EN; } #endif else if(ITmr == TIM16) { RCC->APB2ENR |= RCC_APB2ENR_TIM16EN; } else if(ITmr == TIM17) { RCC->APB2ENR |= RCC_APB2ENR_TIM17EN; } // Clock src PClk = &Clk.APBFreqHz; #elif defined STM32F2XX || defined STM32F4XX if(ANY_OF_5(ITmr, TIM1, TIM8, TIM9, TIM10, TIM11)) PClk = &Clk.APB2FreqHz; else PClk = &Clk.APB1FreqHz; if (ITmr == TIM1) { rccEnableTIM1(FALSE); } else if(ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } else if(ITmr == TIM4) { rccEnableTIM4(FALSE); } else if(ITmr == TIM5) { rccEnableTIM5(FALSE); } else if(ITmr == TIM6) { rccEnableTIM6(FALSE); } else if(ITmr == TIM7) { rccEnableTIM7(FALSE); } else if(ITmr == TIM8) { rccEnableTIM8(FALSE); } else if(ITmr == TIM9) { rccEnableTIM9(FALSE); } else if(ITmr == TIM10) { RCC->APB2ENR |= RCC_APB2ENR_TIM10EN; } else if(ITmr == TIM11) { rccEnableTIM11(FALSE); } else if(ITmr == TIM12) { rccEnableTIM12(FALSE); } else if(ITmr == TIM13) { RCC->APB1ENR |= RCC_APB1ENR_TIM13EN; } else if(ITmr == TIM14) { rccEnableTIM14(FALSE); } #elif defined STM32F10X_LD_VL if(ANY_OF_4(ITmr, TIM1, TIM15, TIM16, TIM17)) PClk = &Clk.APB2FreqHz; else PClk = &Clk.APB1FreqHz; if (ITmr == TIM1) { rccEnableTIM1(FALSE); } else if(ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } else if(ITmr == TIM15) { RCC->APB2ENR |= RCC_APB2ENR_TIM15EN; } else if(ITmr == TIM16) { RCC->APB2ENR |= RCC_APB2ENR_TIM16EN; } else if(ITmr == TIM17) { RCC->APB2ENR |= RCC_APB2ENR_TIM17EN; } #endif }
void Timer_t::Init() { if(ANY_OF_3(ITmr, TIM9, TIM10, TIM11)) PClk = &Clk.APB2FreqHz; else PClk = &Clk.APB1FreqHz; if (ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } else if(ITmr == TIM4) { rccEnableTIM4(FALSE); } else if(ITmr == TIM6) { rccEnableAPB1(RCC_APB1ENR_TIM6EN, FALSE); } else if(ITmr == TIM7) { rccEnableAPB1(RCC_APB1ENR_TIM7EN, FALSE); } else if(ITmr == TIM9) { rccEnableAPB2(RCC_APB2ENR_TIM9EN, FALSE); } else if(ITmr == TIM10) { rccEnableAPB2(RCC_APB2ENR_TIM10EN, FALSE); } else if(ITmr == TIM11) { rccEnableAPB2(RCC_APB2ENR_TIM11EN, FALSE); } }
void Timer_t::Init(TIM_TypeDef* Tmr) { ITmr = Tmr; if (ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } else if(ITmr == TIM4) { rccEnableTIM4(FALSE); } else if(ITmr == TIM6) { rccEnableAPB1(RCC_APB1ENR_TIM6EN, FALSE); } else if(ITmr == TIM7) { rccEnableAPB1(RCC_APB1ENR_TIM7EN, FALSE); } else if(ITmr == TIM9) { rccEnableAPB2(RCC_APB2ENR_TIM9EN, FALSE); } else if(ITmr == TIM10) { rccEnableAPB2(RCC_APB2ENR_TIM10EN, FALSE); } else if(ITmr == TIM11) { rccEnableAPB2(RCC_APB2ENR_TIM11EN, FALSE); } // Clock src if(ANY_OF_3(ITmr, TIM9, TIM10, TIM11)) PClk = &Clk.APB2FreqHz; else PClk = &Clk.APB1FreqHz; }
// ================================ Timer ====================================== void Timer_t::Init() { if (ITmr == TIM1) { rccEnableTIM1(FALSE); } else if(ITmr == TIM2) { rccEnableTIM2(FALSE); } else if(ITmr == TIM3) { rccEnableTIM3(FALSE); } else if(ITmr == TIM4) { rccEnableTIM4(FALSE); } else if(ITmr == TIM5) { rccEnableTIM5(FALSE); } else if(ITmr == TIM8) { rccEnableTIM8(FALSE); } else if(ITmr == TIM9) { rccEnableAPB2(RCC_APB2ENR_TIM9EN, FALSE); } else if(ITmr == TIM10) { rccEnableAPB2(RCC_APB2ENR_TIM10EN, FALSE); } else if(ITmr == TIM11) { rccEnableAPB2(RCC_APB2ENR_TIM11EN, FALSE); } else if(ITmr == TIM12) { rccEnableAPB1(RCC_APB1ENR_TIM12EN, FALSE); } else if(ITmr == TIM13) { rccEnableAPB1(RCC_APB1ENR_TIM13EN, FALSE); } else if(ITmr == TIM14) { rccEnableAPB1(RCC_APB1ENR_TIM14EN, FALSE); } // Clock src if(ANY_OF_5(ITmr, TIM1, TIM8, TIM9, TIM10, TIM11)) PClk = &Clk.APB2FreqHz; else PClk = &Clk.APB1FreqHz; }
void VSL_InitTimer( int prescale, int period ) { // Not available on the Olimex eval card #if defined (STM32F10X_HD) uint16_t tmpcr1 = 0; // TIM7 Peripheral clock enable rccEnableAPB1(RCC_APB1ENR_TIM7EN, FALSE ); // disable timer TIM7->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN)); // check parameters if( (period == 0) || (prescale == 0) ) return; // Time base configuration tmpcr1 = TIM7->CR1; // Set the clock division - happens to be 0 tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD)); tmpcr1 |= (uint32_t)0; TIM7->CR1 = tmpcr1; // Set the Autoreload value TIM7->ARR = period - 1; // Set the Prescaler value TIM7->PSC = prescale - 1; // Generate an update event to reload the Prescaler and the Repetition counter // values immediately TIM7->EGR = TIM_PSCReloadMode_Immediate; // TIM7 TRGO selection // Reset the MMS Bits TIM7->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_MMS); // Select the TRGO source TIM7->CR2 |= TIM_TRGOSource_Update; #endif }
// ================================ PWM pin ==================================== void PwmPin_t::Init(GPIO_TypeDef *GPIO, uint16_t N, TIM_TypeDef* PTim, uint8_t Chnl, uint16_t TopValue, bool Inverted) { Tim = PTim; if(Tim == TIM1) { PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF1); rccEnableTIM1(FALSE); } else if(Tim == TIM2) { PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF1); rccEnableTIM2(FALSE); } else if(Tim == TIM3) { PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF2); rccEnableTIM3(FALSE); } else if(Tim == TIM4) { PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF2); rccEnableTIM4(FALSE); } else if(Tim == TIM5) { PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF2); rccEnableTIM5(FALSE); } else if(Tim == TIM8) { PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3); rccEnableTIM8(FALSE); } else if(Tim == TIM9) { PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3); rccEnableAPB2(RCC_APB2ENR_TIM9EN, FALSE); } else if(Tim == TIM10) { PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3); rccEnableAPB2(RCC_APB2ENR_TIM10EN, FALSE); } else if(Tim == TIM11) { PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3); rccEnableAPB2(RCC_APB2ENR_TIM11EN, FALSE); } else if(Tim == TIM12) { PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF9); rccEnableAPB1(RCC_APB1ENR_TIM12EN, FALSE); } else if(Tim == TIM13) { PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF9); rccEnableAPB1(RCC_APB1ENR_TIM13EN, FALSE); } else if(Tim == TIM14) { PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF9); rccEnableAPB1(RCC_APB1ENR_TIM14EN, FALSE); } // Clock src if(ANY_OF_5(Tim, TIM1, TIM8, TIM9, TIM10, TIM11)) PClk = &Clk.APB2FreqHz; else PClk = &Clk.APB1FreqHz; // Common Tim->CR1 = TIM_CR1_CEN; // Enable timer, set clk division to 0, AutoReload not buffered Tim->CR2 = 0; Tim->ARR = TopValue; Tim->BDTR = TIM_BDTR_MOE | TIM_BDTR_AOE; // Output uint16_t tmp = Inverted? 0b111 : 0b110; // PWM mode 1 or 2 switch(Chnl) { case 1: PCCR = &Tim->CCR1; Tim->CCMR1 |= (tmp << 4); Tim->CCER |= TIM_CCER_CC1E; break; case 2: PCCR = &Tim->CCR2; Tim->CCMR1 |= (tmp << 12); Tim->CCER |= TIM_CCER_CC2E; break; case 3: PCCR = &Tim->CCR3; Tim->CCMR2 |= (tmp << 4); Tim->CCER |= TIM_CCER_CC3E; break; case 4: PCCR = &Tim->CCR4; Tim->CCMR2 |= (tmp << 12); Tim->CCER |= TIM_CCER_CC4E; break; default: break; } *PCCR = 0; }
void VSL_Init() { uint32_t tmpreg1 = 0, tmpreg2 = 0; // Not available on the Olimex eval card #if defined (STM32F10X_HD) // DAC channel 1 & 2 (DAC_OUT1 = PA.4)(DAC_OUT2 = PA.5) configuration // Once the DAC channel is enabled, the corresponding GPIO pin is automatically // connected to the DAC converter. In order to avoid parasitic consumption, // the GPIO pin should be configured in analog // GPIO config now done elsewhere. // create a default waveform VSL_CreateSineWave( DEFAULT_AMPLITUDE ); // Init timer for 1KHz VSL_InitTimer(9, 250); // DAC Peripheral clock enable rccEnableAPB1((RCC_APB1ENR_DACEN), FALSE ); // DAC channel1 Configuration // Get the DAC CR value */ tmpreg1 = DAC->CR; // Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */ tmpreg1 &= ~(CR_CLEAR_MASK << DAC_Channel_1); // Configure for the selected DAC channel: buffer output, trigger, wave generation, tmpreg2 = (DAC_Trigger_T7_TRGO | DAC_WaveGeneration_None | DAC_LFSRUnmask_Bit0 | DAC_OutputBuffer_Disable); // Calculate CR register value depending on DAC_Channel */ tmpreg1 |= tmpreg2 << DAC_Channel_1; // Write to DAC CR */ DAC->CR = tmpreg1; // DMA config if( dmaStreamAllocate(vsl_dma, 0, NULL, NULL) == FALSE ) { uint32_t tmpreg = 0; tmpreg |= STM32_DMA_CR_DIR_M2P | STM32_DMA_CR_CIRC | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_PL(2) | STM32_DMA_CR_MINC; dmaStreamSetMode(vsl_dma, tmpreg); dmaStreamSetTransactionSize(vsl_dma, WAVE_SAMPLES); dmaStreamSetPeripheral(vsl_dma, &DAC->DHR12R1); dmaStreamSetMemory0( vsl_dma, (uint32_t)&Sine12bit ); // Enable DMA2 Channel 3 dmaStreamEnable(vsl_dma); // Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is // automatically connected to the DAC converter. DAC->CR |= (DAC_CR_EN1 << DAC_Channel_1); // Enable DMA for DAC Channel1 DAC->CR |= (DAC_CR_DMAEN1 << DAC_Channel_1); } #endif }
// ================================ PWM pin ==================================== void PwmPin_t::Init(GPIO_TypeDef *GPIO, uint16_t N, uint8_t TimN, uint8_t Chnl, uint16_t TopValue, bool Inverted) { TIM_TypeDef* Tim; switch(TimN) { case 1: Tim = TIM1; PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF1); rccEnableTIM1(FALSE); break; case 2: Tim = TIM2; PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF1); rccEnableTIM2(FALSE); break; case 3: Tim = TIM3; PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF2); rccEnableTIM3(FALSE); break; case 4: Tim = TIM4; PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF2); rccEnableTIM4(FALSE); break; case 5: Tim = TIM5; PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF2); rccEnableTIM5(FALSE); break; case 8: Tim = TIM8; PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3); rccEnableTIM8(FALSE); break; case 9: Tim = TIM9; PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3); rccEnableAPB2(RCC_APB2ENR_TIM9EN, FALSE); break; case 10: Tim = TIM10; PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3); rccEnableAPB2(RCC_APB2ENR_TIM10EN, FALSE); break; case 11: Tim = TIM11; PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF3); rccEnableAPB2(RCC_APB2ENR_TIM11EN, FALSE); break; case 12: Tim = TIM12; PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF9); rccEnableAPB1(RCC_APB1ENR_TIM12EN, FALSE); break; case 13: Tim = TIM13; PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF9); rccEnableAPB1(RCC_APB1ENR_TIM13EN, FALSE); break; case 14: Tim = TIM14; PinSetupAlterFunc(GPIO, N, omPushPull, pudNone, AF9); rccEnableAPB1(RCC_APB1ENR_TIM14EN, FALSE); break; default: return; break; } // Common Tim->CR1 = TIM_CR1_CEN; // Enable timer, set clk division to 0, AutoReload not buffered Tim->CR2 = 0; Tim->ARR = TopValue; Tim->BDTR = TIM_BDTR_MOE | TIM_BDTR_AOE; // Output uint16_t tmp = Inverted? 0b111 : 0b110; // PWM mode 1 or 2 switch(Chnl) { case 1: PCCR = &Tim->CCR1; Tim->CCMR1 |= (tmp << 4); Tim->CCER |= TIM_CCER_CC1E; break; case 2: PCCR = &Tim->CCR2; Tim->CCMR1 |= (tmp << 12); Tim->CCER |= TIM_CCER_CC2E; break; case 3: PCCR = &Tim->CCR3; Tim->CCMR2 |= (tmp << 4); Tim->CCER |= TIM_CCER_CC3E; break; case 4: PCCR = &Tim->CCR4; Tim->CCMR2 |= (tmp << 12); Tim->CCER |= TIM_CCER_CC4E; break; default: break; } *PCCR = 0; }
//fungsi inisialisasi CAN (Controller Area Network) static void CAN_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; //NVIC_InitTypeDef NVIC_InitStructure; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; /* CAN GPIOs configuration **************************************************/ /* Connect CAN pins to AF7 */ GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT); GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT); /* Configure CAN RX and TX pins */ GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure); /* NVIC configuration *******************************************************/ nvicEnableVector(STM32_CAN1_RX0_NUMBER, CORTEX_PRIORITY_MASK(STM32_CAN_CAN1_IRQ_PRIORITY)); /* CAN configuration ********************************************************/ /* Enable CAN clock */ rccEnableAPB1(RCC_APB1ENR_CAN1EN, 2); //alamat header --> os/hal/platforms/ /* CAN register init */ //CAN_DeInit(CANx); CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; /* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */ CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler = 2; CAN_Init(CANx, &CAN_InitStructure); /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); /*TxMessage.StdId = 0x111; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 8; TxMessage2.StdId = 0x222; TxMessage2.RTR = CAN_RTR_DATA; TxMessage2.IDE = CAN_ID_STD; TxMessage2.DLC = 8; TxMessage3.StdId = 0x333; TxMessage3.RTR = CAN_RTR_DATA; TxMessage3.IDE = CAN_ID_STD; TxMessage3.DLC = 8; TxMessage3.StdId = 0x444; TxMessage3.RTR = CAN_RTR_DATA; TxMessage3.IDE = CAN_ID_STD; TxMessage3.DLC = 8; */ /* Mengaktifkan FIFO 0 message pending Interrupt */ CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE); }