当前位置: 首页 > news >正文

【CS32L015C8T6】配置单片机时基TimeBase(内附完整代码及注释)

目录

前言

一、什么是时基TimeBase?

二、什么是SysTick(系统滴答)?

三、时基BaseTime和SysTick的联系和区别

1、联系:

2、区别:

四、以CS32L015为例配置系统时基

五、完整代码及注释

六、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~


前言:

        CS32L015 是一款内嵌 32 位 ARM® Cortex®-M0+内核的超低功耗微控制器,最高可运行在 24MHz,内置 64K 字节的嵌入式 Flash,8K 字节的 SRAM,集成了 12 位 1Msps 高精度 SAR 型 ADC、RTC、比较器、运算放大器、多路 UART、SPI、I2C、OWI 和 PWM 等丰富的外设接口,具有高整合度、高抗干扰、高可靠性的特点。

        当然,CS32L015最大的特点是性价比高,价格优惠使得它成为许多嵌入式产品的优先选择 。

一、什么是时基TimeBase?

        时基(Time Base)是指系统中用于提供时间基准的机制,通常通过一个定时器(如SysTick(默认选择)或基本/通用定时器)实现。它的核心功能是:

  1. 生成周期性中断:通过定时器的定时功能,定期触发中断,更新系统时间变量,扩展软件定时器功能。
  2. 支持系统级时间管理(如FreeRTOS):为延时函数、任务调度(RTOS)、超时检测等提供时间参考。
  3. 简化开发:开发者无需手动编写底层定时器代码,而是通过库函数或驱动直接调用时基功能。

        时基可以由以下硬件模块实现:

        1、SysTick(内核级定时器):默认选择,无需额外占用外设资源。

        2、基本/通用定时器(如TIMx):需手动配置,灵活性更高,但占用外设资源,通常会选择基本定时器。

        其中,使用时基来扩展软件定时器功能最为常见,由于SysTick只具备计数功能,不能用来扩展软件定时器,所以我们通常选择一个基本定时器来配置为嵌入式系统/裸机的时基单元。

二、什么是SysTick(系统滴答)?

        SysTick是ARM Cortex-M系列内核内置的24位递减计数器,属于内核的一部分。它的主要功能是:

        1、提供系统时间基准:通过周期性中断更新系统时间变量(如uwTick)。

        2、支持RTOS任务调度:作为实时操作系统的时间片轮转(Round Robin Scheduling)的基础。

        3、低功耗管理:在系统空闲时触发中断,唤醒处理器执行任务。

三、时基BaseTime和SysTick的联系和区别

联系:

        SysTick是时基的常见实现方式:在STM32等Cortex-M系列MCU中,默认使用SysTick作为时基。HAL库的HAL_InitTick()函数默认调用SysTick_Config()初始化时基。无论是SysTick还是通用定时器,都会更新同一个系统时间变量(如uwTick),供延时和任务调度使用。SysTick中断通常设置为最高优先级(确保及时响应),而通用定时器的中断优先级可灵活调整。

区别:

对比项

时基

SysTick

定义

系统时间基准的抽象概念(功能需求)

ARM Cortex-M内核内置的24位定时器(硬件模块)

实现方式

可由SysTick或通用定时器实现

仅由SysTick硬件实现

资源占用

依赖具体实现方式(SysTick无需占用外设资源)

无需占用外设资源(内核级硬件)

配置灵活性

通用定时器更灵活(可选择时钟源、通道等)

配置受限(仅支持24位计数器、固定寄存器)

中断优先级

通常由用户配置(通用定时器可自定义)

默认设置为最高优先级(确保系统时间准确性)

适用场景

系统延时、RTOS调度、通用定时

系统级时间管理、RTOS核心功能

四、以CS32L015为例配置系统时基

配置时基的流程:

        1、开启TimeBase时钟使能

        2、选择定时器,一般选择基本定时器作为时基就可以,能够扩展软件定时器

        3、创建并设置时基初始化结构体

        4、设置时基定时器中断优先级

        5、链接设置中断回调函数

        6、启动时基定时器中断

