查看: 111|回复: 0
收起左侧

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

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    6 天前
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-6-10 20:28:31 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

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

    1、SysTick简介

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

    SysTick寄存器如下图所示,主要为5个寄存器,关于各个寄存器的具体介绍,可参考CH32V103应用手册。
    CH32V103-第九十六章、CH32V103应用教程——SysTick中断risc-v单片机中文社区(1)

    在此处需要注意的是,关于CH32V103触发STK中断服务,当CNT[63:0]与CMP[63:0]值相等时将触发STK中断服务。
    CH32V103-第九十六章、CH32V103应用教程——SysTick中断risc-v单片机中文社区(2)


    2、硬件设计

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

    3、软件设计

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

    3. #include "ch32v10x_conf.h"

    4. void Systick_Init(void);

    5. #endif
    复制代码
    systick.h文件主要进行相关定义和函数声明;
    systick.c文件
    1. #include "systick.h"

    2. void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

    3. __IO uint32_t Counter;

    4. //SysTick初始化配置
    5. static uint32_t SysTick_Config(uint32_t ticks)
    6. {
    7.     SysTick->CTLR = 0x0000;                  //关闭系统计数器STK,计数器停止计数

    8.     //设置系统计数器寄存器的值
    9.     //系统计数器低位寄存器
    10.     SysTick->CNTL0 = 0;
    11.     SysTick->CNTL1 = 0;
    12.     SysTick->CNTL2 = 0;
    13.     SysTick->CNTL3 = 0;

    14.     //系统计数器高位寄存器
    15.     SysTick->CNTH0 = 0;
    16.     SysTick->CNTH1 = 0;
    17.     SysTick->CNTH2 = 0;
    18.     SysTick->CNTH3 = 0;

    19.     //设置计数比较寄存器的值,主要用于触发STK中断服务函数。当CNT[63:0]与CMP[63:0]值相等时将触发STK中断服务。
    20.     //设置计数比较低位寄存器的值
    21.     SysTick->CMPLR0 = (u8)(ticks & 0xFF);
    22.     SysTick->CMPLR1 = (u8)(ticks >> 8);
    23.     SysTick->CMPLR2 = (u8)(ticks >> 16);
    24.     SysTick->CMPLR3 = (u8)(ticks >> 24);

    25.     //设置计数比较高位寄存器的值
    26.     SysTick->CMPHR0 = 0;
    27.     SysTick->CMPHR1 = 0;
    28.     SysTick->CMPHR2 = 0;
    29.     SysTick->CMPHR3 = 0;

    30.     NVIC_SetPriority(SysTicK_IRQn, 15);      //设置SysTick中断优先级
    31.     NVIC_EnableIRQ(SysTicK_IRQn);            //使能开启Systick中断

    32.     SysTick->CTLR = 0x0001;                  //启动系统计数器STK(HCLK/8时基) 72000000/8=9000000

    33.     return (0);
    34. }

    35. void Systick_Init(void)
    36. {
    37.     //此处在进行初始化的时候设置比较寄存器的值
    38.     SysTick_Config(SystemCoreClock / 8000);//1ms            72M/8000/9000000 = 1/1000 = 1ms
    39. }

    40. //关于STK中断服务函数,由于STK的时基为HCLK/8,且在SysTick初始化配置中设置比较寄存器的值为SystemCoreClock / 8000 = 9000,由此计算的每隔1ms触发1次中断服务函数
    41. void SysTick_Handler(void)
    42. {
    43.     //设置系统计数器寄存器的值
    44.     //系统计数器低位寄存器
    45.     SysTick->CNTL0 = 0;
    46.     SysTick->CNTL1 = 0;
    47.     SysTick->CNTL2 = 0;
    48.     SysTick->CNTL3 = 0;

    49.     //系统计数器高位寄存器
    50.     SysTick->CNTH0 = 0;
    51.     SysTick->CNTH1 = 0;
    52.     SysTick->CNTH2 = 0;
    53.     SysTick->CNTH3 = 0;

    54.     Counter ++;

    55.     if(Counter >= 1000)
    56.     {
    57.         Counter = 0;
    58.     }
    59. }
    复制代码
    tim.c文件主要进行SysTick中断初始化配置以及中断服务函数处理,关于具体讲解见程序注释。
    main.c文件
    1. #include "debug.h"
    2. #include "systick.h"

    3. extern __IO uint32_t Counter;

    4. /*******************************************************************************
    5. * Function Name  : main
    6. * Description    : Main program.
    7. * Input          : None
    8. * Return         : None
    9. *******************************************************************************/
    10. int main(void)
    11. {
    12.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    13.         //Delay_Init();
    14.         USART_Printf_Init(115200);
    15.         printf("SystemClk:%d\r\n",SystemCoreClock);
    16.         printf("This is printf example\r\n");

    17.         Systick_Init();

    18.         while(1)
    19.         {
    20.             printf("Counter:%d\r\n", Counter);
    21.         }
    22. }
    复制代码
    main.c文件主要进行函数初始化以及打印输出相关值。

    4、下载验证

    将编译好的程序下载到开发版并复位,串口打印如下:
    CH32V103-第九十六章、CH32V103应用教程——SysTick中断risc-v单片机中文社区(3)

    CH32V103-第九十六章、CH32V103应用教程——SysTick中断risc-v单片机中文社区(4) 95、SysTick.rar (453.18 KB, 下载次数: 4)
    全球首家只专注于RISC-V单片机行业应用的中文网站
    点评回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies @朋友

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条




    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2021-7-29 02:15 , Processed in 0.649872 second(s), 43 queries .

    快速回复 返回顶部 返回列表