zhyinch
2018-10-01 df3db0b978b1cab3555d6878a274b0f382bf707c
标签开机死机bug改好,基站增加软件超时复位

标签开机死机BUG原因:休眠启动后,默认系统时钟HSI,需要配置成HSE。
出现新bug,休眠启动后标签设置HSE,RTC休眠时间变长1倍,未找到原因。目前通过修改RTC时钟分频数,弥补bug。
基站增加软件超时复位,测试半小时没问题,不清楚是否弥补基站死机bug。
已修改5个文件
190 ■■■■ 文件已修改
源码/核心板/Src/OnChipDevices/RTC.c 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
源码/核心板/Src/OnChipDevices/Rcc_Nvic_Systick.c 156 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
源码/核心板/Src/application/dw_app.c 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
源码/核心板/Src/main.c 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
源码/核心板/Src/stm32f10x_it.c 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Ô´Âë/ºËÐİå/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();
Ô´Âë/ºËÐİå/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;
Ô´Âë/ºËÐİå/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)//成功接收
Ô´Âë/ºËÐİå/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();
Ô´Âë/ºËÐİå/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;
}