yan zhang
/
NB_CLOCK_180505
clock
Diff: myMapPlat/myf401.cpp
- Revision:
- 0:17e9016529cf
- Child:
- 2:e54d9d87c6cb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/myMapPlat/myf401.cpp Tue May 08 02:13:50 2018 +0000 @@ -0,0 +1,211 @@ +#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] + 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; +} +