yan zhang
/
NB_CLOCK_180505
clock
myMapPlat/myf401.cpp
- Committer:
- donghuoyinzi
- Date:
- 2018-05-08
- Revision:
- 0:17e9016529cf
- Child:
- 2:e54d9d87c6cb
File content as of revision 0:17e9016529cf:
#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; }