本以为上次调试就是终点,实在没想到。在做最终测试时发现节点无法进入低功耗模式,因为Debug模式与低功耗模式是互锁的,所以没有发现这个问题。

先说说现象,强制打开串口打印观察节点,发现原来是节点进入STM32自带的停止模式后无法唤醒。

void RtcEnterLowPowerStopMode( void )
{if( ( LowPowerDisableDuringTask == false ) && ( RtcTimerEventAllowsLowPower == true ) ){BoardDeInitMcu( );// Disable the Power Voltage Detector
        HAL_PWR_DisablePVD( );
//#warning "Commented for debug!"
SET_BIT( PWR->CR, PWR_CR_CWUF );// Enable Ultra low power mode
        HAL_PWREx_EnableUltraLowPower( );// Enable the fast wake up from Ultra low power mode
        HAL_PWREx_EnableFastWakeUp( );// Enter Stop Mode
HAL_PWR_EnterSTOPMode( PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI );}
}

开始设想是晶振问题,检查低功耗唤醒的重复初始化函数,发现源代码只有HSI晶振复位等待,于是添加了HSE部分复位等待。发现节点开始唤醒了。

void SystemClockReConfig( void )
{__HAL_RCC_PWR_CLK_ENABLE( );__HAL_PWR_VOLTAGESCALING_CONFIG( PWR_REGULATOR_VOLTAGE_SCALE1 );/* Enable HSI */__HAL_RCC_HSI_ENABLE();__HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_HSICALIBRATION_DEFAULT);//__HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST((uint32_t)((RCC->ICSCR & RCC_ICSCR_HSITRIM) >> POSITION_VAL(RCC_ICSCR_HSITRIM)));/* Wait till HSI is ready */while( __HAL_RCC_GET_FLAG( RCC_FLAG_HSIRDY ) == RESET ){}
#if !defined( USE_DEBUGGER ) || defined( USB_VCP )__HAL_RCC_HSE_CONFIG(RCC_HSE_ON);/* Enable PLL */__HAL_RCC_PLL_ENABLE( );/* Wait till HSE is ready */while( __HAL_RCC_GET_FLAG( RCC_FLAG_HSERDY ) == RESET ){}/* Wait till PLL is ready */while( __HAL_RCC_GET_FLAG( RCC_FLAG_PLLRDY ) == RESET ){}/* Select PLL as system clock source */__HAL_RCC_SYSCLK_CONFIG ( RCC_SYSCLKSOURCE_HSI );/* Wait till PLL is used as system clock source */while( __HAL_RCC_GET_SYSCLK_SOURCE( ) != RCC_SYSCLKSOURCE_STATUS_HSI ){}/*HSI->SYS*/
#elif defined( USE_DEBUGGER ) && !defined( USB_VCP )__HAL_RCC_PLL_ENABLE( );/* Wait till PLL is ready */while( __HAL_RCC_GET_FLAG( RCC_FLAG_PLLRDY ) == RESET ){}/* Select PLL as system clock source */__HAL_RCC_SYSCLK_CONFIG ( RCC_SYSCLKSOURCE_PLLCLK );/* Wait till PLL is used as system clock source */while( __HAL_RCC_GET_SYSCLK_SOURCE( ) != RCC_SYSCLKSOURCE_STATUS_PLLCLK ){}/*PLL->SYS*/
#endif
}

但是却发生了节点的接收窗口与网关的下发窗口对不上的问题。

大家分析认为可能是VCP需要用到的外部高速晶振HSE的启动需要一定的时间,导致在错过了接收窗口时间,所以我们改用了HSI提供给SYS时钟源,HSE只单独提供给PLL来作为USB的时钟源。

#elif !defined( USE_DEBUGGER )RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Configure the main internal regulator output voltage*/__HAL_RCC_PWR_CLK_ENABLE( );__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the CPU, AHB and APB busses clocks*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.LSEState = RCC_LSE_ON;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV3;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB busses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;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_1) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}

但是问题并没有被解决,后来在张老师的帮助下在系统初始化函数中的用于验证链表的时间校准函数中添加了一个低功耗处理函数,收发窗口就对上了。

后来实测HSE->PLL->SYS 也可以用于低功耗模式,只是在系统时间上我们更倾向于复位更快速的STM32内部时钟,所以依然保留HSI->SYS的设置。

但是问题又来了,节点不时会出现入网成功后卡死的问题(可能是哪里又进入了低功耗,但不好发现),依旧是在张老师的帮助下,发现是收发过程中的系统校准函数没有按想像的运行。不知道是否是晶振配置影响了它。

// Trig OnMacCheckTimerEvent call as soon as possible
OnMacStateCheckTimerEvent();
// TimerSetValue( &MacStateCheckTimer, 1 );
// TimerStart( &MacStateCheckTimer );

于是注释了以链表的形式,改用直接执行的方式来运行这个函数。卡死的问题也得到了解决。

实测低功耗模式下节点睡眠电流仅2uA,

至此关于VCP调试的所有阶段才正式结束。

