簡介
CH32V103系列是以青稞V3A處理器為核心的32位通用MCU,該處理器是基于RISC-V開源指令集設計。 片上集成了時鐘安全機制、多級電源管理、通用DMA控制器。 此系列具有1路USB2.0主機/設備接口、多通道12位ADC轉換模塊、多通道TouchKey、多組定時器、多路IIC/USART/SPI接口等豐富的外設資源。
本章教程通過CH32V103開發板板載兩個LED燈顯示程序運行狀態,具體情況如下:
(1)串口調式助手大約每隔500ms打印一次”Enter interrupt“;
(2)開發板上LED1與LED2不停閃爍,其中,LED1閃爍較快,大約為100ms一次; LED2閃爍較慢,大約為500ms閃爍一次。
1、TIM簡介及相關函數介紹
CH32V103定時器包含1個高級16位定時器、3個通用16位定時器,以及2個看門狗定時器和1個系統時基定時器。
高級控制定時器(TIM1)是一個 16 位的自動裝載計數器,具有可編程的預分頻器。 除了完整的通用定時器功能外, 可以被看成是分配到 6 個通道的三相 PWM 發生器, 具有帶死區插入的互補 PWM 輸出功能,允許在指定數目的計數器周期之后更新定時器進行重復計數周期,剎車功能等。 高級控制定時器的很多功能都與通用定時器相同,內部結構也相同,因此高級控制定時器可以通過定時器鏈接功能與 TIM 定時器協同操作,提供同步或事件鏈接功能。
通用定時器(TIM2、TIM3和TIM4),其可同步運行,每個定時器都有一個 16 位的自動裝載遞加/遞減計數器、一個可編程的 16 位預分頻器和 4 個獨立的通道,每個通道都可用于輸入捕獲、輸出比較、 PWM 生成和單脈沖模式輸出。 其能通過定時器鏈接功能與高級控制定時器共同工作,提供同步或事件鏈接功能。 在調試模式下,計數器可以被凍結,同時 PWM 輸出被禁止,從而切斷由這些輸出所控制的開關。 任意通用定時器都能用于產生 PWM 輸出。 每個定時器都有獨立的 DMA 請求機制。 這些定時器還能夠處理增量編碼器的信號,也能處理 1 至 3 個霍爾傳感器的數字輸出。
系統時基定時器(SysTick),這是內核控制器自帶的一個定時器,用于產生 SYSTICK 異常,可專用于實時操作系統,為系統提供“心跳”節律,也可當成一個標準的64位遞增計數器。 以AHB時鐘的8分頻為基準時鐘源。 當計數器遞增到設置比較值時,產生一個可屏蔽系統中斷。 關于2個看門狗定時器,在前面教程有過介紹,在此不做過多贅述。
關于CH32V103定時器具體信息及其相關功能和實現等,可參考CH32V103數據手冊和應用手冊。 本章教程主要通過CH32V103通用定時器TIM3編寫一個定時器中斷程序,并下載到開發板進行驗證,程序編寫所需相關函數在庫函數中進行調用,庫函數文件中函數介紹如下:
1.1、無效TIM_DeInit(TIM_TypeDef* TIMx)
功 能:將TIMx外圍寄存器初始化為其默認重置值。
輸 入:無
1.2、無效TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
功 能:根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx時基單元外圍設備。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TimeBaseInitStruct:指向TIM_TimeBaseInitTypeDef結構的指針。
1.3、無效TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
功 能:根據TIM_OCInitStruct中指定的參數初始化TIMx Channel1。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_OCInitStruct:指向TIM_OCInitTypeDef結構的指針。
1.4、無效TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)
功 能:根據TIM_ICInitStruct中指定的參數初始化TIM外圍設備。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_ICInitStruct:指向TIM_ICInitTypeDef結構的指針。
1.5、無效TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)
功 能:根據TIM結構中的指定參數配置TIM外圍設備,以測量外部PWM信號。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_ICInitStruct:指向TIM_ICInitTypeDef結構的指針。
1.6、無效TIM_BDTRConfig(TIM_TypeDef* TIMx,TIM_BDTRInitTypeDef *TIM_BDTRInitStruct)
功 能:配置:中斷特性、死區時間、鎖定級別、OSSI、OSSR狀態和AOE(自動輸出啟用)。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_BDTRInitStruct:指向TIM_BDTRInitTypeDef結構的指針。
1.7、無效TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
功 能:用默認值填充每個TIM_TimeBaseInitStruct成員。
輸 入:TimeBaseInitStruct:指向TIM_TimeBaseInitTypeDef結構的指針。
1.8、無效TIM_OCStructInit(TIM_OCInitTypeDef*TIM_OCInitStruct)
功 能:用默認值填充每個TIM_OCInitStruct成員。
輸 入:TIM_OCInitStruct:指向TIM_OCInitTypeDef結構的指針。
1.9、無效TIM_ICStructInit(TIM_ICInitTypeDef*TIM_ICInitStruct)
功 能:用其默認值填充每個TIM_ICInitStruct成員。
輸 入:TIM_ICInitStruct:指向TIM_ICInitTypeDef結構的指針。
1.10、無效TIM_BDTRStructInit(TIM_BDTRInitTypeDef*TIM_BDTRInitStruct)
功 能:用默認值填充每個TIM_BDTRInitStruct成員。
輸 入:TIM_BDTRInitStruct:指向TIM_BDTRInitTypeDef結構的指針。
1.11、void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
功 能:啟用或禁用指定的TIM外圍設備。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; NewState:啟用或禁用。
1.12、void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState)
功 能:啟用或禁用TIM外圍設備主輸出。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; NewState:啟用或禁用。
1.13、void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
功 能:啟用或禁用指定的TIM中斷。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_IT:指定要啟用或禁用的TIM中斷源; NewState:啟用或禁用。
1.14、無效TIM_GenerateEvent(TIM_TypeDef* TIMx,uint16_t TIM_EventSource)
功 能:將TIMx外圍寄存器初始化為其默認重置值。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_EventSource:指定事件源。
1.15、無效TIM_DMAConfig(TIM_TypeDef* TIMx、uint16_t TIM_DMABase、uint16_t TIM_DMABurstLength)
功 能:配置TIMx的DMA接口。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_DMABase:DMA基址; TIM_DMABurstLength:DMA突發長度。
1.16、void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState)
功 能:啟用或禁用TIMx的DMA請求。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_DMASource:指定DMA請求源; NewState:啟用或禁用。
1.17、無效TIM_InternalClockConfig(TIM_TypeDef* TIMx)
功 能:配置TIMx內部時鐘。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備。
1.18、無效TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx,uint16_t TIM_InputTriggerSource)
功 能:將TIMx內部觸發器配置為外部時鐘。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_InputTriggerSource:觸發源。
1.19、無效TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx、uint16_t TIM_TIxExternalCLKSource、uint16_t TIM_ICPolarity uint16_t ICFilter)
功 能:將TIMx觸發器配置為外部時鐘。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_TIxExternalCLKSource: 觸發器源; ICFilter:指定過濾器值。 此參數的值必須介于0x0和0xF之間。
1.20、void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter)
功 能:配置外部時鐘模式1。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_ExtTRGPrescaler:外部觸發預分頻器; TIM_ExtTRGPolarity:外部觸發極性; ExtTRGFilter:外部觸發器篩選器。
1.21、void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter)
功 能:配置TIMx外部觸發器(ETR)。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_ExtTRGPrescaler:外部觸發預分頻器; TIM_ExtTRGPolarity:外部觸發極性; ExtTRGFilter:外部觸發器篩選器。
1.22、無效TIM_PrescalerConfig(TIM_TypeDef* TIMx、uint16_t預分頻器、uint16_t TIM_PSCReloadMode)
功 能:配置TIMx預分頻器。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; Prescaler:指定預分頻器寄存器值; TIM_PSCReloadMode:指定TIM預分頻器重新加載模式。
1.23、無效TIM_CounterModeConfig(TIM_TypeDef* TIMx,uint16_t TIM_CounterMode)
功 能:指定要使用的TIMx計數器模式。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_CounterMode:指定要使用的計數器模式。
1.24、無效TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)
功 能:選擇輸入觸發源。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_InputTriggerSource:輸入觸發源。
1.25、void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)
功 能:配置TIMx編碼器接口。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_EncoderMode:指定TIMx編碼器模式;TIM_IC1Polarity:指定IC1極性;TIM_IC2Polarity:指定IC2極性。
1.26、void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
功 能:強制TIMx輸出1波形為激活或非激活電平。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_ForcedAction:指定要設置為輸出波形的強制操作。
1.27、void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)
功 能:在ARR上啟用或禁用TIMx外設預加載寄存器。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;NewState:啟用或禁用。
1.28、void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState)
功 能:選擇TIM外圍換向事件。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;NewState:啟用或禁用。
1.29、void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState)
功 能:選擇TIMx外圍捕獲比較DMA源。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;NewState:啟用或禁用。
1.30、void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState)
功 能:設置或重置TIM外圍捕獲比較預加載控制位。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;NewState:啟用或禁用。
1.31、void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)
功 能:啟用或禁用CCR1上的TIMx外圍預加載寄存器。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_OCPreload:TIMx外圍預加載寄存器的新狀態。
1.32、void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)
功 能:配置TIMx輸出比較1快速功能。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_OCFast:輸出比較快速啟用位的新狀態。
1.33、void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)
功 能:清除或保護外部事件上的OCREF1信號。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_OCClear:輸出比較清除啟用位的新狀態。
1.34、void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)
功 能:配置TIMx通道1極性。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_OCPolarity:指定OC1極性。
1.35、void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity)
功 能:配置TIMx通道1極性。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_OCNPolarity:指定OC1N極性。
1.36、無效TIM_CCxCmd(TIM_TypeDef* TIMx、uint16_t TIM_Channel、uint16_t TIM_CCx)
功 能:啟用或禁用TIM捕獲比較通道x。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_Channel:指定TIM通道; TIM_CCx:指定TIM信道CCxE位的新狀態。
1.37、無效TIM_CCxNCmd(TIM_TypeDef* TIMx、uint16_t TIM_Channel、uint16_t TIM_CCxN)
功 能:啟用或禁用TIM捕獲比較通道xN。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_Channel:指定TIM通道; TIM_CCxN:指定TIM信道CCxNE位的新狀態。
1.38、無效TIM_SelectOCxM(TIM_TypeDef* TIMx、uint16_t TIM_Channel、uint16_t TIM_OCMode)
功 能:選擇TIM輸出比較模式。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; TIM_Channel:指定TIM通道; TIM_OCMODE:指定TIM輸出比較模式。
1.39、無效TIM_UpdateDisableConfig(TIM_TypeDef* TIMx,函數狀態新狀態)
功 能:啟用或禁用TIMx更新事件。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備; NewState:啟用或禁用。
1.40、無效TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource)
功 能:配置TIMx更新請求中斷源。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_UpdateSource:指定更新源。
1.41、void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState)
功 能:啟用或禁用TIMx的霍爾傳感器接口。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;NewState:啟用或禁用。
1.42、void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode)
功 能:選擇TIMx的單脈沖模式。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_OPMode:指定要使用的OPM模式。
1.43、void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource)
功 能:選擇TIMx觸發器輸出模式。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_TRGOSource:指定觸發器輸出源。
1.44、void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode)
功 能:選擇TIMx從機模式。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_SlaveMode:指定定時器從模式。
1.45、void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode)
功 能:設置或重置TIMx主/從模式。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_MasterSlaveMode:指定定時器主從模式。
1.46、void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter)
功 能:設置TIMx計數器寄存器值。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;Counter:指定計數器寄存器的新值。
1.47、void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload)
功 能:設置TIMx自動重新加載寄存器值。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;Autoreload:指定Autoreload寄存器的新值。
1.48、void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)
功 能:設置TIMx捕獲比較1寄存器值。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;Compare1:指定捕獲Compare1寄存器的新值。
1.49、void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)
功 能:設置TIMx輸入捕捉1預分頻器。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_ICPSC:指定輸入Capture1預分頻器的新值。
1.50、void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD)
功 能:設置TIMx時鐘刻度值。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_CKD:指定時鐘分頻值。
1.51、uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx)
功 能:獲取TIMx輸入捕獲1的值。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備。
1.52、uint16_t TIM_GetCounter(TIM_TypeDef* TIMx)
功 能:獲取TIMx計數器值。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備。
1.53、uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx)
功 能:獲取TIMx預分頻器值。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備。
1.54、FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)
功 能:檢查是否設置了指定的TIM標志。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_FLAG:指定要檢查的標志。
1.55、void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)
功 能:清除TIMx的掛起標志。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_FLAG:指定要清除的標志位。
1.56、ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
功 能:檢查TIM中斷是否發生。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_IT:指定要檢查的TIM中斷源。
1.57、void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)
功 能:清除TIMx的中斷掛起的位。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_IT:指定要清除的掛起位。
1.58、static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,uint16_t TIM_ICFilter)
功 能:將TI1配置為輸入。
輸 入:TIMx:其中x可以是1到4來選擇TIM外圍設備;TIM_ICPolarity:輸入極性;TIM_ICSelection:指定要使用的輸入;TIM_ICFilter:指定輸入捕獲篩選器。
以上函數均為庫函數內部函數,在進行使用時只需在程序中進行調用即可。
2、硬件設計
本章教程通過定時器中斷控制LED燈閃爍,其中,定時器為CH32V103內部資源,無需進行硬件設計,只需進行LED連接即可,LED與GPIO引腳連接方式如下:
LED1與PA0連接;
LED2與PA1連接。
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打印一次。串口調試助手打印顯示如下:
-
led
+關注
關注
242文章
23252瀏覽量
660573 -
mcu
+關注
關注
146文章
17123瀏覽量
350991 -
定時器
+關注
關注
23文章
3246瀏覽量
114719 -
RISC-V
+關注
關注
45文章
2270瀏覽量
46129 -
CH32V103
+關注
關注
1文章
13瀏覽量
1009 -
ch32
+關注
關注
0文章
73瀏覽量
637
發布評論請先 登錄
相關推薦
評論