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、下载验证 将编译好的程序下载到开发版并复位,串口打印如下:
|