转载于:https://www.cnblogs.com/SaberArthur/p/11230639.html

关于VCP(Virtual Com Port)拓展的调试经历(三)相关推荐

  1. 关于VCP(Virtual Com Port)拓展的调试经历(一)

    * The Overview 前日,接到老板部署的任务,将现有的基于STM32L151与L432的LoRaWAN程序中添加USB CDC(Communication Device Class)功能,并 ...

  2. 使用STM32CubeMX把USB配置成虚拟串口(virtual com port)

    应用场景: 本次在项目中,由于对方的上位机软件比较老旧. 该软件只能通过串口通讯.而我们的设备只引出了USB口.还好STM32 的USB类型可以设置成虚拟串口.所以可以通过把USB枚举成虚拟串口(vi ...

  3. 玩转Zynq连载35——基于Vivado的Virtual IO在线板级调试

    特权同学玩转Zynq连载35--基于Vivado的Virtual IO在线板级调试 1 概述 基于Vivado的板级调试介绍,可以参考文档<玩转Zynq-基础篇:基于Vivado的在线板级调试概 ...

  4. Virtual Serial Port Driver Pro 9.0的破解和汉化

    Virtual Serial Port Driver Pro 9.0 官方原版: https://cdn.eltima.com/download/vspdpro.exe Virtual Serial ...

  5. Virtual Serial Port Driver Pro 11 Crack

    Virtual Serial Port Driver 虚拟串行端口驱动程序允许创建大量的虚拟COM端口,并为您提供充分模拟串行端口行为的巨大可能性.虚拟串行端口软件不仅仅是一个简单的COM端口模拟器. ...

  6. Virtual Serial Port Driver Pro(虚拟串口工具)破解版

    1.Virtual Serial Port Driver介绍 Virtual Serial Port Driver是一款爱不释手的虚拟串口工具,其由著名软件公司Eltima开发,简称为VSPD,是虚拟 ...

  7. win7虚拟串口服务器软件,Virtual Serial Port Driver Pro(虚拟串口驱动程序) V9.0.270 官方版...

    Virtual Serial Port Driver Pro是一款功能全面的虚拟串口辅助软件.软件能通过互联网络的形式实现数据传输,具备安全高效.不易中病毒.兼容性好等等特点.并且还可以添加无限个虚拟 ...

  8. Virtual Serial Port 虚拟串口软件下载及安装使用教程

    1.虚拟串口软件是硬件工程师一个必不可少的软件,我们可借助串口软件来进行调试.接下来向大家介绍Virtual Serial Port 9.0安装使用教程. 点击下载 2.解压软件安装包,打开英文破解版 ...

  9. Virtual Serial Port Driver虚拟串口vspd v7.2 下载及破解方法

    虚拟串口安装之后,不要立刻运行它.将压缩包内附的用vspdctl.dll文件放到C:\Program Files\Eltima Software\Virtual Serial Port Driver ...

最新文章

  1. 格式化verilog/systemverilog代码插件
  2. 从α到μ:DeepMind棋盘游戏AI进化史
  3. GUN Global + Vim及其插件 打造Android源码阅读器
  4. linux内核md5,浅谈MD5及简单使用
  5. 有效用例分析阅读笔记一
  6. Oracle 函数大全(字符串函数,数学函数,日期函数,逻辑运算函数,其他函数)
  7. 关于ASP.NET的web.config的小笔记
  8. 表面粗糙度的基本评定参数是_表面粗糙度的概念,表面粗糙度形成因素,表面粗糙度评定依据...
  9. 402. 移掉K位数字(单调栈)
  10. 一道题决定去留:为什么synchronized无法禁止指令重排,却能保证有序性?
  11. Nhibernate与Castle windsor (个人学习笔记1)
  12. 老杜java_老杜最新Java零基础视频教程(适合Java 0基础,Java初学入门)
  13. 大牛直播SDK-Windows RTMP/RTSP/本地FLV播放器使用说明
  14. 计算机九九乘法口诀表,九九乘法口诀表
  15. Android高仿微信图片多选功能
  16. 抖音的推荐算法是怎样的?
  17. Redis学习(二)之 Redis Cluster集群
  18. 动态时间规整算法DTW
  19. 【数字信号处理】卷积和乘法系列3之测不准原理
  20. 护眼灯到底有没有护眼的效果?2022护眼儿童台灯选哪个牌子好

热门文章

  1. unity脚本 --- 控制物体(游戏对象)移动
  2. 数据分析案例之39药品网
  3. leetcode每日一题-水壶问题
  4. magento -- 获取产品的属性值
  5. 万圣节恐怖表演、内衣检测器......2019 年二十大有趣的机器学习项目盘点
  6. centos安装node以及btoa包
  7. CPU与外设交换数据的方式及其特点
  8. 大学计算机实验二报告表答案,北理大学计算机实验基础实验二实验报告表答案(1页)-原创力文档...
  9. USB/IEEE1394/SATA/PATA/ESATA
  10. 手游游戏资源提取 (AssetStudio、VGMToolbox)