void systemInit(void) { // Configure NVIC preempt/priority groups NVIC_PriorityGroupConfig(NVIC_PRIORITY_GROUPING); #ifdef STM32F10X // Turn on clocks for stuff we use RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); #endif // cache RCC->CSR value to use it in isMPUSoftreset() and others cachedRccCsrValue = RCC->CSR; RCC_ClearFlag(); enableGPIOPowerUsageAndNoiseReductions(); #ifdef STM32F10X // Turn off JTAG port 'cause we're using the GPIO for leds #define AFIO_MAPR_SWJ_CFG_NO_JTAG_SW (0x2 << 24) AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_NO_JTAG_SW; #endif // Init cycle counter cycleCounterInit(); memset(&exti15_10_handlers, 0x00, sizeof(exti15_10_handlers)); // SysTick SysTick_Config(SystemCoreClock / 1000); }
bool platform_watchdog_check_last_reset( void ) { boot_reason=0; if(RCC_GetFlagStatus(RCC_FLAG_SFTRST)) {//Software Reset boot_reason=BOOT_REASON_SOFT_RST; } else if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)) { boot_reason=BOOT_REASON_WDG_RST; } else if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)) { boot_reason=BOOT_REASON_WWDG_RST; } else if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST)) { boot_reason=BOOT_REASON_LOWPWR_RST; } else if(RCC_GetFlagStatus(RCC_FLAG_BORRST)) { boot_reason=BOOT_REASON_BOR_RST; } else if(RCC_GetFlagStatus(RCC_FLAG_PORRST)) {//Power-On-Reset boot_reason=BOOT_REASON_PWRON_RST; } else if(RCC_GetFlagStatus(RCC_FLAG_PINRST)) {//Always set, test other cases first boot_reason=BOOT_REASON_EXPIN_RST; } //cli_printf("boot_reason:%d\r\n",boot_reason); RCC_ClearFlag(); return true; }
/** * @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_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ /* Initialize LED1 and Key Button mounted on STM3210X-EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_EXTI); /* Check if the system has resumed from WWDG reset */ if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET) { /* WWDGRST flag set */ /* Turn on LED1 */ STM_EVAL_LEDOn(LED1); /* Clear reset flags */ RCC_ClearFlag(); } else { /* WWDGRST flag is not set */ /* Turn off LED1 */ STM_EVAL_LEDOff(LED1); } /* NVIC configuration */ NVIC_Configuration(); /* WWDG configuration */ /* Enable WWDG clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); /* On Value line devices, WWDG clock counter = (PCLK1 (24MHz)/4096)/8 = 732 Hz (~1366 æs) */ /* On other devices, WWDG clock counter = (PCLK1(36MHz)/4096)/8 = 1099 Hz (~910 æs) */ WWDG_SetPrescaler(WWDG_Prescaler_8); /* Set Window value to 65 */ WWDG_SetWindowValue(65); /* On Value line devices, Enable WWDG and set counter value to 127, WWDG timeout = ~1366 æs * 64 = 87.42 ms */ /* On other devices, Enable WWDG and set counter value to 127, WWDG timeout = ~910 æs * 64 = 58.25 ms */ WWDG_Enable(127); /* Clear EWI flag */ WWDG_ClearFlag(); /* Enable EW interrupt */ WWDG_EnableIT(); while (1) { } }
void systemInit(void) { #ifdef CC3D /* Accounts for OP Bootloader, set the Vector Table base address as specified in .ld file */ extern void *isr_vector_table_base; NVIC_SetVectorTable((uint32_t)&isr_vector_table_base, 0x0); #endif // Configure NVIC preempt/priority groups NVIC_PriorityGroupConfig(NVIC_PRIORITY_GROUPING); #ifdef STM32F10X // Turn on clocks for stuff we use RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); #endif RCC_ClearFlag(); enableGPIOPowerUsageAndNoiseReductions(); #ifdef STM32F10X // Turn off JTAG port 'cause we're using the GPIO for leds #define AFIO_MAPR_SWJ_CFG_NO_JTAG_SW (0x2 << 24) AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_NO_JTAG_SW; #endif // Init cycle counter cycleCounterInit(); // SysTick SysTick_Config(SystemCoreClock / 1000); }
void systemInit(void) { checkForBootLoaderRequest(); SetSysClock(); // Configure NVIC preempt/priority groups NVIC_PriorityGroupConfig(NVIC_PRIORITY_GROUPING); // cache RCC->CSR value to use it in isMPUSoftreset() and others cachedRccCsrValue = RCC->CSR; /* Accounts for OP Bootloader, set the Vector Table base address as specified in .ld file */ extern void *isr_vector_table_base; NVIC_SetVectorTable((uint32_t)&isr_vector_table_base, 0x0); RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, DISABLE); RCC_ClearFlag(); enableGPIOPowerUsageAndNoiseReductions(); // Init cycle counter cycleCounterInit(); memset(extiHandlerConfigs, 0x00, sizeof(extiHandlerConfigs)); // SysTick SysTick_Config(SystemCoreClock / 1000); }
/** * @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_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ /* Initialize Leds mounted on STM3210X-EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Enable PWR and BKP clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Enable write access to Backup domain */ PWR_BackupAccessCmd(ENABLE); /* Clear Tamper pin Event(TE) pending flag */ BKP_ClearFlag(); /* Check if the Power On Reset flag is set */ if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { /* Clear reset flags */ RCC_ClearFlag(); /* Turn on LED3 */ STM_EVAL_LEDOn(LED3); /* Check if Backup data registers are programmed */ if(CheckBackupReg(0x3210) == 0x00) { /* Backup data registers values are correct */ /* Turn on LED1 */ STM_EVAL_LEDOn(LED1); } else { /* Backup data registers values are not correct or they are not yet programmed (when the first time the program is executed) */ /* Write data to Backup data registers */ WriteToBackupReg(0x3210); /* Turn on LED2 */ STM_EVAL_LEDOn(LED2); } } /* Turn on LED4 */ STM_EVAL_LEDOn(LED4); while (1) { } }
/******************************************************************************* * Function Name : main * Description : Main program. * Input : None * Output : None * Return : None *******************************************************************************/ int main(void) { #ifdef DEBUG debug(); #endif /* System Clocks Configuration */ RCC_Configuration(); /* NVIC configuration */ NVIC_Configuration(); /* GPIO configuration */ GPIO_Configuration(); /* Enable PWR and BKP clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Enable write access to Backup domain */ PWR_BackupAccessCmd(ENABLE); /* Clear Tamper pin Event(TE) pending flag */ BKP_ClearFlag(); /* Check if the Power On Reset flag is set */ if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { /* Clear reset flags */ RCC_ClearFlag(); /* Turn on led connected to GPIO_LED Pin8 */ GPIO_SetBits(GPIO_LED, GPIO_Pin_8); /* Check if Backup data registers are programmed */ if(CheckBackupReg(0x3210) == 0x00) { /* Backup data registers values are correct */ /* Turn on led connected to GPIO_LED Pin6 */ GPIO_SetBits(GPIO_LED, GPIO_Pin_6); } else { /* Backup data registers values are not correct or they are not yet programmed (when the first time the program is executed) */ /* Write data to Backup data registers */ WriteToBackupReg(0x3210); /* Turn on led connected to GPIO_LED Pin7 */ GPIO_SetBits(GPIO_LED, GPIO_Pin_7); } } /* Turn on led connected to GPIO_LED Pin9 */ GPIO_SetBits(GPIO_LED, GPIO_Pin_9); while (1) { } }
void systemInit(bool overclock) { #ifdef STM32F303xC // start fpu SCB->CPACR = (0x3 << (10*2)) | (0x3 << (11*2)); #endif #ifdef STM32F303xC SetSysClock(); #endif #ifdef STM32F10X_MD // Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers // Configure the Flash Latency cycles and enable prefetch buffer SetSysClock(overclock); #endif // Configure NVIC preempt/priority groups NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); #ifdef STM32F10X_MD // Turn on clocks for stuff we use RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); #endif RCC_ClearFlag(); enableGPIOPowerUsageAndNoiseReductions(); #ifdef STM32F10X_MD // Turn off JTAG port 'cause we're using the GPIO for leds #define AFIO_MAPR_SWJ_CFG_NO_JTAG_SW (0x2 << 24) AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_NO_JTAG_SW; #endif ledInit(); beeperInit(); // Init cycle counter cycleCounterInit(); // SysTick SysTick_Config(SystemCoreClock / 1000); #ifdef CC3D spiInit(SPI1); spiInit(SPI2); #endif #ifndef CC3D // Configure the rest of the stuff i2cInit(I2C2); #endif // sleep for 100ms delay(100); }
/** * @file RTC_Init * @brief RTC Initialization * @param 无 * @retval 无 */ void RTC_Init(void) { if (BKP_ReadBackupRegister(BKP_DR1)!= 0xA5A5) { /* Backup data register value is not correct or not yet programmed (when the first time the program is executed) */ printf("RTC not yet configured....\r\n"); /* RTC Configuration */ RTC_Configuration(); Time_Regulate(); /* Adjust time by values entred by the user on the hyperterminal */ printf("RTC configured....\r\n"); BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); } else { /* Check if the Power On Reset flag is set */ if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { printf("Power On Reset occurred....\r\n"); } /* Check if the Pin Reset flag is set */ else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) { printf("External Reset occurred....\r\n"); } printf("No need to configure RTC....\r\n"); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Enable the RTC Second */ RTC_ITConfig(RTC_IT_SEC, ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); } /* NVIC configuration */ NVIC_Configuration(); #ifdef RTCClockOutput_Enable /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Disable the Tamper Pin */ BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper functionality must be disabled */ /* Enable RTC Clock Output on Tamper Pin */ BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock); #endif /* Clear reset flags */ RCC_ClearFlag(); return; }
void checkResetType() { uint32_t rst = RCC->CSR; evrPush(( rst & (RCC_CSR_PORRSTF | RCC_CSR_PADRSTF | RCC_CSR_SFTRSTF) ) ? EVR_NormalReset : EVR_AbnormalReset , rst >> 24 ); RCC_ClearFlag(); }
void HAL_Core_Init(void) { if (HAL_Feature_Get(FEATURE_RESET_INFO)) { // Clear RCC reset flags RCC_ClearFlag(); } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* Setup the microcontroller system. Initialize the Embedded Flash Interface, initialize the PLL and update the SystemFrequency variable. */ SystemInit(); /* Initialize Leds mounted on STM3210X-EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Enable PWR and BKP clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Enable write access to Backup domain */ PWR_BackupAccessCmd(ENABLE); /* Clear Tamper pin Event(TE) pending flag */ BKP_ClearFlag(); /* Check if the Power On Reset flag is set */ if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { /* Clear reset flags */ RCC_ClearFlag(); /* Turn on LED3 */ STM_EVAL_LEDOn(LED3); /* Check if Backup data registers are programmed */ if(CheckBackupReg(0x3210) == 0x00) { /* Backup data registers values are correct */ /* Turn on LED1 */ STM_EVAL_LEDOn(LED1); } else { /* Backup data registers values are not correct or they are not yet programmed (when the first time the program is executed) */ /* Write data to Backup data registers */ WriteToBackupReg(0x3210); /* Turn on LED2 */ STM_EVAL_LEDOn(LED2); } } /* Turn on LED4 */ STM_EVAL_LEDOn(LED4); while (1) { } }
void systemInit(void) { GPIO_InitTypeDef GPIO_InitStructure; uint8_t i; gpio_config_t gpio_cfg[] = { { LED0_GPIO, LED0_PIN, GPIO_Mode_Out_PP }, // PB3 (LED) { LED1_GPIO, LED1_PIN, GPIO_Mode_Out_PP }, // PB4 (LED) #ifndef FY90Q { BEEP_GPIO, BEEP_PIN, GPIO_Mode_Out_OD }, // PA12 (Buzzer) #endif }; uint8_t gpio_count = sizeof(gpio_cfg) / sizeof(gpio_cfg[0]); // Turn on clocks for stuff we use RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4 | RCC_APB1Periph_I2C2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_TIM1 | RCC_APB2Periph_ADC1 | RCC_APB2Periph_USART1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_ClearFlag(); // Make all GPIO in by default to save power and reduce noise GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_Init(GPIOC, &GPIO_InitStructure); // Turn off JTAG port 'cause we're using the GPIO for leds GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // Configure gpio for (i = 0; i < gpio_count; i++) { GPIO_InitStructure.GPIO_Pin = gpio_cfg[i].pin; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = gpio_cfg[i].mode; GPIO_Init(gpio_cfg[i].gpio, &GPIO_InitStructure); } LED0_OFF; LED1_OFF; BEEP_OFF; // Init cycle counter cycleCounterInit(); // SysTick SysTick_Config(SystemCoreClock / 1000); // Configure the rest of the stuff adcInit(); #ifndef FY90Q i2cInit(I2C2); #endif // sleep for 100ms delay(100); }
/******************************************************************************* * Function Name : main * Description : Main program. * Input : None * Output : None * Return : None *******************************************************************************/ int main(void) { #ifdef DEBUG debug(); #endif /* System Clocks Configuration */ RCC_Configuration(); /* GPIO configuration */ GPIO_Configuration(); /* Check if the system has resumed from WWDG reset */ if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET) { /* WWDGRST flag set */ /* Set GPIO_LED pin 6 */ GPIO_SetBits(GPIO_LED, GPIO_Pin_6); /* Clear reset flags */ RCC_ClearFlag(); } else { /* WWDGRST flag is not set */ /* Reset GPIO_LED pin 6 */ GPIO_ResetBits(GPIO_LED, GPIO_Pin_6); } /* Configure Key Button EXTI Line to generate an interrupt on falling edge */ EXTI_Configuration(); /* NVIC configuration */ NVIC_Configuration(); /* WWDG configuration */ /* Enable WWDG clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); /* WWDG clock counter = (PCLK1/4096)/8 = 244 Hz (~4 ms) */ WWDG_SetPrescaler(WWDG_Prescaler_8); /* Set Window value to 65 */ WWDG_SetWindowValue(65); /* Enable WWDG and set counter value to 127, WWDG timeout = ~4 ms * 64 = 262 ms */ WWDG_Enable(127); /* Clear EWI flag */ WWDG_ClearFlag(); /* Enable EW interrupt */ WWDG_EnableIT(); while (1) {} }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* Setup the microcontroller system. Initialize the Embedded Flash Interface, initialize the PLL and update the SystemFrequency variable. */ SystemInit(); /* Initialize LED1 and Key Button mounted on STM3210X-EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_PBInit(Button_KEY, Mode_EXTI); /* Check if the system has resumed from WWDG reset */ if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET) { /* WWDGRST flag set */ /* Turn on LED1 */ STM_EVAL_LEDOn(LED1); /* Clear reset flags */ RCC_ClearFlag(); } else { /* WWDGRST flag is not set */ /* Turn off LED1 */ STM_EVAL_LEDOff(LED1); } /* NVIC configuration */ NVIC_Configuration(); /* WWDG configuration */ /* Enable WWDG clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); /* WWDG clock counter = (PCLK1/4096)/8 = 1099 Hz (~910 µs) */ WWDG_SetPrescaler(WWDG_Prescaler_8); /* Set Window value to 65 */ WWDG_SetWindowValue(65); /* Enable WWDG and set counter value to 127, WWDG timeout = ~910 µs * 64 = 58.25 ms */ WWDG_Enable(127); /* Clear EWI flag */ WWDG_ClearFlag(); /* Enable EW interrupt */ WWDG_EnableIT(); while (1) { } }
void systemInit(void) { #ifdef CC3D /* Accounts for OP Bootloader, set the Vector Table base address as specified in .ld file */ extern void *isr_vector_table_base; NVIC_SetVectorTable((uint32_t)&isr_vector_table_base, 0x0); #endif // Configure NVIC preempt/priority groups NVIC_PriorityGroupConfig(NVIC_PRIORITY_GROUPING); #ifdef STM32F10X // Turn on clocks for stuff we use RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); #endif // cache RCC->CSR value to use it in isMPUSoftreset() and others cachedRccCsrValue = RCC->CSR; #ifdef STM32F40_41xxx /* Accounts for OP Bootloader, set the Vector Table base address as specified in .ld file */ extern void *isr_vector_table_base; NVIC_SetVectorTable((uint32_t)&isr_vector_table_base, 0x0); RCC_AHB2PeriphClockCmd( RCC_AHB2Periph_OTG_FS, DISABLE); #endif RCC_ClearFlag(); enableGPIOPowerUsageAndNoiseReductions(); #ifdef STM32F10X // Set USART1 TX (PA9) to output and high state to prevent a rs232 break condition on reset. // See issue https://github.com/cleanflight/cleanflight/issues/1433 gpio_config_t gpio; gpio.mode = Mode_Out_PP; gpio.speed = Speed_2MHz; gpio.pin = Pin_9; digitalHi(GPIOA, gpio.pin); gpioInit(GPIOA, &gpio); // Turn off JTAG port 'cause we're using the GPIO for leds #define AFIO_MAPR_SWJ_CFG_NO_JTAG_SW (0x2 << 24) AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_NO_JTAG_SW; #endif // Init cycle counter cycleCounterInit(); memset(extiHandlerConfigs, 0x00, sizeof(extiHandlerConfigs)); // SysTick SysTick_Config(SystemCoreClock / 1000); }
void rccConfiguration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH, ENABLE); GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_Init(GPIOE, &GPIO_InitStructure); // exclude PA13 & PA14 for SWD GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All & ~(GPIO_Pin_13 | GPIO_Pin_14); GPIO_Init(GPIOA, &GPIO_InitStructure); #ifdef RCC_EN1_PORT en1 = digitalInit(RCC_EN1_PORT, RCC_EN1_PIN, 1); #endif #ifdef RCC_EN2_PORT en2 = digitalInit(RCC_EN2_PORT, RCC_EN2_PIN, 0); #endif #ifdef RCC_SYSOFF_PORT sysoff = digitalInit(RCC_SYSOFF_PORT, RCC_SYSOFF_PIN, 0); #endif #ifdef RCC_STEPUP_EN_PORT stepupEn = digitalInit(RCC_STEPUP_EN_PORT, RCC_STEPUP_EN_PIN, 1); #endif #ifdef RCC_SYNC_PORT sync = digitalInit(RCC_SYNC_PORT, RCC_SYNC_PIN, 1); #endif RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1 | RCC_AHB1Periph_DMA2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // enable timer clocks RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4 | RCC_APB1Periph_TIM7, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_TIM8 | RCC_APB2Periph_TIM9 | RCC_APB2Periph_TIM10 | RCC_APB2Periph_TIM11, ENABLE); SYSCFG_CompensationCellCmd(ENABLE); // Clear reset flags RCC_ClearFlag(); RCC_GetClocksFreq(&rccClocks); pwmZeroTimers(); }
static int read_flags(enum rcc_flag flag) { if (flags || STATUS_FLAG == flag) return flags & 1 << STATUS_FLAG; flags |= 1 << STATUS_FLAG; flags |= RCC_GetFlagStatus(RCC_FLAG_IWDGRST) << WATCHDOG_FLAG; flags |= RCC_GetFlagStatus(RCC_FLAG_PORRST) << POWERON_FLAG; RCC_ClearFlag(); return read_flags(flag); }
void RTC_Config(void) { /*后备寄存器1中,存了一个特殊字符0xA5A5 第一次上电或后备电源掉电后,该寄存器数据丢失, 表明RTC数据丢失,需要重新配置 */ if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) //检查是否第一次上电或后备电池已经掉电, { Write_Log("Backup VBAT PowerDown or First time PowerUp,Initialize RTC\r\n"); RTC_Configuration(); BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); time_now.tm_year = 2011; time_now.tm_mon = 10; //月份表示为0~11 time_now.tm_mday = 13; time_now.tm_hour = 13; time_now.tm_min = 16; time_now.tm_sec = 38; Time_SetCalendarTime(time_now);//设置初始时间 } else //若后备寄存器没有掉电,则无需重新配置RTC { Write_Log("Backup VBAT Keep, Don't RTC Configuralation\r\n"); //等待RTC与APB同步 RTC_WaitForSynchro(); RTC_WaitForLastTask(); //使能秒中断 RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); } //这里我们可以利用RCC_GetFlagStatus()函数查看本次复位类型 if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { por_rst_flag = 1; Write_Log("PowerUp Reset\r\n"); } else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) { pin_rst_flag = 1; Write_Log("pin Reset\r\n"); } else if(PWR_GetFlagStatus(PWR_FLAG_WU)!= RESET) //wakeup唤醒 { Write_Log("WakeUp...\r\n"); } if(PWR_GetFlagStatus(PWR_FLAG_SB) != RESET) //检查是否由待机模式下唤醒,如是则不需要配置RTC /* System resumed from STANDBY mode */ /* Clear StandBy flag */ PWR_ClearFlag(PWR_FLAG_SB); //清除RCC中复位标志 RCC_ClearFlag(); return; }
/** * @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 */ /* Initialize LEDs and Tamper Button mounted on EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_PBInit(BUTTON_TAMPER, BUTTON_MODE_EXTI); /* Check if the system has resumed from WWDG reset */ if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET) { /* WWDGRST flag set */ /* Turn on LED1 */ STM_EVAL_LEDOn(LED1); /* Clear reset flags */ RCC_ClearFlag(); } else { /* WWDGRST flag is not set */ /* Turn off LED1 */ STM_EVAL_LEDOff(LED1); } /* Setup SysTick Timer for 1 msec interrupts */ if (SysTick_Config(SystemCoreClock / 1000)) { /* Capture error */ while (1) {} } /* Configure WWDG */ WWDG_Config(); while (1) { /* Toggle LED2 */ STM_EVAL_LEDToggle(LED2); /* Insert 33 ms delay */ Delay(33); /* Update WWDG counter */ WWDG_SetCounter(127); } }
/* ********************************************************************************************************* * 函 数 名: bsp_InitIwdg * 功能说明: 独立看门狗时间配置函数 * 形 参:IWDGTime: 0 ---- 0x0FFF * 独立看门狗时间设置,单位为ms,IWDGTime = 1000 大约就是一秒的 * 时间,这里没有结合TIM5测得实际LSI频率,只是为了操作方便取了 * 一个估计值超过IWDGTime不进行喂狗的话系统将会复位。 * LSI = 34000左右 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_iwdg_init(unsigned int IWDGTime) { /* 检测系统是否从独立看门狗复位中恢复 */ if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) { /* 清除复位标志 */ RCC_ClearFlag(); } else { /* 标志没有设置 */ } #if 1 /* 通过TIM5输入捕获得到LSI频率 */ LsiFreq = GetLSIFrequency(); #else /* 使能LSI */ RCC_LSICmd(ENABLE); /* 等待直到LSI就绪 */ while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) {} /* */ LsiFreq = 32000; #endif /* 写入0x5555表示允许访问IWDG_PR 和IWDG_RLR寄存器 */ IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* LSI/32 分频*/ IWDG_SetPrescaler(IWDG_Prescaler_256); /*特别注意,由于这里_ulIWDGTime的最小单位是ms, 所以这里重装计数的 计数时 需要除以1000 Counter Reload Value = (IWDGTime / 1000) /(1 / IWDG counter clock period) = (IWDGTime / 1000) / (32/LSI) = (IWDGTime / 1000) / (32/LsiFreq) = LsiFreq * IWDGTime / 32000 实际测试LsiFreq = 34000,所以这里取1的时候 大概就是1ms */ IWDG_SetReload(IWDGTime); /* 重载IWDG计数 */ IWDG_ReloadCounter(); /* 使能 IWDG (LSI oscillator 由硬件使能) */ IWDG_Enable(); }
void systemInit(void) { GPIO_InitTypeDef GPIO_InitStructure; gpio_config_t gpio_cfg[] = { { LEDR_GPIO, LEDR_PIN, GPIO_Mode_Out_PP }, { LEDG_GPIO, LEDG_PIN, GPIO_Mode_Out_PP }, }; uint8_t gpio_count = sizeof(gpio_cfg) / sizeof(gpio_cfg[0]); uint32_t i; // This is needed because some shit inside Keil startup f***s with SystemCoreClock, setting it back to 72MHz even on HSI. SystemCoreClockUpdate(); // Turn on clocks for stuff we use RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4 | RCC_APB1Periph_I2C2 | RCC_APB1Periph_SPI2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_TIM1 | RCC_APB2Periph_ADC1 | RCC_APB2Periph_USART1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_ClearFlag(); // Make all GPIO in by default to save power and reduce noise GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_Init(GPIOC, &GPIO_InitStructure); // Turn off JTAG port 'cause we're using the GPIO for leds GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); // Configure gpio for (i = 0; i < gpio_count; i++) { GPIO_InitStructure.GPIO_Pin = gpio_cfg[i].pin; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = gpio_cfg[i].mode; GPIO_Init(gpio_cfg[i].gpio, &GPIO_InitStructure); } LEDR_OFF LEDG_OFF // Init cycle counter cycleCounterInit(); // SysTick SysTick_Config(SystemCoreClock / 1000); // Configure the rest of the stuff i2cInit(I2C2); // sleep for 100ms delay(100); }
/* ********************************************************************************************************* * 函 数 名: bsp_InitWwdg * 功能说明: 窗口看门狗配置 * 形 参: * _ucTreg : T[6:0],计数器值 范围0x40 到 0x7F * _ucWreg : W[6:0],窗口值 必须小于 0x80 * WWDG_Prescaler : 窗口看门狗分频 PCLK1 = 42MHz * WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1 * WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2 * WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4 * WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_InitWwdg(uint8_t _ucTreg, uint8_t _ucWreg, uint32_t WWDG_Prescaler) { NVIC_InitTypeDef NVIC_InitStructure; /* 检测系统是否从窗口看门狗复位中恢复 */ if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET) { /* 清除复位标志 */ RCC_ClearFlag(); } else { /* WWDGRST 标志没有设置 */ } /* 使能WWDG时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); /* 窗口看门狗分频设置: 比如选择WWDG_Prescaler_8 (PCLK1 (42MHz)/4096)/8 = 1281 Hz (~780 us) */ WWDG_SetPrescaler(WWDG_Prescaler); /* 设置窗口值是_ucWreg,用户必须在小于_ucWreg且大于0x40时刷新计数 器,要不会造成系统复位。 */ WWDG_SetWindowValue(_ucWreg); /* 使能WWDG,设置计数器 比如设置_ucTreg=127 8分频时,那么溢出时间就是= ~780 us * 64 = 49.92 ms 窗口看门狗的刷新时间段是: ~780 * (127-80) = 36.6ms < 刷新窗口看门狗 < ~780 * 64 = 49.9ms */ WWDG_Enable(_ucTreg); /* 清除EWI中断标志 */ WWDG_ClearFlag(); /* 使能EW中断 */ WWDG_EnableIT(); /* 设置 WWDG 的NVIC */ NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
uint8_t TM_WATCHDOG_Init(TM_WATCHDOG_Timeout_t timeout) { uint8_t result = 0; // Check if the system has resumed from IWDG reset if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) { // Reset by IWDG result = 1; // Clear reset flags RCC_ClearFlag(); } // Enable write access to IWDG_PR and IWDG_RLR registers IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // IWDG counter clock: LSI/32 = 1024Hz IWDG_SetPrescaler(IWDG_Prescaler_32); // Set counter reload value. if (timeout == TM_WATCHDOG_Timeout_5ms) { IWDG_SetReload(5); } else if (timeout == TM_WATCHDOG_Timeout_10ms) { IWDG_SetReload(10); } else if (timeout == TM_WATCHDOG_Timeout_15ms) { IWDG_SetReload(15); } else if (timeout == TM_WATCHDOG_Timeout_30ms) { IWDG_SetReload(31); } else if (timeout == TM_WATCHDOG_Timeout_60ms) { IWDG_SetReload(61); } else if (timeout == TM_WATCHDOG_Timeout_120ms) { IWDG_SetReload(123); } else if (timeout == TM_WATCHDOG_Timeout_250ms) { IWDG_SetReload(256); } else if (timeout == TM_WATCHDOG_Timeout_500ms) { IWDG_SetReload(512); } else if (timeout == TM_WATCHDOG_Timeout_1s) { IWDG_SetReload(1024); } else if (timeout == TM_WATCHDOG_Timeout_2s) { IWDG_SetReload(2048); } else if (timeout == TM_WATCHDOG_Timeout_4s) { IWDG_SetReload(4095); } // Reload IWDG counter IWDG_ReloadCounter(); // Enable IWDG (the LSI oscillator will be enabled by hardware) IWDG_Enable(); return result; }
/******************************************************************************* * 函 数 名: * 功 能: * 参 数: * 返 回: *******************************************************************************/ uint8_t RTC_Init(uint32_t pre_value, uint32_t alarm_value, uint32_t count_value) { uint8_t count; NVIC_InitTypeDef NVIC_InitStructure; //RTC全局中断 NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE); PWR_BackupAccessCmd(ENABLE); //设置外部低速晶振(LSE),使用外设低速晶振 RCC_LSEConfig(RCC_LSE_ON); //检查指定的RCC标志位设置与否,等待低速晶振就绪 while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { count++; Delayms(10); } if(count>=250) return 1; //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); RCC_RTCCLKCmd(ENABLE); //等待最近一次对RTC寄存器的读操作完成 RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成 RTC_WaitForLastTask(); //设置报警时间 RTC_SetAlarm(alarm_value); RTC_WaitForLastTask(); //配置中断 RTC_ITConfig( RTC_IT_SEC|RTC_IT_ALR|RTC_IT_OW, ENABLE); RTC_WaitForLastTask(); //设置RTC预分频的值 RTC_SetPrescaler(pre_value); RTC_WaitForLastTask(); //清除RCC的复位标志位 RCC_ClearFlag(); RTC_WaitForLastTask(); RTC_SetCounter(count_value); RTC_WaitForLastTask(); return 0; }
// IWDG: STM32 Independent Watchdog Initialization void IWDG_Configureation(void) { //RCC_LSICmd(ENABLE); //open LSI //while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) { RCC_ClearFlag(); } IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(IWDG_Prescaler_128); // 40Khz / 128 = 0.31KHz; 1 / 0.31KHz = 3.22ms //IWDG_SetReload(1250); // 1s, max 0xfff IWDG_SetReload(0xfff); // 4095 * 3.22ms = 13185.9ms = 13 seconds; it means if IWDG was not reloaded, MCU will reset! //IWDG_ReloadCounter(); IWDG_Enable(); }
void cpu_device_reset(int bootloader) { struct app_handshake_block *handshake = (struct app_handshake_block *)HANDSHAKE_ADDR; /* Clear any reset flags that might be present (i.e. watchdog) */ RCC_ClearFlag(); /* * If bootloader mode is requested, Set the flag in the * handshake area */ if (bootloader == 1) { handshake->loader_magic = LOADER_KEY; } NVIC_SystemReset(); }
void Platform_Init(void) { /*STM32 wakeup by watchdog in standby mode, re-enter standby mode in this situation*/ PlatformWDGReload(); if ( (PWR_GetFlagStatus(PWR_FLAG_SB) != RESET) && RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) { RCC_ClearFlag(); Platform_Enter_STANDBY(); } PWR_ClearFlag(PWR_FLAG_SB); mico_rtos_init_mutex(&printf_mutex); Platform_Button_EL_Init(); Platform_Button_STANDBY_Init(); Platform_LED_SYS_Init(); Platform_LED_RF_Init(); Platform_Debug_UART_Init(); }
void systemInit(void) { checkForBootLoaderRequest(); // Enable FPU SCB->CPACR = (0x3 << (10 * 2)) | (0x3 << (11 * 2)); // Configure NVIC preempt/priority groups NVIC_PriorityGroupConfig(NVIC_PRIORITY_GROUPING); // cache RCC->CSR value to use it in isMPUSoftreset() and others cachedRccCsrValue = RCC->CSR; RCC_ClearFlag(); enableGPIOPowerUsageAndNoiseReductions(); memset(extiHandlerConfigs, 0x00, sizeof(extiHandlerConfigs)); // Pre-setup SysTick and system time - final setup is done in systemClockSetup systemTimekeepingSetup(); }
u8 getResetSource(void) { u8 retval = 0; if (RCC_GetFlagStatus(RCC_FLAG_PORRST) == SET) retval = POWER_RESET; else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) == SET) retval = PIN_RESET; else if (RCC_GetFlagStatus(RCC_FLAG_SFTRST) == SET) retval = SOFT_RESET; else if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET) retval = IWDG_RESET; else if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET) retval = WWDG_RESET; else if (RCC_GetFlagStatus(RCC_FLAG_LPWRRST) == SET) retval = LOW_POWER_RESET; RCC_ClearFlag(); return retval; }