五、完整代码及注释:

BASETIM_HandleTypeDef	htim10 = {0};	//选择TIM10作为时基定时器,扩展软件定时器/*****************************************************************************
[函数名称]MX_BASETIM_Init
[函数功能]时基初始化函数
[参    数]
[备    注]
*****************************************************************************/
void MX_BASETIM_Init(void)
{__HAL_RCC_BASETIM_CLK_ENABLE();			//开启时基时钟功能htim10.Instance          = TIM10; 	//选择定时器htim10.Init.TogEnable    = BASETIM_TOG_DISABLE;		//关闭TOG外设GPIO口反转功能htim10.Init.CntTimSel    = BASETIM_TIMER_SELECT;	//选择定时器功能htim10.Init.AutoReload   = BASETIM_AUTORELOAD_ENABLE;	//选择自动装载htim10.Init.MaxCntLevel  = BASETIM_MAXCNTLEVEL_16BIT;	//选择最大值计数水平htim10.Init.OneShot      = BASETIM_REPEAT_MODE;		//选择重复计数模式htim10.Init.Prescaler    = BASETIM_PRESCALER_DIV1;	//选择不分频htim10.Init.Period = BASETIM_MAXCNTVALUE_16BIT - HAL_RCC_GetPCLKFreq() / FREQ;HAL_BASETIM_Base_Init(&htim10);		//初始化时基时钟HAL_NVIC_SetPriority( TIM10_IRQn, 1);	//设置优先级HAL_NVIC_EnableIRQ( TIM10_IRQn );		//开启中断HAL_TIM_Base_Start_IT(&htim10);         //开启中断
}//TIM10基本定时器作为BaseTime,链接TIM10中断回调函数和时基中断函数	
void TIM10_IRQHandler(void)	
{HAL_BASETIM_IRQHandler(&htim10);    //通过 TIM10_IRQHandler 中断函数回调时基函数
}

六、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~

http://www.xdnf.cn/news/1459927.html

相关文章:

  • Mysql杂志(九)
  • [frontend]WebGL是啥?
  • AI入坑: Trae 通过http调用.net 开发的 mcp server
  • 批量生成角色及动画-统一角色为Mixamo骨骼(一)
  • Qt实现2048小游戏:看看AI如何评估棋盘策略实现“人机合一
  • 对于数据结构:链表的超详细保姆级解析
  • Java Thread线程2—线程锁synchronized,Lock,volatile
  • Python学习3.0使用Unittest框架运行测试用例
  • 无人机防风技术难点解析
  • TDengine TIMETRUNCATE 函数用户使用手册
  • Netty从0到1系列之Buffer【下】
  • 2025年百度商业AI技术创新大赛赛道二:视频广告生成推理性能优化-初赛第五名,复赛第九名方案分享
  • JVM 运行时数据区域
  • java面试中经常会问到的dubbo问题有哪些(基础版)
  • JVM 类加载全过程
  • Node-RED服务成本/价格很高?那这不到“三张”的怎么说?
  • QT卡顿的可能原因
  • TP8 数组在模板html文件中输出json字符串格式{“0“:“x1“,“1“:“x2“,“2“:“x3“}
  • 在Spring MVC中使用查询字符串与参数
  • 2025市面上比较实用的财会行业证书,最值得考的8个职业证书推荐
  • 本地部署开源数据生成器项目实战指南
  • HarmonyOS应用开发之界面列表不刷新问题Bug排查记:从现象到解决完整记录
  • JS函数进阶
  • Roo Code之自定义指令(Custom Instructions),规则(Rules)
  • 硬盘分区格式化后产生了哪些变化
  • OpenStack VLAN网络类型实训案例
  • 机器学习:后篇
  • LangChain4j的初步学习【逐步添加中】
  • 强化学习DQN解决Cart_Pole问题
  • claude code route 使用教程|命令大全