From df3db0b978b1cab3555d6878a274b0f382bf707c Mon Sep 17 00:00:00 2001 From: zhyinch <zhyinch@gmail.com> Date: 星期一, 01 十月 2018 15:42:49 +0800 Subject: [PATCH] 标签开机死机bug改好,基站增加软件超时复位 --- 源码/核心板/Src/OnChipDevices/Rcc_Nvic_Systick.c | 165 ++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 126 insertions(+), 39 deletions(-) diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/OnChipDevices/Rcc_Nvic_Systick.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/OnChipDevices/Rcc_Nvic_Systick.c" index e021ee3..81873ad 100644 --- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/OnChipDevices/Rcc_Nvic_Systick.c" +++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/OnChipDevices/Rcc_Nvic_Systick.c" @@ -1,46 +1,126 @@ #include "Rcc_Nvic_Systick.h" -void Rcc_Init(void) +//void Rcc_Init(void) +//{ +// //----------使用内部RC晶振HSI 64MHz----------- +// RCC_DeInit(); //将外设RCC寄存器重设为缺省值 +// RCC_HSICmd(ENABLE); //内部时钟使能 +// while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)== RESET); //等待HSI就绪 +// +// FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //选择FLASH预取指缓存的模,预取指缓存使能 +// FLASH_SetLatency(FLASH_Latency_2); //设置FLASH存储器延时时钟周期数FLASH_Latency_2 2延时周期 +// +// +// RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟(HCLK) RCC_SYSCLK_Div1——AHB时钟 = 系统时钟 +// RCC_PCLK2Config(RCC_HCLK_Div1); //设置高速AHB时钟(PCLK2)RCC_HCLK_Div1——APB2时钟 = HCLK +// RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速AHB时钟(PCLK1)RCC_HCLK_Div2——APB1时钟 = HCLK/2 +// RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16); //设置PLL时钟源及倍频系数,频率为8/2*16=64Mhz +// RCC_PLLCmd(ENABLE); //使能PLL +// +// while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //检查指定的RCC标志位(PLL准备好标志)设置与否 +// RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置系统时钟(SYSCLK) +// while(RCC_GetSYSCLKSource() != 0x08); //0x08:PLL作为系统时钟 + +//// //----------使用外部RC晶振 72MHz----------- +//// RCC_DeInit(); //初始化为缺省值 +//// RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟 +//// while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪 +//// +//// FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer +//// FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state +//// +//// RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK +//// RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK +//// RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2 +//// RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ +//// RCC_PLLCmd(ENABLE); //Enable PLLCLK +//// +//// while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready +//// RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock +//// while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source +// +//} +int RCC_Configuration(void) { - //----------使用内部RC晶振HSI 64MHz----------- - RCC_DeInit(); //将外设RCC寄存器重设为缺省值 - RCC_HSICmd(ENABLE); //内部时钟使能 - while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)== RESET); //等待HSI就绪 - - FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //选择FLASH预取指缓存的模,预取指缓存使能 - FLASH_SetLatency(FLASH_Latency_2); //设置FLASH存储器延时时钟周期数FLASH_Latency_2 2延时周期 - - - RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟(HCLK) RCC_SYSCLK_Div1——AHB时钟 = 系统时钟 - RCC_PCLK2Config(RCC_HCLK_Div1); //设置高速AHB时钟(PCLK2)RCC_HCLK_Div1——APB2时钟 = HCLK - RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速AHB时钟(PCLK1)RCC_HCLK_Div2——APB1时钟 = HCLK/2 - RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16); //设置PLL时钟源及倍频系数,频率为8/2*16=64Mhz - RCC_PLLCmd(ENABLE); //使能PLL - - while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //检查指定的RCC标志位(PLL准备好标志)设置与否 - RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置系统时钟(SYSCLK) - while(RCC_GetSYSCLKSource() != 0x08); //0x08:PLL作为系统时钟 + ErrorStatus HSEStartUpStatus; + RCC_ClocksTypeDef RCC_ClockFreq; -// //----------使用外部RC晶振 72MHz----------- -// RCC_DeInit(); //初始化为缺省值 -// RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟 -// while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪 -// -// FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer -// FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state -// -// RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK -// RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK -// RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2 -// RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ -// RCC_PLLCmd(ENABLE); //Enable PLLCLK -// -// while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready -// RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock -// while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source - + /* RCC system reset(for debug purpose) */ + RCC_DeInit(); + + /* Enable HSE */ + RCC_HSEConfig(RCC_HSE_ON); + + /* Wait till HSE is ready */ + HSEStartUpStatus = RCC_WaitForHSEStartUp(); + + if(HSEStartUpStatus != ERROR) + { + SystemInit(); + /* Enable Prefetch Buffer */ + FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); + + /****************************************************************/ + /* HSE= up to 25MHz (on EVB1000 is 12MHz), + * HCLK=72MHz, PCLK2=72MHz, PCLK1=36MHz */ + /****************************************************************/ + /* Flash 2 wait state */ + FLASH_SetLatency(FLASH_Latency_2); + /* HCLK = SYSCLK */ + RCC_HCLKConfig(RCC_SYSCLK_Div1); + /* PCLK2 = HCLK */ + RCC_PCLK2Config(RCC_HCLK_Div1); + /* PCLK1 = HCLK/2 */ + RCC_PCLK1Config(RCC_HCLK_Div2); + /* ADCCLK = PCLK2/4 */ + RCC_ADCCLKConfig(RCC_PCLK2_Div6); + } +// /* Configure PLLs *********************************************************/ +// /* PLL2 configuration: PLL2CLK = (HSE / 4) * 8 = 24 MHz */ +// RCC_PREDIV2Config(RCC_PREDIV2_Div4); +// RCC_PLL2Config(RCC_PLL2Mul_8); + +// /* Enable PLL2 */ +// RCC_PLL2Cmd(ENABLE); + +// /* Wait till PLL2 is ready */ +// while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET){} + +// /* PLL1 configuration: PLLCLK = (PLL2 / 3) * 9 = 72 MHz */ +// RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div3); + +// RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9); + +// /* Enable PLL */ +// RCC_PLLCmd(ENABLE); + +// /* Wait till PLL is ready */ +// while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){} + +// /* Select PLL as system clock source */ +// RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); + +// /* Wait till PLL is used as system clock source */ +// while (RCC_GetSYSCLKSource() != 0x08){} +// } + + RCC_GetClocksFreq(&RCC_ClockFreq); + + /* Enable SPI1 clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); + + /* Enable SPI2 clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); + + /* Enable GPIOs clocks */ + RCC_APB2PeriphClockCmd( + RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | + RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | + RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, + ENABLE); + + return 0; } - void Nvic_Init(void) { NVIC_InitTypeDef NVIC_InitStructure; @@ -53,13 +133,20 @@ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + + + NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE; + NVIC_Init(&NVIC_InitStructure); } int Systick_Init(void) { int time_retry = 500; - if (SysTick_Config(64000)) + if (SysTick_Config(72000)) { /* Capture error */ while (time_retry--); -- Gitblit v1.9.3