CH32V103应用教程——SysTick中断
本章教程主要进行SysTick中断简单的应用。
1、SysTick简介 CH32V103为RISC-V3A内核,与Cortex-M3内核不同,RISC-V3A内核自带了一个64位自增型计数器(SysTick),支持HCLK/8作为时基,具有较高优先级,校准后可用于时间基准。 SysTick寄存器如下图所示,主要为5个寄存器,关于各个寄存器的具体介绍,可参考CH32V103应用手册。 在此处需要注意的是,关于CH32V103触发STK中断服务,当CNT[63:0]与CMP[63:0]值相等时将触发STK中断服务。
2、硬件设计 本章教程主要讲解如何进入SysTick中断,SysTick属于单片机内部外设,无需进行外部硬件设计。
3、软件设计 本章教程具体程序如下: systick.h文件 - #ifndef __SYSTICK_H
- #define __SYSTICK_H
- #include "ch32v10x_conf.h"
- void Systick_Init(void);
- #endif
systick.h文件主要进行相关定义和函数声明; systick.c文件
- #include "systick.h"
- void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
- __IO uint32_t Counter;
- //SysTick初始化配置
- static uint32_t SysTick_Config(uint32_t ticks)
- {
- SysTick->CTLR = 0x0000; //关闭系统计数器STK,计数器停止计数
- //设置系统计数器寄存器的值
- //系统计数器低位寄存器
- SysTick->CNTL0 = 0;
- SysTick->CNTL1 = 0;
- SysTick->CNTL2 = 0;
- SysTick->CNTL3 = 0;
- //系统计数器高位寄存器
- SysTick->CNTH0 = 0;
- SysTick->CNTH1 = 0;
- SysTick->CNTH2 = 0;
- SysTick->CNTH3 = 0;
- //设置计数比较寄存器的值,主要用于触发STK中断服务函数。当CNT[63:0]与CMP[63:0]值相等时将触发STK中断服务。
- //设置计数比较低位寄存器的值
- SysTick->CMPLR0 = (u8)(ticks & 0xFF);
- SysTick->CMPLR1 = (u8)(ticks >> 8);
- SysTick->CMPLR2 = (u8)(ticks >> 16);
- SysTick->CMPLR3 = (u8)(ticks >> 24);
- //设置计数比较高位寄存器的值
- SysTick->CMPHR0 = 0;
- SysTick->CMPHR1 = 0;
- SysTick->CMPHR2 = 0;
- SysTick->CMPHR3 = 0;
- NVIC_SetPriority(SysTicK_IRQn, 15); //设置SysTick中断优先级
- NVIC_EnableIRQ(SysTicK_IRQn); //使能开启Systick中断
- SysTick->CTLR = 0x0001; //启动系统计数器STK(HCLK/8时基) 72000000/8=9000000
- return (0);
- }
- void Systick_Init(void)
- {
- //此处在进行初始化的时候设置比较寄存器的值
- SysTick_Config(SystemCoreClock / 8000);//1ms 72M/8000/9000000 = 1/1000 = 1ms
- }
- //关于STK中断服务函数,由于STK的时基为HCLK/8,且在SysTick初始化配置中设置比较寄存器的值为SystemCoreClock / 8000 = 9000,由此计算的每隔1ms触发1次中断服务函数
- void SysTick_Handler(void)
- {
- //设置系统计数器寄存器的值
- //系统计数器低位寄存器
- SysTick->CNTL0 = 0;
- SysTick->CNTL1 = 0;
- SysTick->CNTL2 = 0;
- SysTick->CNTL3 = 0;
- //系统计数器高位寄存器
- SysTick->CNTH0 = 0;
- SysTick->CNTH1 = 0;
- SysTick->CNTH2 = 0;
- SysTick->CNTH3 = 0;
- Counter ++;
- if(Counter >= 1000)
- {
- Counter = 0;
- }
- }
tim.c文件主要进行SysTick中断初始化配置以及中断服务函数处理,关于具体讲解见程序注释。 main.c文件 - #include "debug.h"
- #include "systick.h"
- extern __IO uint32_t Counter;
- /*******************************************************************************
- * Function Name : main
- * Description : Main program.
- * Input : None
- * Return : None
- *******************************************************************************/
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- //Delay_Init();
- USART_Printf_Init(115200);
- printf("SystemClk:%d\r\n",SystemCoreClock);
- printf("This is printf example\r\n");
- Systick_Init();
- while(1)
- {
- printf("Counter:%d\r\n", Counter);
- }
- }
main.c文件主要进行函数初始化以及打印输出相关值。
4、下载验证 将编译好的程序下载到开发版并复位,串口打印如下:
|