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/main.c | 12 +- 源码/核心板/Src/stm32f10x_it.c | 13 ++ 源码/核心板/Src/OnChipDevices/Rcc_Nvic_Systick.c | 156 +++++++++++++++++++++++++++++--------- 源码/核心板/Src/OnChipDevices/RTC.c | 2 源码/核心板/Src/application/dw_app.c | 7 + 5 files changed, 139 insertions(+), 51 deletions(-) diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/OnChipDevices/RTC.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/OnChipDevices/RTC.c" index c952803..d1ac0de 100644 --- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/OnChipDevices/RTC.c" +++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/OnChipDevices/RTC.c" @@ -51,7 +51,7 @@ RTC_ITConfig(RTC_IT_ALR,ENABLE); //?? RTC ??? RTC_WaitForLastTask(); /* Set RTC prescaler: set RTC period to 1sec */ - RTC_SetPrescaler(40000); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ + RTC_SetPrescaler(2000); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */ /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); 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 6e55e6b..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; diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" index ef8d58c..2499fa3 100644 --- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" +++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" @@ -263,7 +263,7 @@ } void Dw1000_App_Init(void) { - g_com_map[DEV_ID]=0x00; + g_com_map[DEV_ID]=0x03; tx_poll_msg[MESSAGE_TYPE_IDX]=POLL; tx_resp_msg[MESSAGE_TYPE_IDX]=RESPONSE; tx_final_msg[MESSAGE_TYPE_IDX]=FINAL; @@ -284,7 +284,7 @@ uint32_t final_tx_time; GPIO_ResetBits(SPIx_GPIO, SPIx_CS); - delay_us(250); + delay_us(2500); GPIO_SetBits(SPIx_GPIO, SPIx_CS); /* Write frame data to DW1000 and prepare transmission. See NOTE 7 below. */ @@ -372,7 +372,7 @@ dwt_entersleep(); } - +uint16_t g_Resttimer; void Anchor_App(void) { uint32_t frame_len; @@ -389,6 +389,7 @@ { UART_CheckReceive(); UART_CheckSend(); + g_Resttimer=0; }; if (status_reg & SYS_STATUS_RXFCG)//成功接收 diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/main.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/main.c" index 917fef0..c0f89a6 100644 --- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/main.c" +++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/main.c" @@ -10,13 +10,13 @@ #include "serial_at_cmd_app.h" #include "global_param.h" -#define WORK_MODE_TAG -//#define WORK_MODE_ANCHOR +//#define WORK_MODE_TAG +#define WORK_MODE_ANCHOR void Device_Init(void) { -// Rcc_Init(); - SystemInit(); + RCC_Configuration(); + //SystemInit(); Nvic_Init(); Systick_Init(); #ifdef WORK_MODE_TAG @@ -54,7 +54,7 @@ int main(void) { - +delay_ms(1000); Device_Init(); Program_Init(); Dw1000_Init(); @@ -64,6 +64,7 @@ #endif Dw1000_App_Init(); /* Loop forever initiating ranging exchanges. */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); while(1) { #ifdef WORK_MODE_TAG @@ -73,7 +74,6 @@ Tag_App(); } // UART_CheckReceive(); - RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); #else Anchor_App(); diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/stm32f10x_it.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/stm32f10x_it.c" index 69e2a34..1e15360 100644 --- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/stm32f10x_it.c" +++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/stm32f10x_it.c" @@ -26,17 +26,21 @@ #include "dw_app.h" #include "global_param.h" #include "beep_logic_app.h" - +#include "led.h" /* Tick timer count. */ volatile uint32_t time32_incr; uint8_t tt=0; uint8_t g_start_send_flag = 0; uint16_t sysscal; +extern uint16_t g_Resttimer; void SysTick_Handler(void) {uint16_t i; time32_incr++; g_UWB_com_interval++; - + if(g_Resttimer++>1000) + { + NVIC_SystemReset(); + } // if(g_UWB_com_interval > 1000) // { // dis_after_filter = DEFAULT_DISTANCE; @@ -61,12 +65,15 @@ void RTCAlarm_IRQHandler(void) { + // LED0_BLINK; + RCC_Configuration(); + // LED0_BLINK; EXTI_ClearITPendingBit(EXTI_Line17); RTC_ClearITPendingBit(RTC_FLAG_ALR); g_start_send_flag = 1; RTC_SET_ALARM(1); tt++; - //GPIO_Toggle(GPIOA,LED_PIN); + //SYS.wake_id|=1<<17; } -- Gitblit v1.9.3