打印
[RISC-V MCU 应用开发]

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

[复制链接]
7567|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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下载验证
将编译好的程序下载到开发版并复位,串口打印如下:

95、SysTick.rar

453.18 KB

使用特权

评论回复

相关帖子

沙发
两只袜子| | 2021-5-28 08:56 | 只看该作者
个人认为还是很不错的教程,有空研究一下

使用特权

评论回复
板凳
jcky001| | 2021-5-28 08:57 | 只看该作者
版主分享的应用教程非常不错啊

使用特权

评论回复
地板
pattywu| | 2022-1-22 10:16 | 只看该作者
这个SysTick,设计的太差,当OS用时,指令用的太多,时钟周期过多,不适合用来当OS的时基。

使用特权

评论回复
5
xdqfc| | 2022-1-22 10:36 | 只看该作者
本帖最后由 xdqfc 于 2022-1-22 10:38 编辑

咱就是这么用的,程序的确有点变态,做多任务还是可以的,CH573的就简单多了。

使用特权

评论回复
6
pattywu| | 2022-1-22 14:34 | 只看该作者
定时器有多的,换个其它的定时器当时基,效果会更好一点。
听说,调试的时候,systick是不停的。

使用特权

评论回复
7
觉醒de狮子| | 2022-2-9 23:55 | 只看该作者
大家好,我看了这个教程,做了下实验,我有些疑问:
在 SysTick_Handler 中需要手动重置 CNT的寄存器为0,我用的是 CH32V103C8T6 MCU,这个是设计如此吗?不能自动重置寄存器吗?

使用特权

评论回复
评论
RISCVLAR 2022-2-14 13:54 回复TA
您好,不会自动重置,会一直计数,因此若需要置0,需要在程序中配置 
8
elsaflower| | 2023-4-15 19:46 | 只看该作者
systick 延时时间怎么计算的?

使用特权

评论回复
9
fengm| | 2023-4-16 22:07 | 只看该作者
Systick中断打开之后主程序就跑飞了,这个是因为什么呢

使用特权

评论回复
10
yeates333| | 2023-4-16 22:14 | 只看该作者
利用systick来延时,这阻塞了单片机吗?

使用特权

评论回复
11
lihuami| | 2023-4-16 22:57 | 只看该作者
CH32V103延时如何不影响其他程序

使用特权

评论回复
12
iyoum| | 2023-5-5 18:35 | 只看该作者
SysTick中断是一种基于M0+内核的ARM Cortex芯片中的系统定时器中断。它可以提供高度精确的延时或周期性的中断,并用于实现各种系统计时和同步任务。

使用特权

评论回复
13
janewood| | 2023-5-5 19:55 | 只看该作者
systick具体延时时间怎么计算的?

使用特权

评论回复
14
deliahouse887| | 2023-5-5 21:06 | 只看该作者
当SysTick寄存器计数到0时,就会产生SysTick中断,然后处理器会跳转到SysTick中断服务程序中执行特定的操作。

使用特权

评论回复
15
wwppd| | 2023-5-5 21:26 | 只看该作者
systick中断逻辑包括哪些

使用特权

评论回复
16
pentruman| | 2023-5-10 20:11 | 只看该作者
如何编程设置systick中断发生频率

使用特权

评论回复
17
phoenixwhite| | 2023-5-10 20:20 | 只看该作者
在使用SysTick中断时,我们需要先进行初始化设置,包括指定计数器的初始值和重载值、设置中断优先级等。之后,我们可以启动SysTick计数器,并在中断服务程序中编写我们需要执行的操作。

使用特权

评论回复
18
backlugin| | 2023-5-10 20:45 | 只看该作者
systick中断的优先级怎么设置

使用特权

评论回复
19
youtome| | 2023-5-10 21:31 | 只看该作者
SysTick中断被广泛应用于嵌入式系统中的各种应用场景

使用特权

评论回复
20
chenci2013| | 2023-5-10 21:39 | 只看该作者
Systick中断打开之后主程序就跑飞了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

293

帖子

41

粉丝