void EXTI9_5_IRQHandler(void) { process_deca_irq(); /* Clear EXTI Line 8 Pending Bit */ EXTI_ClearITPendingBit(DECAIRQ_EXTI); }
// button EXTernal Interrupt - change LED blink delay void EXTI0_IRQHandler(){ if(LED_delay > 50) LED_delay -= 50; else LED_delay = 1000; EXTI_ClearITPendingBit(EXTI_Line0); }
void EXTI4_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line4) == SET) { jshPushIOWatchEvent(EV_EXTI4); EXTI_ClearITPendingBit(EXTI_Line4); } }
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) { #ifdef USE_STM3210C_EVAL RCC_OTGFSCLKConfig(RCC_OTGFSCLKSource_PLLVCO_Div3); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_OTG_FS, ENABLE) ; #else // USE_STM32F4_DISCOVERY GPIO_InitTypeDef GPIO_InitStructure; #ifdef USE_USB_OTG_FS RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE); /* Configure SOF VBUS ID DM DP Pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_11 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_OTG_FS) ; GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_OTG_FS) ; GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG_FS) ; GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG_FS) ; /* this for ID line debug */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_OTG_FS) ; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE) ; #else // USE_USB_OTG_HS #ifdef USE_ULPI_PHY // ULPI RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOH | RCC_AHB1Periph_GPIOI, ENABLE); GPIO_PinAFConfig(GPIOA,GPIO_PinSource3, GPIO_AF_OTG2_HS) ; // D0 GPIO_PinAFConfig(GPIOA,GPIO_PinSource5, GPIO_AF_OTG2_HS) ; // CLK GPIO_PinAFConfig(GPIOB,GPIO_PinSource0, GPIO_AF_OTG2_HS) ; // D1 GPIO_PinAFConfig(GPIOB,GPIO_PinSource1, GPIO_AF_OTG2_HS) ; // D2 GPIO_PinAFConfig(GPIOB,GPIO_PinSource5, GPIO_AF_OTG2_HS) ; // D7 GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_OTG2_HS) ; // D3 GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_OTG2_HS) ; // D4 GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_OTG2_HS) ; // D5 GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_HS) ; // D6 GPIO_PinAFConfig(GPIOH,GPIO_PinSource4, GPIO_AF_OTG2_HS) ; // NXT GPIO_PinAFConfig(GPIOI,GPIO_PinSource11,GPIO_AF_OTG2_HS) ; // DIR GPIO_PinAFConfig(GPIOC,GPIO_PinSource0, GPIO_AF_OTG2_HS) ; // STP // CLK GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOA, &GPIO_InitStructure); // D0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStructure); // D1 D2 D3 D4 D5 D6 D7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5 | GPIO_Pin_10 | GPIO_Pin_11| GPIO_Pin_12 | GPIO_Pin_13 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOB, &GPIO_InitStructure); // STP GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOC, &GPIO_InitStructure); //NXT GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOH, &GPIO_InitStructure); //DIR GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOI, &GPIO_InitStructure); RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS | RCC_AHB1Periph_OTG_HS_ULPI, ENABLE) ; #else #ifdef USE_I2C_PHY RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB , ENABLE); /* Configure RESET INTN SCL SDA (Phy/I2C) Pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_OTG2_FS) ; GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_OTG2_FS) ; GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_OTG2_FS) ; GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_OTG2_FS); RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ; #else RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_OTG2_FS) ; GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_FS) ; GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG2_FS) ; GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG2_FS) ; RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ; #endif #endif #endif //USB_OTG_HS #endif //USE_STM322xG_EVAL /* enable the PWR clock */ RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE); #ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT /* Configure the Key button in EXTI mode */ STM32F4_Discovery_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); EXTI_ClearITPendingBit(EXTI_Line18); EXTI_InitStructure.EXTI_Line = EXTI_Line18; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); EXTI_ClearITPendingBit(EXTI_Line18); NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_WKUP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); EXTI_ClearITPendingBit(EXTI_Line18); #endif #ifdef USB_OTG_HS_LOW_PWR_MGMT_SUPPORT /* Configure the Key button in EXTI mode */ STM32F4_Discovery_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); EXTI_ClearITPendingBit(EXTI_Line20); EXTI_InitStructure.EXTI_Line = EXTI_Line20; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); EXTI_ClearITPendingBit(EXTI_Line20); NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_WKUP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); EXTI_ClearITPendingBit(EXTI_Line20); #endif EXTI_ClearITPendingBit(USER_BUTTON_EXTI_LINE); }
/** * @brief This function configures the system to enter Stop mode with RTC * clocked by LSI for current consumption measurement purpose. * STOP Mode with RTC clocked by LSI * ===================================== * - RTC Clocked by LSI * - Regulator in LP mode * - HSI, HSE OFF and LSI OFF if not used as RTC Clock source * - No IWDG * - FLASH in deep power down mode * - Automatic Wakeup using RTC clocked by LSI (~5s) * @param None * @retval None */ void StopMode_Measure(void) { __IO uint32_t index = 0; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RTC_InitTypeDef RTC_InitStructure; RTC_TimeTypeDef RTC_TimeStructure; RTC_AlarmTypeDef RTC_AlarmStructure; /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* The RTC Clock may varies due to LSI frequency dispersion. */ /* Enable the LSI OSC */ RCC_LSICmd(ENABLE); /* Wait till LSI is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Configure all GPIO as analog to reduce current consumption on non used IOs */ /* Enable GPIOs clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOF , ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_Init(GPIOB, &GPIO_InitStructure); /* Disable GPIOs clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA |RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOF, DISABLE); RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; RTC_InitStructure.RTC_AsynchPrediv = 0x7F; RTC_InitStructure.RTC_SynchPrediv = 0x0138; if (RTC_Init(&RTC_InitStructure) == ERROR) { while(1); } /* EXTI configuration */ EXTI_ClearITPendingBit(EXTI_Line17); EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* NVIC configuration */ NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Set the alarm X+5s */ RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_AM; RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = 0x01; RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = 0x00; RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = 0x05; RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31; RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date; RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay; RTC_SetAlarm(RTC_Format_BCD, RTC_Alarm_A, &RTC_AlarmStructure); /* Enable the alarm */ RTC_AlarmCmd(RTC_Alarm_A, ENABLE); /* Enable the RTC Alarm A interrupt */ RTC_ITConfig(RTC_IT_ALRA, ENABLE); /* Set the time to 01h 00mn 00s AM */ RTC_TimeStructure.RTC_H12 = RTC_H12_AM; RTC_TimeStructure.RTC_Hours = 0x01; RTC_TimeStructure.RTC_Minutes = 0x00; RTC_TimeStructure.RTC_Seconds = 0x00; RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure); /* Clear the Alarm A Pending Bit */ RTC_ClearITPendingBit(RTC_IT_ALRA); /* Enter Stop Mode */ PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); /* Initialize LED4 on STM320518-EVAL board */ STM_EVAL_LEDInit(LED4); /* Infinite loop */ while (1) { /* Toggle The LED4 */ STM_EVAL_LEDToggle(LED4); /* Inserted Delay */ for(index = 0; index < 0x5FFFF; index++); } }
/** * @brief System main function. * @param None * @retval None */ void main (void) { SDK_SYSTEM_CONFIG(); #ifdef USE_VCOM #ifdef STM8L SdkEvalComInit(115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,(USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx)); #elif SDK /* VC config */ SdkEvalVCInit(); while(bDeviceState != CONFIGURED); #endif #endif /* Spirit ON */ SpiritEnterShutdown(); SpiritExitShutdown(); SpiritManagementWaExtraCurrent(); #ifdef STM8L /* Manually set the XTAL_FREQUENCY */ SpiritRadioSetXtalFrequency(XTAL_FREQUENCY); /* Initialize the frequency offset variable to compensate XTAL offset */ xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + FREQUENCY_OFFSET; /* Initialize the signals to drive the range extender application board */ RANGE_EXT_INIT(RANGE_TYPE); #elif SDK SpiritManagementIdentificationRFBoard(); /* if the board has eeprom, we can compensate the offset calling SpiritManagementGetOffset (if eeprom is not present this fcn will return 0) */ xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + SpiritManagementGetOffset(); /* Initialize the signals to drive the range extender application board */ SpiritManagementRangeExtInit(); #endif /* Spirit IRQ config */ SpiritGpioInit(&xGpioIRQ); /* Spirit Radio config */ SpiritRadioInit(&xRadioInit); /* Spirit Radio set power */ SpiritRadioSetPALeveldBm(0,POWER_DBM); SpiritRadioSetPALevelMaxIndex(0); /* Spirit Packet config */ SpiritPktStackInit(&xStackInit); //SpiritPktStackAddressesInit(&xAddressInit); SpiritPktStackLlpInit(&xStackLLPInit); /* Spirit IRQs enable */ SpiritIrqDeInit(&xIrqStatus); SpiritIrq(RX_DATA_DISC,S_ENABLE); SpiritIrq(RX_DATA_READY,S_ENABLE); SpiritIrq(TX_DATA_SENT , S_ENABLE); EXTI_ClearITPendingBit(M2S_GPIO_3_EXTI_LINE); SdkEvalM2SGpioInit(M2S_GPIO_3,M2S_MODE_EXTI_IN); /* enable SQI check */ SpiritQiSetSqiThreshold(SQI_TH_0); SpiritQiSqiCheck(S_ENABLE); /* rx timeout config */ SpiritTimerSetRxTimeoutMs(1000.0); //SET_INFINITE_RX_TIMEOUT(); SpiritTimerSetRxTimeoutStopCondition(SQI_ABOVE_THRESHOLD); /* IRQ registers blanking */ SpiritIrqClearStatus(); #ifdef PIGGYBACKING /* payload length config */ SpiritPktStackSetPayloadLength(20); /* write piggybacking data */ SpiritSpiWriteLinearFifo(20, vectcTxBuff); #endif #ifdef STM8L enableInterrupts(); #elif SDK SdkEvalM2SGpioInterruptCmd(M2S_GPIO_3,0x0A,0x0A,ENABLE); #endif /* RX command */ SpiritCmdStrobeRx(); while (1){ } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f30x.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f30x.c file */ /* LEDs Init */ STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); STM_EVAL_LEDInit(LED7); STM_EVAL_LEDInit(LED8); STM_EVAL_LEDInit(LED9); STM_EVAL_LEDInit(LED10); /* Enable PWR APB1 Clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to Backup */ PWR_BackupAccessCmd(ENABLE); /* Reset RTC Domain */ RCC_BackupResetCmd(ENABLE); RCC_BackupResetCmd(DISABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* The RTC Clock may varies due to LSI frequency dispersion */ /* Enable the LSI OSC */ RCC_LSICmd(ENABLE); /* Wait till LSI is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* RTC prescaler configuration */ RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; RTC_InitStructure.RTC_AsynchPrediv = 88; RTC_InitStructure.RTC_SynchPrediv = 470; RTC_Init(&RTC_InitStructure); /* Set the alarm 01h:00min:04s */ RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_AM; RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = 0x01; RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = 0x00; RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = 0x04; RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31; RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date; /* Alarm mask hour, min and second:default Alarm generation each 1s */ RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_All; RTC_SetAlarm(RTC_Format_BCD, RTC_Alarm_A, &RTC_AlarmStructure); /* Enable RTC Alarm A Interrupt */ RTC_ITConfig(RTC_IT_ALRA, ENABLE); /* Enable the alarm */ RTC_AlarmCmd(RTC_Alarm_A, ENABLE); /* Set the date: Wednesday August 15th 2012 */ RTC_DateStructure.RTC_Year = 12; RTC_DateStructure.RTC_Month = RTC_Month_September; RTC_DateStructure.RTC_Date = 11; RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Tuesday; RTC_SetDate(RTC_Format_BCD, &RTC_DateStructure); /* Set the time to 01h 00mn 00s AM */ RTC_TimeStructure.RTC_H12 = RTC_H12_AM; RTC_TimeStructure.RTC_Hours = 0x01; RTC_TimeStructure.RTC_Minutes = 0x00; RTC_TimeStructure.RTC_Seconds = 0x00; RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure); RTC_ClearFlag(RTC_FLAG_ALRAF); /* RTC Alarm A Interrupt Configuration */ /* EXTI configuration */ EXTI_ClearITPendingBit(EXTI_Line17); EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable the RTC Alarm Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Infinite loop */ while (1) { /* Get the RTC current Time */ RTC_GetTime(RTC_Format_BCD, &RTC_TimeStructure); /* Get the RTC current Date */ RTC_GetDate(RTC_Format_BCD, &RTC_DateStructure); /* Display time Format : hh:mm:ss */ sprintf((char*)showtime,"%0.2d:%0.2d:%0.2d",RTC_TimeStructure.RTC_Hours, RTC_TimeStructure.RTC_Minutes, RTC_TimeStructure.RTC_Seconds); /* Display date Format : mm-dd-yy */ sprintf((char*)showdate,"%0.2d-%0.2d-%0.2d",RTC_DateStructure.RTC_Month, RTC_DateStructure.RTC_Date, 2000 + RTC_DateStructure.RTC_Year); } }
///////////////////////////////////// ///@brief Initialize stm32 pin and sensor !!!!!!!!******The EXTI IRQ is in EXTI.c********!!!!! ///////////////////////////////////// void Sensor_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(SENSOR_LIGHT_CLK | SENSOR_GAS_CLK | SENSOR_MOV_CLK | SENSOR_FIRE_CLK | RCC_APB2Periph_AFIO,ENABLE); // GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin=SENSOR_MOV_PIN; GPIO_Init(SENSOR_MOV_GPIO,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=SENSOR_FIRE_PIN; GPIO_Init(SENSOR_FIRE_GPIO,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=SENSOR_LIGHT_PIN; GPIO_Init(SENSOR_LIGHT_GPIO,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=SENSOR_GAS_PIN; GPIO_Init(SENSOR_GAS_GPIO,&GPIO_InitStructure); EXTI_ClearITPendingBit(EXTI_Line(SENSOR_GAS_PIN_NUM));//清除中断标志 GPIO_EXTILineConfig( GPIO_PortSourceGPIOC, GPIO_PinSource(SENSOR_GAS_PIN_NUM)); //引脚映射到外部中断线上 EXTI_ClearITPendingBit(EXTI_Line(SENSOR_FIRE_PIN_NUM)); //清除中断标志 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource(SENSOR_FIRE_PIN_NUM)); //引脚映射到外部中断线上 EXTI_ClearITPendingBit(EXTI_Line(SENSOR_LIGHT_PIN_NUM)); //清除中断标志 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource(SENSOR_LIGHT_PIN_NUM)); //引脚映射到外部中断线上 EXTI_ClearITPendingBit(EXTI_Line(SENSOR_MOV_PIN_NUM)); //清除中断标志 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource(SENSOR_MOV_PIN_NUM)); //引脚映射到外部中断线上 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //模式为中断模式 另一个是事件 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_InitStructure.EXTI_Line=EXTI_Line(SENSOR_MOV_PIN_NUM); EXTI_Init(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line=EXTI_Line(SENSOR_FIRE_PIN_NUM); EXTI_Init(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line=EXTI_Line(SENSOR_LIGHT_PIN_NUM); EXTI_Init(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line=EXTI_Line(SENSOR_GAS_PIN_NUM); EXTI_Init(&EXTI_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //中断组用四位表示,组0:抢占式优先级0位,副优先级4位,。。。。。。组4:抢占式优先级4位,副优先级0位\ // // 取值情况如下表: // The table below gives the allowed values of the pre-emption priority and subpriority according // to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function // ============================================================================================================================ // NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description // ============================================================================================================================ // NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for pre-emption priority // | | | 4 bits for subpriority // ---------------------------------------------------------------------------------------------------------------------------- // NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for pre-emption priority // | | | 3 bits for subpriority // ---------------------------------------------------------------------------------------------------------------------------- // NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for pre-emption priority // | | | 2 bits for subpriority // ---------------------------------------------------------------------------------------------------------------------------- // NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for pre-emption priority // | | | 1 bits for subpriority // ---------------------------------------------------------------------------------------------------------------------------- // NVIC_PriorityGroup_4 | 0-15 | 0 | 4 bits for pre-emption priority // | | | 0 bits for subpriority // ============================================================================================================================ //*/ NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //注意:中断线5~15的中断函数如下,与1~4不同 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //注意:中断线5~15的中断函数如下,与1~4不同 NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //注意:中断线5~15的中断函数如下,与1~4不同 NVIC_Init(&NVIC_InitStructure); }
void EXTI15_10_IRQHandler(void) //---EXTI15_10 IRQ--// { if(EXTI_GetITStatus(EXTI_Line10)) //--EXTI10--// { EXTI_ClearITPendingBit(EXTI_Line10); #ifdef USE_EXTI10 EXTI10_IRQ(); #endif #ifdef USE_ULTRASONIC_EXTI10 pUltExt10->IRQ(); #endif #ifdef USE_CAPTURE_EXIT10 pICPExt10->IRQ(); #endif } if(EXTI_GetITStatus(EXTI_Line11)) //--EXTI11--// { EXTI_ClearITPendingBit(EXTI_Line11); #ifdef USE_EXTI11 EXTI11_IRQ(); #endif #ifdef USE_ULTRASONIC_EXTI11 pUltExt11->IRQ(); #endif #ifdef USE_CAPTURE_EXIT11 pICPExt11->IRQ(); #endif } if(EXTI_GetITStatus(EXTI_Line12)) //--EXTI12--// { EXTI_ClearITPendingBit(EXTI_Line12); #ifdef USE_EXTI12 EXTI12_IRQ(); #endif #ifdef USE_ULTRASONIC_EXTI12 pUltExt12->IRQ(); #endif #ifdef USE_CAPTURE_EXIT12 pICPExt12->IRQ(); #endif } if(EXTI_GetITStatus(EXTI_Line13)) //--EXTI13--// { EXTI_ClearITPendingBit(EXTI_Line13); #ifdef USE_EXTI13 EXTI13_IRQ(); #endif #ifdef USE_ULTRASONIC_EXTI13 pUltExt13->IRQ(); #endif #ifdef USE_CAPTURE_EXIT13 pICPExt13->IRQ(); #endif } if(EXTI_GetITStatus(EXTI_Line14)) //--EXTI14--// { EXTI_ClearITPendingBit(EXTI_Line14); #ifdef USE_EXTI14 EXTI14_IRQ(); #endif #ifdef USE_ULTRASONIC_EXTI14 pUltExt14->IRQ(); #endif #ifdef USE_CAPTURE_EXIT14 pICPExt14->IRQ(); #endif } if(EXTI_GetITStatus(EXTI_Line15)) //--EXTI15--// { EXTI_ClearITPendingBit(EXTI_Line15); #ifdef USE_EXTI15 EXTI15_IRQ(); #endif #ifdef USE_ULTRASONIC_EXTI15 pUltExt15->IRQ(); #endif #ifdef USE_CAPTURE_EXIT15 pICPExt15->IRQ(); #endif } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file */ NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; USART_InitTypeDef USART_InitStructure; /* USARTx configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; STM_EVAL_COMInit(COM1, &USART_InitStructure); /* Output a message on Hyperterminal using printf function */ printf("\n\r *********************** RTC Hardware Calendar Example ***********************\n\r"); if (RTC_ReadBackupRegister(RTC_BKP_DR0) != BKP_VALUE) { /* RTC configuration */ RTC_Config(); /* Configure the RTC data register and RTC prescaler */ RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv; RTC_InitStructure.RTC_SynchPrediv = SynchPrediv; RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; /* Check on RTC init */ if (RTC_Init(&RTC_InitStructure) == ERROR) { printf("\n\r /!\\***** RTC Prescaler Config failed ********/!\\ \n\r"); } /* Configure the time register */ RTC_TimeRegulate(); } else { /* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { printf("\r\n Power On Reset occurred....\n\r"); } /* Check if the Pin Reset flag is set */ else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) { printf("\r\n External Reset occurred....\n\r"); } printf("\n\r No need to configure RTC....\n\r"); /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); #ifdef RTC_CLOCK_SOURCE_LSI /* Enable the LSI OSC */ RCC_LSICmd(ENABLE); #endif /* RTC_CLOCK_SOURCE_LSI */ /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Clear the RTC Alarm Flag */ RTC_ClearFlag(RTC_FLAG_ALRAF); /* Clear the EXTI Line 17 Pending bit (Connected internally to RTC Alarm) */ EXTI_ClearITPendingBit(EXTI_Line17); /* Display the RTC Time and Alarm */ RTC_TimeShow(); RTC_AlarmShow(); } /* Configure the external interrupt "KEY", "SEL" and "UP" buttons */ STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_EXTI); STM_EVAL_PBInit(BUTTON_SEL, BUTTON_MODE_EXTI); STM_EVAL_PBInit(BUTTON_UP, BUTTON_MODE_EXTI); /* Configure LEDs */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); /* Turn LED2 ON */ STM_EVAL_LEDOn(LED2); /* RTC Alarm A Interrupt Configuration */ /* EXTI configuration *********************************************************/ EXTI_ClearITPendingBit(EXTI_Line17); EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable the RTC Alarm Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Infinite loop */ while (1) { } }
/** * @brief Main program * @param None * @retval None */ void RTCTime_Test(void) { uart_init(); /* Output a message on Hyperterminal using printf function */ printf("\n\r *********************** RTC Time Stamp Example ***********************\n\r"); if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2) { /* RTC configuration */ RTC_Config(); /* Configure the RTC data register and RTC prescaler */ RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv; RTC_InitStructure.RTC_SynchPrediv = SynchPrediv; RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; /* Check on RTC init */ if (RTC_Init(&RTC_InitStructure) == ERROR) { printf("\n\r /!\\***** RTC Prescaler Config failed ********/!\\ \n\r"); } /* Configure the time register */ RTC_TimeRegulate(); } else { /* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { printf("\r\n Power On Reset occurred....\n\r"); } /* Check if the Pin Reset flag is set */ else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) { printf("\r\n External Reset occurred....\n\r"); } printf("\r\n No need to configure RTC....\n\r"); /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Clear the RTC Alarm Flag */ RTC_ClearFlag(RTC_FLAG_ALRAF); /* Clear the EXTI Line 17 Pending bit (Connected internally to RTC Alarm) */ EXTI_ClearITPendingBit(EXTI_Line17); /* Display the RTC Time/Date and TimeStamp Time/Date */ RTC_TimeShow(); RTC_DateShow(); RTC_TimeStampShow(); } PUTOUT_KeyInit(); while (1) { } }
/** * @brief This function handles External lines 15 to 10 interrupt request. * @param None * @retval None */ void EXTI15_10_IRQHandler(void) { /* Checks whether the IOE EXTI line is asserted or not */ if(EXTI_GetITStatus(IOE_IT_EXTI_LINE) != RESET) { #ifdef IOE_INTERRUPT_MODE /* Check if the interrupt source is the Touch Screen */ if (IOE_GetGITStatus(IOE_1_ADDR, IOE_TS_IT) & IOE_TS_IT) { static TS_STATE* TS_State; /* Update the structure with the current position */ TS_State = IOE_TS_GetState(); if ((TS_State->TouchDetected) && (TS_State->Y < 220) && (TS_State->Y > 180)) { if ((TS_State->X > 10) && (TS_State->X < 70)) { LCD_DisplayStringLine(Line6, " LD4 "); STM_EVAL_LEDOn(LED4); } else if ((TS_State->X > 90) && (TS_State->X < 150)) { LCD_DisplayStringLine(Line6, " LD3 "); STM_EVAL_LEDOn(LED3); } else if ((TS_State->X > 170) && (TS_State->X < 230)) { LCD_DisplayStringLine(Line6, " LD2 "); STM_EVAL_LEDOn(LED2); } else if ((TS_State->X > 250) && (TS_State->X < 310)) { LCD_DisplayStringLine(Line6, " LD1 "); STM_EVAL_LEDOn(LED1); } } else { STM_EVAL_LEDOff(LED1); STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } /* Clear the interrupt pending bits */ IOE_ClearGITPending(IOE_1_ADDR, IOE_TS_IT); } #ifdef USE_STM3210C_EVAL else if (IOE_GetGITStatus(IOE_2_ADDR, IOE_GIT_GPIO)) { static JOY_State_TypeDef JoyState = JOY_NONE; /* Get the Joystick State */ JoyState = IOE_JoyStickGetState(); switch (JoyState) { case JOY_NONE: LCD_DisplayStringLine(Line5, "JOY: IT ---- "); break; case JOY_UP: LCD_DisplayStringLine(Line5, "JOY: IT UP "); break; case JOY_DOWN: LCD_DisplayStringLine(Line5, "JOY: IT DOWN "); break; case JOY_LEFT: LCD_DisplayStringLine(Line5, "JOY: IT LEFT "); break; case JOY_RIGHT: LCD_DisplayStringLine(Line5, "JOY: IT RIGHT "); break; case JOY_CENTER: LCD_DisplayStringLine(Line5, "JOY: IT CENTER "); break; default: LCD_DisplayStringLine(Line5, "JOY: IT ERROR "); break; } /* Clear the interrupt pending bits */ IOE_ClearGITPending(IOE_2_ADDR, IOE_GIT_GPIO); IOE_ClearIOITPending(IOE_2_ADDR, IOE_JOY_IT); } /* CLear all pending interrupt */ IOE_ClearGITPending(IOE_2_ADDR, ALL_IT); IOE_ClearIOITPending(IOE_2_ADDR, IOE_JOY_IT); #endif /* USE_STM3210C_EVAL */ /* CLear all pending interrupt */ IOE_ClearGITPending(IOE_1_ADDR, ALL_IT); #endif /* IOE_INTERRUPT_MODE */ EXTI_ClearITPendingBit(IOE_IT_EXTI_LINE); } }
/** * @brief EXTI0_IRQHandler * This function handles External line 0 interrupt request. * @param None * @retval None */ void EXTI0_IRQHandler(void) { /* Clears the EXTI's line pending bit.*/ EXTI_ClearITPendingBit(EXTI_Line0); }
/** * @brief This function handles External line 1 interrupt request. * @param None * @retval None */ void EXTI1_IRQHandler(void) { EXTI_ClearITPendingBit(EXTI_Line1); }
void HAL_Interrupts_Attach(uint16_t pin, HAL_InterruptHandler handler, void* data, InterruptMode mode, HAL_InterruptExtraConfiguration* config) { uint8_t GPIO_PortSource = 0; //variable to hold the port number //EXTI structure to init EXT EXTI_InitTypeDef EXTI_InitStructure = {0}; //NVIC structure to set up NVIC controller NVIC_InitTypeDef NVIC_InitStructure = {0}; //Map the Spark pin to the appropriate port and pin on the STM32 STM32_Pin_Info* PIN_MAP = HAL_Pin_Map(); GPIO_TypeDef *gpio_port = PIN_MAP[pin].gpio_peripheral; uint16_t gpio_pin = PIN_MAP[pin].gpio_pin; uint8_t GPIO_PinSource = PIN_MAP[pin].gpio_pin_source; //Clear pending EXTI interrupt flag for the selected pin EXTI_ClearITPendingBit(gpio_pin); //Select the port source if (gpio_port == GPIOA) { GPIO_PortSource = 0; } else if (gpio_port == GPIOB) { GPIO_PortSource = 1; } else if (gpio_port == GPIOC) { GPIO_PortSource = 2; } else if (gpio_port == GPIOD) { GPIO_PortSource = 3; } // Register the handler for the user function name if (config && config->version >= HAL_INTERRUPT_EXTRA_CONFIGURATION_VERSION_2 && config->keepHandler) { // keep the old handler } else { exti_channels[GPIO_PinSource].fn = handler; exti_channels[GPIO_PinSource].data = data; } //Connect EXTI Line to appropriate Pin SYSCFG_EXTILineConfig(GPIO_PortSource, GPIO_PinSource); //Configure GPIO EXTI line EXTI_InitStructure.EXTI_Line = gpio_pin;//EXTI_Line; //select the interrupt mode EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; switch (mode) { //case LOW: //There is no LOW mode in STM32, so using falling edge as default //EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //break; case CHANGE: //generate interrupt on rising or falling edge EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; break; case RISING: //generate interrupt on rising edge EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; break; case FALLING: //generate interrupt on falling edge EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; break; } //enable EXTI line EXTI_InitStructure.EXTI_LineCmd = ENABLE; //send values to registers EXTI_Init(&EXTI_InitStructure); //configure NVIC //select NVIC channel to configure NVIC_InitStructure.NVIC_IRQChannel = GPIO_IRQn[GPIO_PinSource]; if (config == NULL) { NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 14; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; } else { NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = config->IRQChannelPreemptionPriority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = config->IRQChannelSubPriority; // Keep the same priority if (config->version >= HAL_INTERRUPT_EXTRA_CONFIGURATION_VERSION_2) { if (config->keepPriority) { uint32_t priorityGroup = NVIC_GetPriorityGrouping(); uint32_t priority = NVIC_GetPriority(NVIC_InitStructure.NVIC_IRQChannel); uint32_t p, sp; NVIC_DecodePriority(priority, priorityGroup, &p, &sp); NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = p; NVIC_InitStructure.NVIC_IRQChannelSubPriority = sp; } } } //enable IRQ channel NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //update NVIC registers NVIC_Init(&NVIC_InitStructure); }
/** * @brief Main program * @param None * @retval None */ int main(void) { NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s) before to branch to application main. */ /* Configure the external interrupt "WAKEUP" and "TAMPER" buttons */ STM_EVAL_PBInit(BUTTON_TAMPER , BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_WAKEUP , BUTTON_MODE_GPIO); /* Initialize the LCD */ LCD_Init(); /* Configure the LCD Log Module */ LCD_LOG_Init(); LCD_LOG_SetHeader((uint8_t*)"RTC Backup Domain Example"); LCD_LOG_SetFooter ((uint8_t*)" Copyright (c) STMicroelectronics" ); /* Display the default RCC BDCR and RTC TAFCR Registers */ LCD_UsrLog ("Entry Point \n"); LCD_UsrLog ("RCC BDCR = 0x%x\n", RCC->BDCR); LCD_UsrLog ("RTC TAFCR = 0x%x\n", RTC->TAFCR); /* Enable the PWR APB1 Clock Interface */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* Enable the RTC Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* EXTI configuration */ EXTI_ClearITPendingBit(EXTI_Line22); EXTI_InitStructure.EXTI_Line = EXTI_Line22; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); if(RTC_ReadBackupRegister(RTC_BKP_DR0) != FIRST_DATA) { LCD_UsrLog ("RTC Config PLZ Wait. \n"); /* RTC Configuration */ RTC_Config(); /* Adjust Current Time */ Time_Adjust(); /* Adjust Current Date */ Date_Adjust(); } else { /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); RTC_ClearITPendingBit(RTC_IT_WUT); EXTI_ClearITPendingBit(EXTI_Line22); /* Backup SRAM ***************************************************************/ /* Enable BKPSRAM Clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE); /* Check the written Data */ for (uwIndex = 0x0; uwIndex < 0x1000; uwIndex += 4) { if ((*(__IO uint32_t *) (BKPSRAM_BASE + uwIndex)) != uwIndex) { uwErrorIndex++; } } if(uwErrorIndex) { LCD_ErrLog ("BKP SRAM Number of errors = %d\n", uwErrorIndex); } else { LCD_UsrLog ("BKP SRAM Content OK \n"); } /* RTC Backup Data Registers **************************************************/ /* Check if RTC Backup DRx registers data are correct */ if (CheckBackupReg(FIRST_DATA) == 0x00) { /* OK, RTC Backup DRx registers data are correct */ LCD_UsrLog ("OK, RTC Backup DRx registers data are correct. \n"); } else { /* Error, RTC Backup DRx registers data are not correct */ LCD_ErrLog ("RTC Backup DRx registers data are not correct\n"); } } while (1) { /* Infinite loop */ Calendar_Show(); } }
void M2S_GPIO_3_EXTI_IRQ_HANDLER(void) #endif { /* Check the flag status of EXTI line */ if(EXTI_GetITStatus(M2S_GPIO_3_EXTI_LINE)){ /* Get the IRQ status */ SpiritIrqGetStatus(&xIrqStatus); /* Check the SPIRIT RX_DATA_DISC IRQ flag */ if(xIrqStatus.IRQ_RX_DATA_DISC) { SpiritCmdStrobeRx() SdkEvalLedToggle(LED1); } /* Check the SPIRIT TX_DATA_SENT IRQ flag for the acknoledgement */ if(xIrqStatus.IRQ_TX_DATA_SENT) { // SdkEvalLedToggle(LED1); #ifdef PIGGYBACKING SpiritSpiWriteLinearFifo(20, vectcTxBuff); printf("Loaded piggybacking data: ["); for(uint8_t i=0 ; i<20 ; i++) printf("%d ", vectcTxBuff[i]); printf("]\n\r"); #endif SpiritCmdStrobeRx(); } /* Check the SPIRIT RX_DATA_READY IRQ flag */ if(xIrqStatus.IRQ_RX_DATA_READY) { /* Get the RX FIFO size */ cRxData=SpiritLinearFifoReadNumElementsRxFifo(); /* Read the RX FIFO */ SpiritSpiReadLinearFifo(cRxData, vectcRxBuff); /* Flush the RX FIFO */ SpiritCmdStrobeFlushRxFifo(); /* A simple way to control if the received data sequence is correct (in this case LED2 will toggle) */ { SpiritBool correct=S_TRUE; for(uint8_t i=0 ; i<cRxData ; i++) if(vectcRxBuff[i] != i+1) correct=S_FALSE; if(correct) SdkEvalLedToggle(LED2); } #ifdef USE_VCOM /* print the received data */ printf("B data received: ["); for(uint8_t i=0 ; i<cRxData ; i++) printf("%d ", vectcRxBuff[i]); printf("]\r\n"); #endif } /* Clear the EXTI line flag */ EXTI_ClearITPendingBit(M2S_GPIO_3_EXTI_LINE); } }
/** * @brief Send a CEC frame. * @param InitiatorAddress: the initiator address: from 0 to 15. * @param FollowerAddress: the follower address: from 0 to 15. * @param MessageLength: the number of data byte to send. * @param Message: a pointer to the transmit buffer. * @retval : The status of the transmission. It can be: * SUCCESS: If the follower received the frame. * ERROR: If the follower doesn't received the frame. */ ErrorStatus CEC_SendFrame(uint8_t InitiatorAddress, uint8_t FollowerAddress, uint8_t MessageLength, uint8_t* Message ) { uint8_t i=0; uint8_t HeaderBlockValueToSend = 0; NVIC_InitTypeDef NVIC_InitStructure; cec_last_byte=0; /* Build the Header block to send */ HeaderBlockValueToSend = (((InitiatorAddress&0xF)<<4) | (FollowerAddress&0xF)); /* Disable EXTI0 global interrupt to avoid the EXTI to enter EXTI0 interrupt while transmitting a frame */ NVIC_DisableIRQ(EXTI0_IRQn); /* Send start bit */ CEC_SendStartBit(); /* Send initiator and follower addresses. If the Header block is not transmitted successfully then exit and return error */ if (CEC_SendByte(HeaderBlockValueToSend)== ERROR) { /* Clear EXTI line 0 pending bit */ EXTI_ClearITPendingBit(EXTI_Line0); /* Clear EXTI line 0 global interrupt pending bit */ NVIC_ClearPendingIRQ( EXTI0_IRQn ); /* Enable EXTI Line 0 global interrupt */ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Exit and return send failed */ return ERROR; } /* Send data bytes */ for(i=0;i< MessageLength;i++) { if (i==(MessageLength-1)) { cec_last_byte=1; } /* Send data byte and check if the follower sent the ACK bit = 0 */ if (CEC_SendByte(Message[i]) == ERROR) { /* Clear EXTI line 0 pending bit */ EXTI_ClearITPendingBit(EXTI_Line0); /* Clear EXTI line 0 global interrupt pending bit */ NVIC_ClearPendingIRQ( EXTI0_IRQn ); /* Enable EXTI Line 0 global interrupt */ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Exit and return send failed */ return ERROR; } } /* Clear EXTI line 0 pending bit */ EXTI_ClearITPendingBit(EXTI_Line0); /* Clear EXTI line 0 global interrupt pending bit */ NVIC_ClearPendingIRQ( EXTI0_IRQn ); /* Enable EXTI Line 0 global interrupt */ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Exit and return send succeeded */ return SUCCESS; }
/** * @brief RTC Tamper Configuration.. * @param None * @retval None */ static void RTC_Config(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* Reset Backup Domain */ RCC_BackupResetCmd(ENABLE); RCC_BackupResetCmd(DISABLE); /* Enable the LSE OSC */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RTC_DeInit(); /* Configure the RTC data register and RTC prescaler */ RTC_InitStructure.RTC_AsynchPrediv = 0x7F; RTC_InitStructure.RTC_SynchPrediv = 0xFF; RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; RTC_Init(&RTC_InitStructure); /* Set the time to 00h 00mn 00s AM */ RTC_TimeStruct.RTC_H12 = RTC_H12_AM; RTC_TimeStruct.RTC_Hours = 0x00; RTC_TimeStruct.RTC_Minutes = 0x00; RTC_TimeStruct.RTC_Seconds = 0x00; RTC_SetTime(RTC_Format_BCD, &RTC_TimeStruct); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* EXTI configuration *******************************************************/ EXTI_ClearITPendingBit(EXTI_Line19); EXTI_InitStructure.EXTI_Line = EXTI_Line19; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable RTC_IRQn */ NVIC_InitStructure.NVIC_IRQChannel = TAMPER_STAMP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* determines the number of active pulse for the specific level */ RTC_TamperFilterConfig(RTC_TamperFilter_2Sample); /* Determines the frequency at which each of the tamper inputs are sampled */ RTC_TamperSamplingFreqConfig(RTC_TamperSamplingFreq_RTCCLK_Div32768); RTC_TamperPullUpCmd(DISABLE); /* Select the tamper 21 with High level */ RTC_TamperTriggerConfig(RTC_Tamper_1, RTC_TamperTrigger_HighLevel ); /* Clear tamper 1 falg */ RTC_ClearFlag(RTC_FLAG_TAMP1F); }
/** * @brief Configure the RTC peripheral by selecting the clock source. * @param None * @retval None */ void RTC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG , ENABLE); /* Allow access to RTC */ //PWR_RTCAccessCmd(ENABLE); //Enable the LSE OSC RCC_LSEConfig(RCC_LSE_ON); //wait until LSE is ready while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} //Select RTC clk source RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //SynchPrediv = 0xFF; //AsynchPrediv = 0x7F; /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); RTC_InitStructure.RTC_AsynchPrediv = 0x7F; RTC_InitStructure.RTC_SynchPrediv = 0xFF; /* (32KHz / 128) - 1 = 0xFF*/ RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; RTC_Init(&RTC_InitStructure); RTC_WakeUpCmd(DISABLE); /* EXTI configuration *******************************************************/ EXTI_ClearITPendingBit(EXTI_Line20); EXTI_InitStructure.EXTI_Line = EXTI_Line20; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable the RTC Wakeup Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_SetPriority(RTC_WKUP_IRQn, INT_PRIORITY_WKUP); //RTCCLK=32768Hz ; div=16 =>2048Hz RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16); //div 256 =>8Hz ~ 125ms RTC_SetWakeUpCounter(0xFF); RTC_ClearITPendingBit(RTC_IT_WUT); EXTI_ClearITPendingBit(EXTI_Line20); /* Enable the RTC Wakeup Interrupt */ RTC_ITConfig(RTC_IT_WUT, ENABLE); /* Enable Wakeup Counter */ RTC_WakeUpCmd(ENABLE); //PWR_RTCAccessCmd(DISABLE); //disable PWR clock //RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, DISABLE); }
/** * @brief Configure the RTC peripheral by selecting the clock source. * @param None * @retval None */ void RTC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* Reset BKP Domain */ RCC_BackupResetCmd(ENABLE); RCC_BackupResetCmd(DISABLE); #if defined (RTC_CLOCK_SOURCE_LSI) /* LSI used as RTC source clock*/ /* The RTC Clock may varies due to LSI frequency dispersion. */ /* Enable the LSI OSC */ RCC_LSICmd(ENABLE); /* Wait till LSI is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); #elif defined (RTC_CLOCK_SOURCE_LSE) /* LSE used as RTC source clock */ /* Enable the LSE OSC */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); #else #error Please select the RTC Clock source inside the main.c file #endif /* RTC_CLOCK_SOURCE_LSI */ /* Enable The external line21 interrupt */ EXTI_ClearITPendingBit(EXTI_Line21); EXTI_InitStructure.EXTI_Line = EXTI_Line21; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable TAMPER IRQChannel */ NVIC_InitStructure.NVIC_IRQChannel = TAMP_STAMP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Disable the Tamper 1 detection */ RTC_TamperCmd(RTC_Tamper_1, DISABLE); /* Clear Tamper 1 pin Event(TAMP1F) pending flag */ RTC_ClearFlag(RTC_FLAG_TAMP1F); /* Configure the Tamper 1 Trigger */ RTC_TamperTriggerConfig(RTC_Tamper_1, RTC_TamperTrigger_FallingEdge); /* Enable the Tamper interrupt */ RTC_ITConfig(RTC_IT_TAMP, ENABLE); /* Clear Tamper 1 pin interrupt pending bit */ RTC_ClearITPendingBit(RTC_IT_TAMP1); /* Enable the Tamper 1 detection */ RTC_TamperCmd(RTC_Tamper_1, ENABLE); }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file */ /* USARTx configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; STM_EVAL_COMInit(COM1, &USART_InitStructure); /* GPIOC Periph clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); /* Output a message on Hyperterminal using printf function */ printf("\n\r *********************** RTC Time Stamp Example ***********************\n\r"); if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2) { /* RTC configuration */ RTC_Config(); /* Configure the RTC data register and RTC prescaler */ RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv; RTC_InitStructure.RTC_SynchPrediv = SynchPrediv; RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; /* Check on RTC init */ if (RTC_Init(&RTC_InitStructure) == ERROR) { printf("\n\r /!\\***** RTC Prescaler Config failed ********/!\\ \n\r"); } /* Configure the time register */ RTC_TimeRegulate(); } else { /* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { printf("\r\n Power On Reset occurred....\n\r"); } /* Check if the Pin Reset flag is set */ else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) { printf("\r\n External Reset occurred....\n\r"); } printf("\r\n No need to configure RTC....\n\r"); /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Clear the RTC Alarm Flag */ RTC_ClearFlag(RTC_FLAG_ALRAF); /* Clear the EXTI Line 17 Pending bit (Connected internally to RTC Alarm) */ EXTI_ClearITPendingBit(EXTI_Line17); /* Display the RTC Time/Date and TimeStamp Time/Date */ RTC_TimeShow(); RTC_DateShow(); RTC_TimeStampShow(); } /* Configure the external interrupt "TAMPER" and "Joystick SEL" buttons */ STM_EVAL_PBInit(BUTTON_TAMPER, BUTTON_MODE_EXTI); STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_EXTI); STM_EVAL_PBInit(BUTTON_SEL, BUTTON_MODE_EXTI); /* Configure LED1 */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDOn(LED1); /* Infinite loop */ while (1) { } }
/** * @brief Initialize the IO * @return none */ static void platform_misc_port_init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); PWR_BackupAccessCmd(ENABLE);//允许修改RTC 和后备寄存器 RCC_LSICmd(DISABLE);//关闭外部低速外部时钟信号功能 后,PC14 PC15 才可以当普通IO用。 BKP_TamperPinCmd(DISABLE);//关闭入侵检测功能,也就是 PC13,也可以当普通IO 使用 //USB_CHK -- PC.13 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Connect EXTI Line13 to PC.13 */ GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13); EXTI_ClearITPendingBit(EXTI_Line13); EXTI_InitStructure.EXTI_Line = EXTI_Line13; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); EXTI_GenerateSWInterrupt(EXTI_Line13); //ChargeState detect -- PC.14 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Connect EXTI Line14 to PC.14 */ //GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource14); //EXTI_ClearITPendingBit(EXTI_Line14); //EXTI_InitStructure.EXTI_Line = EXTI_Line14; //EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //EXTI_InitStructure.EXTI_LineCmd = ENABLE; //EXTI_Init(&EXTI_InitStructure); //EXTI_GenerateSWInterrupt(EXTI_Line14); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); charge_detect_io_cnt = 0; last_charge_detect_io_cnt = 1; //LED-Red -- PA.4 LED-Green -- PA.5 LED-Yellow -- PA.6 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6); //Beep -- PB.5 Trig -- PB.12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_12); GPIO_ResetBits(GPIOB, GPIO_Pin_5); //RFU-IO2 -- PB.8 //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //GPIO_Init(GPIOB, &GPIO_InitStructure); }
/** * @brief This function handles External lines 4 to 15 interrupt request. * @param None * @retval None */ void EXTI4_15_IRQHandler(void) { uint32_t tmp = 0, tmp1 = 0; uint8_t index = 0; if((EXTI_GetITStatus(LEFT_BUTTON_EXTI_LINE) != RESET)) { /* Set the LCD Back Color */ LCD_SetBackColor(White); StartEvent = 0; /* Reset Counter*/ RTCAlarmCount = 0; /* Disable the alarm */ RTC_AlarmCmd(RTC_Alarm_A, DISABLE); /* Display Char on the LCD : XXX% */ LCD_DisplayChar(40,110,0x30); LCD_DisplayChar(40,88, 0x30); LCD_DisplayChar(40,66, 0x30); LCD_DisplayChar(40,44, 0x25); for (index = 0; index < 100 ; index++) { if ((index % 2) ==0) { /* Set the LCD Text Color */ LCD_SetTextColor(Blue); LCD_DrawLine(70 + (index/2) , 120 - (index/2) , 101 - (index + 1) ,Horizontal); /* Set the LCD Text Color */ LCD_SetTextColor(White); LCD_DrawLine(170 - (index/2) , 120 - (index/2) , 101 - (index + 1) ,Horizontal); } } /* Displays MESSAGE6 on line 5 */ LCD_SetFont(&Font12x12); /* Set the LCD Back Color */ LCD_SetBackColor(Blue); LCD_SetTextColor(White); LCD_DisplayStringLine(LINE(19), (uint8_t *)MESSAGE6); LCD_SetFont(&Font16x24); /* Set the LCD Text Color */ LCD_SetTextColor(Black); /* Clear the EXTI pending bit */ EXTI_ClearITPendingBit(LEFT_BUTTON_EXTI_LINE); } else if (EXTI_GetITStatus(RIGHT_BUTTON_EXTI_LINE) != RESET) { if(StartEvent == 8) { StartEvent = 0; /* Enable the alarmA */ RTC_AlarmCmd(RTC_Alarm_A, DISABLE); /* Displays MESSAGE4 on line 5 */ LCD_SetFont(&Font12x12); /* Set the LCD Back Color */ LCD_SetBackColor(Blue); LCD_SetTextColor(White); LCD_DisplayStringLine(LINE(19), (uint8_t *)MESSAGE4); LCD_SetFont(&Font16x24); /* Set the LCD Text Color */ LCD_SetTextColor(Black); } else { /* Displays MESSAGE5 on line 5 */ LCD_SetFont(&Font12x12); /* Set the LCD Back Color */ LCD_SetBackColor(Blue); LCD_SetTextColor(White); LCD_DisplayStringLine(LINE(19), (uint8_t *)MESSAGE5); LCD_SetFont(&Font16x24); /* Set the LCD Back Color */ LCD_SetBackColor(White); /* Enable the alarmA */ RTC_AlarmCmd(RTC_Alarm_A, ENABLE); StartEvent = 8; } /* Clear the EXTI pending bit */ EXTI_ClearITPendingBit(RIGHT_BUTTON_EXTI_LINE); } else if(EXTI_GetITStatus(DOWN_BUTTON_EXTI_LINE) != RESET) { if(RTCAlarmCount == 0) { SecondNumb--; if(SecondNumb < 15) SecondNumb = 15; tmp = (uint32_t) (SecondNumb/60); tmp1 = SecondNumb -(tmp*60); LCD_SetFont(&Font16x24); /* Set the LCD text color */ LCD_SetTextColor(Blue); /* Set the LCD Back Color */ LCD_SetBackColor(White); LCD_DisplayStringLine(95, " "); /* Display Char on the LCD : XXX% */ LCD_DisplayChar(95,294, (tmp / 10) +0x30); LCD_DisplayChar(95,278, (tmp % 10 ) +0x30); LCD_DisplayChar(95,262, ':'); LCD_DisplayChar(95,246, (tmp1 / 10) +0x30); LCD_DisplayChar(95,230, (tmp1 % 10 ) +0x30); } /* Clear the EXTI pending bit */ EXTI_ClearITPendingBit(DOWN_BUTTON_EXTI_LINE); } else if (EXTI_GetITStatus(UP_BUTTON_EXTI_LINE) != RESET) { if(RTCAlarmCount == 0) { SecondNumb++; tmp = (uint32_t) (SecondNumb/60); tmp1 = SecondNumb -(tmp*60); LCD_SetFont(&Font16x24); /* Set the LCD text color */ LCD_SetTextColor(Blue); /* Set the LCD Back Color */ LCD_SetBackColor(White); LCD_DisplayStringLine(95, " "); /* Display Char on the LCD : XXX% */ LCD_DisplayChar(95,294, (tmp / 10) +0x30); LCD_DisplayChar(95,278, (tmp % 10 ) +0x30); LCD_DisplayChar(95,262, ':'); LCD_DisplayChar(95,246, (tmp1 / 10) +0x30); LCD_DisplayChar(95,230, (tmp1 % 10 ) +0x30); } /* Clear the EXTI pending bit */ EXTI_ClearITPendingBit(UP_BUTTON_EXTI_LINE); } }
void USBWakeUp_IRQHandler(void) #endif { EXTI_ClearITPendingBit(EXTI_Line18); }
void EXTI9_5_IRQHandler(void) { delay_ms(10); //消抖 if(KEY0==0) LED=0; EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE5上的中断标志位 }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files (startup_stm32f40xx.s/startup_stm32f427x.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f4xx.c file */ /* Configure the external interrupt "WAKEUP" and "TAMPER" buttons */ STM_EVAL_PBInit(BUTTON_TAMPER , BUTTON_MODE_EXTI); STM_EVAL_PBInit(BUTTON_WAKEUP , BUTTON_MODE_EXTI); /* Initialize LEDs and LCD available on EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); /* Initialize the LCD */ LCD_Init(); LCD_Clear(LCD_COLOR_WHITE); /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_BLUE); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_WHITE); LCD_DisplayStringLine(LCD_LINE_0,(uint8_t *) " TimeStamp Example " ); LCD_SetFont(&Font12x12); if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2) { /* RTC configuration */ RTC_Config(); /* Configure the time&date register */ RTC_TimeRegulate(); /* Display the Date and Time */ RTC_DateShow(); RTC_TimeShow(); } else { /* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_WHITE); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_2,(uint8_t *) "Power On Reset occurred " ); } /* Check if the Pin Reset flag is set */ else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) { /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_WHITE); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_2,(uint8_t *) "External Reset occurred " ); } /* Set the Back Color */ LCD_SetBackColor(LCD_COLOR_WHITE); /* Set the Text Color */ LCD_SetTextColor(LCD_COLOR_GREEN); LCD_DisplayStringLine(LCD_LINE_3,(uint8_t *) "No need to configure RTC " ); /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); /* Clear the RTC Alarm Flag */ RTC_ClearFlag(RTC_FLAG_ALRAF); /* Clear the EXTI Line 17 Pending bit (Connected internally to RTC Alarm) */ EXTI_ClearITPendingBit(EXTI_Line17); /* Display the RTC Time/Date and TimeStamp Time/Date */ RTC_DateShow(); RTC_TimeShow(); } while (1) { } }
void EXTI15_10_IRQHandler(void) { delay_ms(10); //消抖 if(KEY1==0)LED=1; EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE15线路挂起位 }
void RTCAlarm_IRQHandler(void) { EXTI_ClearITPendingBit(EXTI_Line17); }
void EXTI3_IRQHandler(void) { process_deca_irq(); /* Clear EXTI Line 3 Pending Bit */ EXTI_ClearITPendingBit(EXTI_Line3); }