/* ********************************************************************************************************* * INCLUDE FILES ********************************************************************************************************* */ #define BSP_MODULE #include /* ********************************************************************************************************* * LOCAL TABLES ********************************************************************************************************* */ /* ********************************************************************************************************* * LOCAL GLOBAL VARIABLES ********************************************************************************************************* */ /* ********************************************************************************************************* * LOCAL FUNCTION PROTOTYPES ********************************************************************************************************* */ /** This function will initial STM32 board**/ void rt_hw_board_init() { BSP_Init(); //add for finsh rt_hw_usart_init(); rt_console_set_device(RT_CONSOLE_DEVICE_NAME); } /** * RCC configuration */ static void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; //使能外部晶振 RCC_HSEConfig(RCC_HSE_ON); //等待外部晶振稳定 HSEStartUpStatus = RCC_WaitForHSEStartUp(); //如果外部晶振启动成功,则进行下一步操作 if(HSEStartUpStatus==SUCCESS) { //设置HCLK(AHB时钟)=SYSCLK = 72MHz RCC_HCLKConfig(RCC_SYSCLK_Div1); //PCLK1(APB1) = HCLK/2,RCC_HCLK_Div2——>PCLK1=36MHz,最大36MHz RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK2(APB2) = HCLK = 72MHz RCC_PCLK2Config(RCC_HCLK_Div1); //FLASH时序控制 //推荐值:SYSCLK = 0~24MHz Latency=0 // SYSCLK = 24~48MHz Latency=1 // SYSCLK = 48~72MHz Latency=2 FLASH_SetLatency(FLASH_Latency_2); //开启FLASH预取指功能 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //启动PLL RCC_PLLCmd(ENABLE); //等待PLL稳定 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //系统时钟SYSCLK来自PLL输出 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //切换时钟后等待系统时钟稳定 while(RCC_GetSYSCLKSource()!=0x08); /* //设置系统SYSCLK时钟为HSE输入 RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); //等待时钟切换成功 while(RCC_GetSYSCLKSource() != 0x04); */ } //下面是给各模块开启时钟 //启动GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \ RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | \ RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOG, ENABLE); //启动AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //启动USART1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //启动USART2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //启动DMA时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /* Enable ADC1 and GPIOC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* Enable WWDG clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); } /** * NVIC Configuration */ static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; #if defined(VECT_TAB_RAM) // Set the Vector Table base location at 0x20000000 NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x00); #elif defined(VECT_TAB_FLASH) // Set the Vector Table base location at 0x08000000 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00); #elif defined(VECT_TAB_USER) // Set the Vector Table base location by user NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_VECTOR_TABLE); #endif //设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //窗口看门狗中断配置 NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /** * GPIO Configuration */ static void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_Init(GPIOG, &GPIO_InitStructure); /******************系统运行LED指示灯配置*******************/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } /** * WWDG Configuration */ static void WWDG_Configuration(void) { //在PCLK1驱动看门狗计时之前,首先要经过既定的4096分频(详情查看STM32技术参考手册),再经过Prescaler = 8分频 /* WWDG clock counter = (PCLK1/4096)/8 = 1098.6 Hz (~0.910 ms) */ WWDG_SetPrescaler(WWDG_Prescaler_8); /* Set Window value to 127 */ //范围:1ms-58ms WWDG_SetWindowValue(0x7F); /* Enable WWDG and set counter value to 127, WWDG timeout = ~4 ms * (0x7F - 0x3F) = 58.24 ms */ WWDG_Enable(127); /* Clear EWI flag */ WWDG_ClearFlag(); /* Enable EW interrupt */ WWDG_EnableIT(); } /** * IWDG_Configuration */ static void IWDG_Configuration(void) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//使能对IWDG->PR和IWDG->RLR的写 IWDG_SetPrescaler(IWDG_Prescaler_64);//64分频 IWDG_SetReload(1875); IWDG_ReloadCounter(); IWDG_Enable(); } /** * feed IWDG dog */ void IWDG_Feed(void) { IWDG_ReloadCounter();//reload } /** * SysTick Configuration */ void SysTick_Configuration(void) { RCC_ClocksTypeDef rcc_clocks; rt_uint32_t cnts; RCC_GetClocksFreq(&rcc_clocks); cnts = (rt_uint32_t)rcc_clocks.HCLK_Frequency / RT_TICK_PER_SECOND; SysTick_Config(cnts); SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); } /** * This is the timer interrupt service routine. * */ void rt_hw_timer_handler(void) { /* enter interrupt */ rt_interrupt_enter(); rt_tick_increase(); /* leave interrupt */ rt_interrupt_leave(); } void assert_failed(u8* file, u32 line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ rt_kprintf("assert failed at %s:%d \n", file, line); while (1) { } } /* ********************************************************************************************************* * LOCAL CONFIGURATION ERRORS ********************************************************************************************************* */ /* ********************************************************************************************************* * BSP_Init() * * Description : Initialize the Board Support Package (BSP). * * Argument(s) : none. * * Return(s) : none. * * Caller(s) : Application. * * Note(s) : (1) This function SHOULD be called before any other BSP function is called. ********************************************************************************************************* */ void BSP_Init (void) { RCC_Configuration(); NVIC_Configuration(); SysTick_Configuration(); GPIO_Configuration(); // TODO Now temporary comment this code, the official version will open his // IWDG_Configuration(); }