
需求背景 在使用FreeRTOS时,如果需要统计每个任务的运行时长及百分比,则需要提供一个计时基准。 分别实现以下2个函数: void vConfigureTimerForRunTimeStats( void ); /* Prototype of function that initialises the run time counter. */ unsigned long ulGetRunTimeCounterValue( void ); /* Prototype of function that returns run time counter. */ 前一个函数需用初始化配置计时器;后一个函数用于在任务切换时获取当前计时值。 要求计时的频率比tick的频率要高一个数量级。目前tick为1KHz,则计时频率为10K比较合适。 方案分析 方案一:使用硬件定时器TIMx。
方案二:使用2个硬件定时器级联,组成一个32位计数器 方案三:使用os的tick 代码如下。
方案四:使用RTC作为计数器 具体如下。 使用RTC作为计数器 在STM32F103中,RTC的本质并不是一个实时时钟模块,只是一个计数器而已。可以配置为每秒加一,然后软件将秒数转换为日历时间(类似于unix中,以1970-1-1为起点的秒计数)。 现在不需要时钟了,就把它用于一个10KHz的计数器。最大可计时长为4G/10K = 400K秒,约为100多个小时。 RTC的时钟源:使用内部低速时钟LSI。然后再4分频,即可得到10KHz。 ![]() RTC工作时需要配置以下几个寄存器: 使能PWR和BKP模块时钟 ![]() Disable Backup Domain write: ![]() 开启LSI: ![]() 复位备份域: 先将BDRST设置为1,再设置为0。否则,不能更改RTCSEL等参数。 ![]() 参见手册:6.3.9 备份域控制寄存器 (RCC_BDCR) 注意: 备份域控制寄存器中(RCC_BDCR)的LSEON、LSEBYP、RTCSEL和RTCEN位处于备份域。因此,这些位在复位后处于写保护状态,只有在电源控制寄存器(PWR_CR)中的DBP位置’1’后才能对这些位进行改动。进一步信息请参考5.1节。这些位只能由备份域复位清除(见6.1.3节)。任何内部或外部复位都不会影响这些位。 ![]() RTC时钟选择LSI: ![]() RTC时钟使能: ![]() 设置分频系数: ![]() 代码如下:
|
梳理STM32芯片的内部架构
使用Nano板验证驱动SPI串口屏的颜色显示
【经验分享】基于STM32F103C8的 USB 外部flash虚拟U盘
【经验分享】基于STM32F103的NEC红外发送接收使用同一个定时器的一体设计
STM32F103的GPIO与DMA的终极(没啥用)玩法
蓝桥杯旧嵌入式板STM32F103RBT6驱动练习笔记
STM32F103RBT6型号说明
基于STM32F103C8T6的点灯设计
stm32f103测脉冲数用于带霍尔编码器的电机测速
STM32F103ZET6移植到STM32F103C8T6中