clock

Dependencies:   mbed

myMapPlat/myf401.cpp

Committer:
donghuoyinzi
Date:
2018-05-14
Revision:
2:e54d9d87c6cb
Parent:
0:17e9016529cf
Child:
3:b8766d623f01

File content as of revision 2:e54d9d87c6cb:

#include "myf401.h"

IWDG_HandleTypeDef  f401Act::hiwdg;                       //iwdg instance
TIM_HandleTypeDef  htim2;

int f401Act::bufpow=0;
char f401Act::bufR[10]={0x00}; char f401Act::bufT[10]={0x00}; 
int f401Act::cnt=0;

/*******************************
Fun.: f401pc initializations,include iwdg\system tick\key interrupt。
Desc.: 含低功耗,使用内部低功耗振荡器,频率1.048MHz,仅启用PB口Sleep模式115uA,启用PA、PB口Sleep模式131uA
Auth. Vesion:2017.7.2
*******************************/
void f401Act::init(void)   
{
    HAL_Init();                     //HAL库初始化
    SystemClock_Config();           //系统时钟初始化;内部低功耗振荡器,1.048MHz
    HAL_Delay(500);                 //调试延时,防止一上电进入休眠后,无法下载程序。
    HAL_Delay(500);
    MX_GPIO_Init();             //IO口初始化
    MY_GPIO_Config();           //专属IO初始化配置

    init_wdg();
}

/** 系统时钟配置函数 **/
void f401Act::SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct;
    RCC_ClkInitTypeDef RCC_ClkInitStruct;

    
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); //Configure the main internal regulator output voltage
    
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;        //Initializes the CPU, AHB and APB busses clocks,使用内部低功耗振荡器
    RCC_OscInitStruct.MSIState = RCC_MSI_ON;
    RCC_OscInitStruct.MSICalibrationValue = 0;
    RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_4;             //配置振荡器频率为1.048MHz
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        //_Error_Handler(__FILE__, __LINE__);
    }
    
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK  //Initializes the CPU, AHB and APB busses clocks
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
    {
        //_Error_Handler(__FILE__, __LINE__);
    }
  
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);               //Configure the Systick interrupt time
    
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);            //Configure the Systick
  
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);                        //SysTick_IRQn interrupt configuration
}


/** IO初始化配置函数 **/
void f401Act::MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
  
    // __HAL_RCC_GPIOA_CLK_ENABLE();        //GPIO Ports Clock Enable
    __HAL_RCC_GPIOB_CLK_ENABLE();
    // __HAL_RCC_GPIOC_CLK_ENABLE();
    
    GPIO_InitStruct.Pin = GPIO_PIN_All;                         // 3.3V电源控制输出,上拉VBAT,开漏输出。
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);   
    
    GPIO_InitStruct.Pin = GPIO_PIN_0 |GPIO_PIN_1;                        //LED指示灯,推挽输出。
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
    GPIO_InitStruct.Pin =  GPIO_PIN_9 ;                      // BC95复位输出,上拉3.3V,开漏输出。
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
    GPIO_InitStruct.Pin =  GPIO_PIN_10 ;                        // 串口接收。上拉3.3V,配置浮空输入
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

/** IO定制化配置函数-基本IO初始电平设置
根据实际使用的功能进行配置,原则是不用或者空闲的引脚,上拉的置高,下拉的置低。**/
void f401Act::MY_GPIO_Config(void)
{
        
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);           //不用LED配置为高
    
    //HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,RESET);                  //3.3V电源
            
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);           //开漏输出,上拉3.3,配置为高
        
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_All,GPIO_PIN_SET);         //大部分使用的IO都是上拉,先全部配置为高,再去配置其他特殊引脚。
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_14,GPIO_PIN_RESET);        //10K下拉,低功耗需要配置为低,否则消耗180uA。 
}

/**** initializations of watchdog*********/
void f401Act::init_wdg (void)   
{
    hiwdg.Instance=IWDG;
    hiwdg.Init.Prescaler=IWDG_PRESCALER_16;       //分频因子[4,8,16,32,64,128,256,256] 对应400ms/800ms/1600ms/3200ms/6400ms/12800ms/25600ms
    hiwdg.Init.Reload=4095;                       //递减计数0~0XFFF
    HAL_IWDG_Init(&hiwdg);  
}

/*****************************************
Fun.: pc ready。
Desc.:
Auth. Vesion:2017.7.2
*****************************************/
void f401Act::ready(void)
{
    know::uart1.baud(9600);    
    know::uart1.attach(&isr_pc,SerialBase::RxIrq);
}

/*****************************************
Fun.: pc revoke。
Desc.:
Auth. Vesion:2017.7.2
*****************************************/
char f401Act::revoke(void)
{  
    know::uart1.attach(0,SerialBase::RxIrq);
    return 0;
}
   
/*****************************************
Fun.: pow get。
Desc.:
Auth. Vesion:2017.7.2
*****************************************/
void f401Act::get_pow(void)
{

}

/*****************************************
Fun.: soft reset。
Desc.:
Auth.:ZY
Vesion:2017.7.2
*****************************************/
void f401Act:: put_rst (void)
{
    while(1);
}

/*****************************************
Fun.: cpu sleep。
Desc.:
Auth. Vesion:2017.7.2
*****************************************/
void f401Act::put_slepy(void)
{
    __HAL_RCC_GPIOA_CLK_DISABLE();              //关闭引脚时钟
    __HAL_RCC_GPIOB_CLK_DISABLE();
    
    HAL_SuspendTick();                                  //挂起系统时钟,HAL_ResumeTick();

    HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI); 
//PWR_LOWPOWERREGULATOR_ON 调压器低功耗运行(中断可唤醒方式)。PWR_MAINREGULATOR_ON 调压器正常运行。相差40uA左右。
    
    //HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);     //SLEEP
    //HAL_PWR_EnterSTANDBYMode();                                                       //STABDBY
    //HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);   //STOP
}

/*****************************************
Fun.: reflesh iwdg。
Desc.:
Auth. Vesion:2017.7.2
*****************************************/
void f401Act:: put_rwdg(void)
{
    HAL_IWDG_Refresh(&hiwdg);                                //reflesh iwdg
}

/*****************************************
Fun.: pc getc ISR。
Desc.:
Auth.Vesion:2017.7.2
*****************************************/
void f401Act::isr_pc(void)
{ 
    char bufx;
    
    bufx=know::uart1.getc();
    bufR[cnt]=bufx;
    cnt++;
    if(cnt>10) cnt=0;
}