RISC-V MCU应用教程之定时器中断

简介

CH32V103系列是以青稞V3A处理器为核心的32位通用MCU,该处理器是基于RISC-V开源指令集设计。片上集成了时钟安全机制、多级电源管理、通用DMA控制器。此系列具有1路USB2.0主机/设备接口、多通道12位ADC转换模块、多通道TouchKey、多组定时器、多路IIC/USART/SPI接口等丰富的外设资源。

 

本章教程通过CH32V103开发板板载两个LED灯显示程序运行状态,具体情况如下:

1)串口调式助手大约每隔500ms打印一次”Enter interrupt“;

2)开发板上LED1LED2不停闪烁,其中,LED1闪烁较快,大约为100ms一次;LED2闪烁较慢,大约为500ms闪烁一次。

1TIM简介及相关函数介绍

CH32V103定时器包含1个高级16位定时器、3个通用16位定时器,以及2个看门狗定时器和1个系统时基定时器。

高级控制定时器(TIM1)是一个 16 位的自动装载计数器,具有可编程的预分频器。除了完整的通用定时器功能外, 可以被看成是分配到 6 个通道的三相 PWM 发生器, 具有带死区插入的互补 PWM 输出功能,允许在指定数目的计数器周期之后更新定时器进行重复计数周期,刹车功能等。高级控制定时器的很多功能都与通用定时器相同,内部结构也相同,因此高级控制定时器可以通过定时器链接功能与 TIM 定时器协同操作,提供同步或事件链接功能。

通用定时器(TIM2TIM3TIM4),其可同步运行,每个定时器都有一个 16 位的自动装载递加/递减计数器、一个可编程的 16 位预分频器和 4 个独立的通道,每个通道都可用于输入捕获、输出比较、 PWM 生成和单脉冲模式输出。其能通过定时器链接功能与高级控制定时器共同工作,提供同步或事件链接功能。在调试模式下,计数器可以被冻结,同时 PWM 输出被禁止,从而切断由这些输出所控制的开关。 任意通用定时器都能用于产生 PWM 输出。每个定时器都有独立的 DMA 请求机制。这些定时器还能够处理增量编码器的信号,也能处理 1 3 个霍尔传感器的数字输出。

系统时基定时器(SysTick),这是内核控制器自带的一个定时器,用于产生 SYSTICK 异常,可专用于实时操作系统,为系统提供“心跳”节律,也可当成一个标准的64位递增计数器。以AHB时钟的8分频为基准时钟源。当计数器递增到设置比较值时,产生一个可屏蔽系统中断。关于2个看门狗定时器,在前面教程有过介绍,在此不做过多赘述。

关于CH32V103定时器具体信息及其相关功能和实现等,可参考CH32V103数据手册和应用手册。本章教程主要通过CH32V103通用定时器TIM3编写一个定时器中断程序,并下载到开发板进行验证,程序编写所需相关函数在库函数中进行调用,库函数文件中函数介绍如下:

 

1.1void TIM_DeInit(TIM_TypeDef* TIMx)

 能:将TIMx外围寄存器初始化为其默认重置值。

 入:无

 

1.2void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)

 能:根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx时基单元外围设备。

 入:TIMx:其中x可以是14来选择TIM外围设备;TimeBaseInitStruct:指向TIM_TimeBaseInitTypeDef结构的指针。

 

1.3void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)

 能:根据TIM_OCInitStruct中指定的参数初始化TIMx Channel1

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_OCInitStruct:指向TIM_OCInitTypeDef结构的指针。

 

1.4void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)

 能:根据TIM_ICInitStruct中指定的参数初始化TIM外围设备。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_ICInitStruct:指向TIM_ICInitTypeDef结构的指针。

1.5void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)

 能:根据TIM结构中的指定参数配置TIM外围设备,以测量外部PWM信号。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_ICInitStruct:指向TIM_ICInitTypeDef结构的指针。

 

1.6void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct)

 能:配置:中断特性、死区时间、锁定级别、OSSIOSSR状态和AOE(自动输出启用)。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_BDTRInitStruct:指向TIM_BDTRInitTypeDef结构的指针。

 

1.7void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)

 能:用默认值填充每个TIM_TimeBaseInitStruct成员。

 入:TimeBaseInitStruct:指向TIM_TimeBaseInitTypeDef结构的指针。

 

1.8void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct)

 能:用默认值填充每个TIM_OCInitStruct成员。

 入:TIM_OCInitStruct:指向TIM_OCInitTypeDef结构的指针。

 

