草帽王子 发表于 2021-6-10 20:28:31

第九十六章、CH32V103应用教程——SysTick中断

本章教程主要进行SysTick中断简单的应用。

1、SysTick简介

CH32V103为RISC-V3A内核,与Cortex-M3内核不同,RISC-V3A内核自带了一个64位自增型计数器(SysTick),支持HCLK/8作为时基,具有较高优先级,校准后可用于时间基准。

SysTick寄存器如下图所示,主要为5个寄存器,关于各个寄存器的具体介绍,可参考CH32V103应用手册。

在此处需要注意的是,关于CH32V103触发STK中断服务,当CNT与CMP值相等时将触发STK中断服务。


2、硬件设计

本章教程主要讲解如何进入SysTick中断,SysTick属于单片机内部外设,无需进行外部硬件设计。

3、软件设计

本章教程具体程序如下:
systick.h文件
#ifndef __SYSTICK_H
#define __SYSTICK_H

#include "ch32v10x_conf.h"

void Systick_Init(void);

#endifsystick.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与CMP值相等时将触发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、下载验证

将编译好的程序下载到开发版并复位,串口打印如下:


95、SysTick.rar
链接:https://pan.baidu.com/s/1UNqh3V83KNJ41PLsPOHyGA
提取码:fbo2
复制这段内容后打开百度网盘手机App,操作更方便哦


页: [1]
查看完整版本: 第九十六章、CH32V103应用教程——SysTick中断