clock

Dependencies:   mbed

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;
+}
+