1.9void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct)

 能:用其默认值填充每个TIM_ICInitStruct成员。

 入:TIM_ICInitStruct:指向TIM_ICInitTypeDef结构的指针。

 

1.10void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct)

 能:用默认值填充每个TIM_BDTRInitStruct成员。

 入:TIM_BDTRInitStruct:指向TIM_BDTRInitTypeDef结构的指针。

 

1.11void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

 能:启用或禁用指定的TIM外围设备。

 入:TIMx:其中x可以是14来选择TIM外围设备;NewState:启用或禁用。

 

1.12void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState)

 能:启用或禁用TIM外围设备主输出。

 入:TIMx:其中x可以是14来选择TIM外围设备;NewState:启用或禁用。

 

1.13void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)

 能:启用或禁用指定的TIM中断。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_IT:指定要启用或禁用的TIM中断源;NewState:启用或禁用。

 

1.14void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource)

 能:将TIMx外围寄存器初始化为其默认重置值。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_EventSource:指定事件源。

 

1.15void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength)

 能:配置TIMxDMA接口。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_DMABaseDMA基址;TIM_DMABurstLengthDMA突发长度。

 

1.16void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState)

 能:启用或禁用TIMxDMA请求。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_DMASource:指定DMA请求源;NewState:启用或禁用。

 

1.17void TIM_InternalClockConfig(TIM_TypeDef* TIMx)

 能:配置TIMx内部时钟。

 入:TIMx:其中x可以是14来选择TIM外围设备。

 

1.18void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)

 能:将TIMx内部触发器配置为外部时钟。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_InputTriggerSource:触发源。

 

1.19void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter)

 能:将TIMx触发器配置为外部时钟。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_TIxExternalCLKSource: 触发器源;ICFilter:指定过滤器值。此参数的值必须介于0x00xF之间。

 

1.20void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter)

 能:配置外部时钟模式1

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_ExtTRGPrescaler:外部触发预分频器;TIM_ExtTRGPolarity:外部触发极性;ExtTRGFilter:外部触发器筛选器。

 

1.21void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter)

 能:配置TIMx外部触发器(ETR)。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_ExtTRGPrescaler:外部触发预分频器;TIM_ExtTRGPolarity:外部触发极性;ExtTRGFilter:外部触发器筛选器。

 

1.22void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode)

 能:配置TIMx预分频器。

 入:TIMx:其中x可以是14来选择TIM外围设备;Prescaler:指定预分频器寄存器值;TIM_PSCReloadMode:指定TIM预分频器重新加载模式。

 

1.23void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode)

 能:指定要使用的TIMx计数器模式。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_CounterMode:指定要使用的计数器模式。

 

1.24void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)

 能:选择输入触发源。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_InputTriggerSource:输入触发源。

 

1.25void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)

 能:配置TIMx编码器接口。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_EncoderMode:指定TIMx编码器模式;TIM_IC1Polarity:指定IC1极性;TIM_IC2Polarity:指定IC2极性。

 

1.26void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)

 能:强制TIMx输出1波形为激活或非激活电平。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_ForcedAction:指定要设置为输出波形的强制操作。

 

1.27void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)

 能:在ARR上启用或禁用TIMx外设预加载寄存器。

 入:TIMx:其中x可以是14来选择TIM外围设备;NewState:启用或禁用。

 

1.28void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState)

 能:选择TIM外围换向事件。

 入:TIMx:其中x可以是14来选择TIM外围设备;NewState:启用或禁用。

 

1.29void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState)

 能:选择TIMx外围捕获比较DMA源。

 入:TIMx:其中x可以是14来选择TIM外围设备;NewState:启用或禁用。

 

1.30void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState)

 能:设置或重置TIM外围捕获比较预加载控制位。

 入:TIMx:其中x可以是14来选择TIM外围设备;NewState:启用或禁用。

 

1.31void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)

 能:启用或禁用CCR1上的TIMx外围预加载寄存器。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_OCPreloadTIMx外围预加载寄存器的新状态。

 

1.32void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)

 能:配置TIMx输出比较1快速功能。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_OCFast:输出比较快速启用位的新状态。

 

1.33void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)

 能:清除或保护外部事件上的OCREF1信号。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_OCClear:输出比较清除启用位的新状态。

 

1.34void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)

 能:配置TIMx通道1极性。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_OCPolarity:指定OC1极性。

 

1.35void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity)

 能:配置TIMx通道1极性。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_OCNPolarity:指定OC1N极性。

 

