【NUCLEO-L476RG开发】LPTIM在STOP1模式下输出PWM
本帖最后由 creep 于 2015-11-9 22:26 编辑在上次的点灯测试中(【NUCLEO-L476RG开发】按惯例先点个灯)我们看到L476为了实现低功耗设计了很多和其他系列不同的外设和时钟配置,比如L4系列中除了我们常用的定时器,还有2个低功耗的定时器LPTIM1和LPTIM2,这2个定时器能够使用各种各样的时钟来驱动,这样能使功耗尽可能的降低,下面测试先使用内部的LSI在STOP1模式下驱动LPTIM1输出PWM。
1 LSI驱动LPTIM输出PWM
LPTIM1是个16bit的向上计数的定时器,它不但能在休眠模式下工作而且还能把MCU从低功耗模式下唤醒,其主要特性如下:
使用内部的LSI驱动LPTIM1时要先选择的时钟为LSI,然后配置LPTIM的时钟为LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC(APB/HSI/LSI/LSE ),如果是使用LPTIM1的external input1 输入时钟源就选择 LPTIM_CLOCKSOURCE_ULPTIM。然后配置软件触发及输出占空比极性,详细配置如下:
在下面的函数中配置了输出频率和占空比,设置Autoreload 为99,Pulse value为49. 那么输出的PWM频率应该是:FrequencyOutput = LSIClock Frequency / (Autoreload + 1) = 32768 / 100 = 327.680 Hz。占空比应该是:DutyCycle = 1 - ((PulseValue + 1)/ (Autoreload + 1)) = 50%,这里我们假设了内部LSI为32.768KHZ.
#define PeriodValue (uint32_t) (100 -1)
#define PulseValue (uint32_t) (50 -1)
HAL_LPTIM_PWM_Start(&LptimHandle, PeriodValue, PulseValue);然后设置LPTIM1_OUT输出引脚PB2为复用模式:
在main函数中初始化后外设后是MCU进入STOP1模式:
LPTIM1_PWM_Init();
HAL_PWREx_EnterSTOP1Mode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
while(1)
{
LED(sta);
sta = !sta;
HAL_Delay(10);
}
编译下载后,使用逻辑分析仪看下PB2引脚的输出波形如下;
2 LSI 频率计算
从上面的波形中可以看到实际输出的PWM频率并不是我们计算的327.6HZ而是322.6HZ,这主要是由内部LSI不准确导致的,那么下面就测试下内部LSI的频率是多少。
1)使用MCO输出LSI测量
如果有相应的仪器辅助测量,比较简单的方法是使用MCO输出LSI直接测量,MCO输出的引脚对用PA8,经过下面的简单设置我们把LSI从PA8输出:
HAL_RCC_MCOConfig(RCC_MCO1,RCC_MCO1SOURCE_LSI,RCC_MCODIV_1); //PA8输出的波形如下,可以看到LSI的时钟频率为32.26KHZ,正好和我们上面计算的一样。
2)使用TIM测量LSI
在很多STM32系列中都可以使用TIM直接测量内部和外部时钟,这主要是使用了定时器的输入捕获功能,将内部时钟或者外部时钟通过内部或者外部和定时器的输入捕获输入引脚相连接,进而测试时钟的频率,这样可以直接得到时钟频率的值,然后可以使用这个值进行时钟校准,L4系列可以使用TIM15/TIM16/TIM17进行测量。
具体的配置如下,注意要将定时器TIM16的输入通道1和LSI的时钟输出相连接,然后计算2次上升沿之间的时间长度进而计算出LSI.
在中断函数中根据2次上升沿的时间计算LSI.
我们将计算的LSI通过串口输出如下:可以看到除了每次计算的LSI有细微差别之外,LSI的值和我们上面直接输出的并不一样,这主要是由于我们使用MSI作为系统时钟,MSI本身作为一个内部时钟就缺乏很高的精度,芯片出厂都会设置一个校准值,在每次系统复位时这个校准值加载到MSI中进行校准,但是实际上这个值并不是每个芯片都一样,所以说导致MSI不是很准确,那么我们依靠MSI作为系统和外设时钟计算出来的也不是很准确,但是对比理论值32768HZ更接近实际的LSI的值,如果我们使用LSI作为RTC时钟时用这个方法计算的时间应该比理论的32768HZ更准确。
至于MSI的校准值,我们可以通过同样的方法依靠LSE的准确性来得到一个较准确的值。
3 LSE 驱动LPTIM输出PWM
为了作为对比,我们使用STM32L476-NUCLEO上面的外部的LSE驱动LPTM输出PWM。
和使用LSI大部分配置一样,但是要注意LSE在后备区域,打开是要先进行PWR的访问权限设置:
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSE_CONFIG(RCC_LSE_ON);
在配置LPTIM时选择LSE时钟,
编译下载后看下输入的PWM如下,可以看到此时的输出PWM频率为327.6HZ,和理论值一样。
上面只是简单的测试了LPTIM在STOP下的PWM功能,LPTIM还有其他很有用的特性。
测试代码如下,注意程序下载后会自动进入STOP模式,要重新下载程序需要先复位否则可能连接不上STLINK.
alisa123 发表于 2016-7-21 18:19
楼主橙子,你好,我用stm32L476 的TIM2产生输出PWM,可不知为什么输出始终是高电平,我用寄存器配置的 ,麻 ...
好的,如果你用库函数配置的可以输出PWM的话,可以和用寄存器配置的在debug模式下对比是否一致! 楼主橙子,你好,我用stm32L476 的TIM2产生输出PWM,可不知为什么输出始终是高电平,我用寄存器配置的 ,麻烦请帮忙看看到底哪里配置错了,谢谢啊!代码请连接,谢谢!https://www.stmcu.org.cn/module/forum/thread-606936-1-1.html QianFan 发表于 2015-10-31 13:46
橙哥周末也不休息啊
大早上起看比赛,篮球比赛看完发现离下午的足球比赛还有段时间,就写个代码中场休息下!:lol 橙哥周末也不休息啊 图文并茂,谢谢楼主分享。 :o:o:o:o:o:o:o:o 多谢,橙哥分享,学习了。。 小小笼包 发表于 2015-10-31 16:06
小哥,这是什么表情:o :o:o:o:o:o这是什么表情 :):):):):):):):) 支持,支持,感谢分享 写个代码休息下
这一整年都在休息了。。。 wu1169668869 发表于 2015-11-1 13:06
写个代码休息下
这一整年都在休息了。。。
哈哈,相对于一直躺床上看比赛来说写代码也算休息! 橙子大哥是你么??? 戏如人生 发表于 2015-11-1 17:13
橙子大哥是你么???
你好,小蚂蚁兄弟! creep 发表于 2015-11-1 22:56
你好,小蚂蚁兄弟!
真的是你啊 橙子大哥!!
页:
[1]
2