// // Call at 1ms ISR - Part of ISR // ISR complete within 5uS // void my_TMR_ISR(void) { unsigned char tFS=0; static u32 tPACC=0; static unsigned char tLED=0; static unsigned int tTMR=0; #ifdef debug_isr DEBUG_H(); #endif tTMR++; if (tTMR>=200) { // Generate Sync. Task Flag on Every 100mS // Decouple it from ISR mTask_Sync_Flag = 1; mTMR_100ms +=2; tTMR = 0; } // Phase Accumulator to generate Flow Sensor count // 60000 phase unit per cycle // n delta phase unit = n count / min // 1 delta phase unit = 1 count / min // 3000 delta phase unit = 3000 counts / min mDP = mFR; tPACC += mDP; if (tPACC>=60000) { tPACC = 0; } if (tPACC<30000) { FS_O = 1; } else { FS_O = 0; } // Flow Sensor Input 0 tFS = FS_I0; if ((tFS != mFS_CNT[0][1]) && (tFS==1)) mFS_CNT[0][0]++; mFS_CNT[0][1] = tFS; // Flow Sensor Input 1 tFS = FS_I1; if ((tFS != mFS_CNT[1][1]) && (tFS==1)) mFS_CNT[1][0]++; mFS_CNT[1][1] = tFS; // Flow Sensor Input 2 tFS = FS_I2; if ((tFS != mFS_CNT[2][1]) && (tFS==1)) mFS_CNT[2][0]++; mFS_CNT[2][1] = tFS; tLED ++; if (tLED>=16) { tLED = 0; } if (mLED[0]>tLED) { LED_R_ON(); } else { LED_R_OFF(); } my_printQ(); #ifdef debug_isr DEBUG_L(); #endif }
int main() { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; DMA_InitTypeDef DMA_InitStructure; uint16_t PrescalerValue; LED_Init(); LED_R_ON(); LLIO_Init(115200); printf("\r\nPWM dimming\r\n"); /* Enable ADC, GPIO, Timer, DMA clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); /* DMA2 Channel0(ADC) configuration */ DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address; // source DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)TIM3_CCR1_Address; // destination DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStructure); DMA_Cmd(DMA2_Stream0, ENABLE); /* TIM3_CH1(PB4-LED) configuration */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3); /* ADC Common Init */ ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; // ADC clock = PCLK2/prescaler. ADC freq = typical 30MHz, Max 36MHz. PCLK2 = 168/2=84MHz. ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure); /* ADC channel 10 (PC0) configuration */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC, &GPIO_InitStructure); /* ADC channel configuration */ ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO; // TIM3의 트리거 발생시 ADC 수행 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel10 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_3Cycles); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable DMA request after last transfer (Single-ADC mode) */ ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); /* Compute the prescaler value */ SystemCoreClockUpdate(); PrescalerValue = (uint16_t) (SystemCoreClock / 2 / TIMER_PRESCALER_FREQ) - 1; // timer base counter에 1MHz 입력 /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = PWM_WIDTH - 1; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // TIM3 update 이벤트에서 트리거 발생하도록 설정 -> ADC trigger로 사용 TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = DUTY_IDLE; // default 50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable); /* TIM3 enable counter */ TIM_Cmd(TIM3, ENABLE); while(1) { __WFI(); } }
int main() { uint16_t PrescalerValue; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; LED_Init(); LED_R_ON(); LED_G_ON(); LLIO_Init(115200); /* TIM2, GPIOA clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); /* Enable the TIM2 global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0f; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // PA0 핀을 TIM2_CH1 input으로 설정 GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM2); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Compute the prescaler value */ SystemCoreClockUpdate(); PrescalerValue = (uint16_t) (SystemCoreClock / 2 / TIMER_PRESCALER_FREQ) - 1; // timer base counter에 1MHz 입력 /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = TIMER_PERIOD; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(TIM2, &TIM_ICInitStructure); /* TIM2 enable counter */ TIM_Cmd(TIM2, ENABLE); TIM_ITConfig(TIM2, TIM_IT_Update | TIM_IT_CC1, ENABLE); printf("\r\nTimer Capture example\r\n"); while(1) { __WFI(); if (capture_flag) { capture_flag = 0; printf("time diff = %d[us]\r\n", diff); LED_G_TOGGLE(); } } }
int main() { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; LED_Init(); LED_R_ON(); CPAL_I2C_StructInit(&I2C1_DevStructure); I2C1_DevStructure.CPAL_Dev = CPAL_I2C1; I2C1_DevStructure.pCPAL_I2C_Struct->I2C_ClockSpeed = 400000; I2C1_DevStructure.CPAL_ProgModel = CPAL_PROGMODEL_DMA; I2C1_DevStructure.wCPAL_Options = 0; CPAL_I2C_Init(&I2C1_DevStructure); // Interrupt input(PB5) configuration RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource5); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); EXTI_InitStructure.EXTI_Line = EXTI_Line5; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); LLIO_Init(115200); printf("\r\nmyPressure I2C example\r\n"); // myPressure의 WHO_AM_I 레지스터 값을 읽어 출력한다. // read 결과값은 등록된 user callback을 통해 받아온다. buff.pbBuffer = i2c_buff; buff.wAddr1 = PRESSURE_SLAVE_ADDRESS << 1; buff.wAddr2 = PRESSURE_REG_WHO_AM_I; buff.wNumData = 1; I2C1_DevStructure.pCPAL_TransferRx = &buff; printf("\r\n\r\nread : %d\r\n", CPAL_I2C_Read(&I2C1_DevStructure)); while(1) { __WFI(); // 인터럽트가 발생할 때 까지 이곳에서 대기 } }
/** * @brief LwIP_DHCP_Process_Handle * @param None * @retval None */ void LwIP_DHCP_Process_Handle() { struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; uint8_t iptab[4] = {0}; switch (DHCP_state) { case DHCP_START: { DHCP_state = DHCP_WAIT_ADDRESS; dhcp_start(&gnetif); /* IP address should be set to 0 every time we want to assign a new DHCP address */ IPaddress = 0; printf("# Looking for DHCP server\r\n"); printf("# Please wait...\r\n"); } break; case DHCP_WAIT_ADDRESS: { /* Read the new IP address */ IPaddress = gnetif.ip_addr.addr; if (IPaddress!=0) { DHCP_state = DHCP_ADDRESS_ASSIGNED; /* Stop DHCP */ dhcp_stop(&gnetif); iptab[0] = (uint8_t)(IPaddress >> 24); iptab[1] = (uint8_t)(IPaddress >> 16); iptab[2] = (uint8_t)(IPaddress >> 8); iptab[3] = (uint8_t)(IPaddress); printf("# IP address assigned by a DHCP server\r\n"); printf("# : %d.%d.%d.%d\r\n", iptab[3], iptab[2], iptab[1], iptab[0]); LED_R_ON(); } else { /* DHCP timeout */ if (gnetif.dhcp->tries > MAX_DHCP_TRIES) { DHCP_state = DHCP_TIMEOUT; /* Stop DHCP */ dhcp_stop(&gnetif); /* Static address used */ IP4_ADDR(&ipaddr, IP_ADDR0 ,IP_ADDR1 , IP_ADDR2 , IP_ADDR3 ); IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3); IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); netif_set_addr(&gnetif, &ipaddr , &netmask, &gw); printf("# DHCP timeout\r\n"); iptab[0] = IP_ADDR3; iptab[1] = IP_ADDR2; iptab[2] = IP_ADDR1; iptab[3] = IP_ADDR0; printf("# Static IP address\r\n"); printf("# : %d.%d.%d.%d\r\n", iptab[3], iptab[2], iptab[1], iptab[0]); LED_R_ON(); } } }
/*************************************************** * Function: void timer0_isr(void) * * OverView: If low interrupt actived, called this function. * Control LED * * Note: reference BootLoader.h ***************************************************/ void timer0_isr(void) { if(INTCONbits.TMR0IF) { INTCONbits.TMR0IF = 0; TMR0L = tmr0l_temp; if(!wg_ledCtrl) { if(wg_ledPwmDuty <= 0) { TMR0L = wg_ledPwmDuty; LED_WG_OFF(); } else if(TMR0L == wg_ledPwmDuty) { TMR0L = 255 - wg_ledPwmDuty; LED_WG_ON(); } else { TMR0L = wg_ledPwmDuty; LED_WG_OFF(); } } else if(!r_ledCtrl) { if(r_ledPwmDuty <= 0) { TMR0L = r_ledPwmDuty; LED_R_OFF(); } else if(TMR0L == r_ledPwmDuty) { TMR0L = 255 - r_ledPwmDuty; LED_R_ON(); } else { TMR0L = r_ledPwmDuty; LED_R_OFF(); } } else if(!g_ledCtrl) { if(g_ledPwmDuty <= 0) { TMR0L = g_ledPwmDuty; LED_G_OFF(); } else if(TMR0L == g_ledPwmDuty) { TMR0L = 255 - g_ledPwmDuty; LED_G_ON(); } else { TMR0L = g_ledPwmDuty; LED_G_OFF(); } } else if(!b_ledCtrl) { if(b_ledPwmDuty <= 0) { TMR0L = b_ledPwmDuty; LED_B_OFF(); } else if(TMR0L == b_ledPwmDuty) { TMR0L = 255 - b_ledPwmDuty; LED_B_ON(); } else { TMR0L = b_ledPwmDuty; LED_B_OFF(); } } else { TMR0L = tmr0l_temp; LED_WG_OFF(); LED_R_OFF(); LED_G_OFF(); LED_B_OFF(); } tmr0l_temp = TMR0L; } }