【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(默认选择)或基本/通用定时器)实现。它的核心功能是:
- 生成周期性中断:通过定时器的定时功能,定期触发中断,更新系统时间变量,扩展软件定时器功能。
- 支持系统级时间管理(如FreeRTOS):为延时函数、任务调度(RTOS)、超时检测等提供时间参考。
- 简化开发:开发者无需手动编写底层定时器代码,而是通过库函数或驱动直接调用时基功能。
时基可以由以下硬件模块实现:
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 中断函数回调时基函数
}