1.36void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx)

 能:启用或禁用TIM捕获比较通道x

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_Channel:指定TIM通道;TIM_CCx:指定TIM信道CCxE位的新状态。

 

1.37void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN)

 能:启用或禁用TIM捕获比较通道xN

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_Channel:指定TIM通道;TIM_CCxN:指定TIM信道CCxNE位的新状态。

 

1.38void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode)

 能:选择TIM输出比较模式。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_Channel:指定TIM通道;TIM_OCMODE:指定TIM输出比较模式。

 

1.39void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState)

 能:启用或禁用TIMx更新事件。

 入:TIMx:其中x可以是14来选择TIM外围设备;NewState:启用或禁用。

 

1.40void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource)

 能:配置TIMx更新请求中断源。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_UpdateSource:指定更新源。

 

1.41void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState)

 能:启用或禁用TIMx的霍尔传感器接口。

 入:TIMx:其中x可以是14来选择TIM外围设备;NewState:启用或禁用。

 

1.42void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode)

 能:选择TIMx的单脉冲模式。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_OPMode:指定要使用的OPM模式。

 

1.43void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource)

 能:选择TIMx触发器输出模式。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_TRGOSource:指定触发器输出源。

 

1.44void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode)

 能:选择TIMx从机模式。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_SlaveMode:指定定时器从模式。

 

1.45void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode)

 能:设置或重置TIMx/从模式。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_MasterSlaveMode:指定定时器主从模式。

 

1.46void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter)

 能:设置TIMx计数器寄存器值。

 入:TIMx:其中x可以是14来选择TIM外围设备;Counter:指定计数器寄存器的新值。

 

1.47void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload)

 能:设置TIMx自动重新加载寄存器值。

 入:TIMx:其中x可以是14来选择TIM外围设备;Autoreload:指定Autoreload寄存器的新值。

 

1.48void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)

 能:设置TIMx捕获比较1寄存器值。

 入:TIMx:其中x可以是14来选择TIM外围设备;Compare1:指定捕获Compare1寄存器的新值。

 

1.49void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)

 能:设置TIMx输入捕捉1预分频器。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_ICPSC:指定输入Capture1预分频器的新值。

 

1.50void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD)

 能:设置TIMx时钟刻度值。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_CKD:指定时钟分频值。

 

1.51uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx)

 能:获取TIMx输入捕获1的值。

 入:TIMx:其中x可以是14来选择TIM外围设备。

 

1.52uint16_t TIM_GetCounter(TIM_TypeDef* TIMx)

 能:获取TIMx计数器值。

 入:TIMx:其中x可以是14来选择TIM外围设备。

 

1.53uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx)

 能:获取TIMx预分频器值。

 入:TIMx:其中x可以是14来选择TIM外围设备。

 

1.54FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)

 能:检查是否设置了指定的TIM标志。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_FLAG:指定要检查的标志。

 

1.55void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)

 能:清除TIMx的挂起标志。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_FLAG:指定要清除的标志位。

 

1.56ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)

 能:检查TIM中断是否发生。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_IT:指定要检查的TIM中断源。

 

1.57void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)

 能:清除TIMx的中断挂起的位。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_IT:指定要清除的挂起位。

 

1.58static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,uint16_t TIM_ICFilter)

 能:将TI1配置为输入。

 入:TIMx:其中x可以是14来选择TIM外围设备;TIM_ICPolarity:输入极性;TIM_ICSelection:指定要使用的输入;TIM_ICFilter:指定输入捕获筛选器。

 

以上函数均为库函数内部函数,在进行使用时只需在程序中进行调用即可。

 

2、硬件设计

本章教程通过定时器中断控制LED灯闪烁,其中,定时器为CH32V103内部资源,无需进行硬件设计,只需进行LED连接即可,LEDGPIO引脚连接方式如下:

LED1PA0连接;

LED2PA1连接。

 

3、软件设计

本章教程主要通过定时器中断控制LED灯闪烁,其中,led.c文件与led.h文件前面GPIO教程中已讲解,在此不再介绍,本章主要介绍time.h文件、time.c文件以及main.c文件,具体程序如下:

time.h文件

 

time.h文件主要是定时器初始化配置函数的声明。

time.c文件

 

 

4、下载验证

将编译好的程序下载到开发板并复位,可以看到开发板两个LED灯闪烁,其中,LED1闪烁较快,LED2闪烁较慢。同时,串口调试助手打印显示:Enter interrupt,表示程序进入中断,大约500ms打印一次。串口调试助手打印显示如下:

 

 

posted @   喵喵喵mmm  阅读(205)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示