本以为上次调试就是终点,实在没想到。在做最终测试时发现节点无法进入低功耗模式,因为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. python装饰器作用-Python装饰器的通俗理解
  2. python处理流程-python流程处理
  3. (牛人莫入)Silverlight 独立文件存储
  4. Java 的转义字符
  5. sift+图像匹配 算法
  6. 关于Linux系统的运行级别
  7. SQL字符串操作汇总
  8. 一堆数据中将某一个值相同的数据进行分组
  9. Python之网络编程(实现一个多用户同时在线的FTP用户管理程序)
  10. SQL Server数据挖掘简介
  11. 使用云CRM的10个理由
  12. 数组玩法(1):下标移位
  13. LINUX下载编译OpenSSL
  14. Windows下ab压力测试工具的模拟表单提交使用
  15. Github注册中,邮箱验证通不过解决办法
  16. php中文歌词,PHP 爬虫抓取歌词
  17. 百度网盘下载加速(pc端)
  18. 数据库中反引号的作用
  19. Pinned Memory 多设备异步拷贝
  20. Android USB tethering相关代码

热门文章

  1. 互联网产品设计进阶笔记(18)有关互联网用户研究的热讯站点
  2. SpringBoot+Cloud+oauth2.0+JWT集成swagger及swagger-bootstrap-ui详细步骤
  3. ogre1.7 cookbook_OgreWin32Application
  4. Excel 删除空白行/列
  5. 十二生肖运势微信小程序源码
  6. Tensorflow CPU版本安装
  7. OpenFOAM v9 postProcessing
  8. 微信小程序蓝牙功能全套开发流程介绍
  9. NeurIPS 2022 | 基于对齐引导时间注意力机制的视频动作识别
  10. 疯壳开源蓝牙智能健康手表(心率血压血氧心电监测可定制)_OTA镜像制作及下载技术文档