Files
WeActStudio.EpaperModule/Example/EpaperModuleTest_CH32V103/User/systick.c
T
2022-08-06 13:35:32 +08:00

164 lines
3.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*---------------------------------------
- WeAct Studio Official Link
- taobao: weactstudio.taobao.com
- aliexpress: weactstudio.aliexpress.com
- github: github.com/WeActTC
- gitee: gitee.com/WeAct-TC
- blog: www.weact-tc.cn
---------------------------------------*/
#include "systick.h"
#include "ch32v10x.h"
#include "ch32v10x_pwr.h"
void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
volatile uint32_t _tick = 0;
/*!
\brief configure systick
\param[in] none
\param[out] none
\retval none
*/
void systick_config(void)
{
uint32_t ticks = (SystemCoreClock / SysTick_Tick);
//关闭系统计数器STK,计数器停止计数
SysTick->CTLR = 0x0000;
//设置系统计数器寄存器的值
//系统计数器低位寄存器
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 = (uint8_t)(ticks & 0xFF);
SysTick->CMPLR1 = (uint8_t)(ticks >> 8);
SysTick->CMPLR2 = (uint8_t)(ticks >> 16);
SysTick->CMPLR3 = (uint8_t)(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; //启动系统计数器STKHCLK/8时基) 72000000/8=9000000
}
/*!
\brief delay a time in milliseconds
\param[in] count: count in milliseconds
\param[out] none
\retval none
*/
void delay(uint32_t count)
{
uint32_t utick;
utick = count + systick_get_tick();
while (systick_get_tick() < utick)
{
}
}
/*!
\brief delay a time in milliseconds with low power
\param[in] count: count in milliseconds
\param[out] none
\retval none
*/
void delay_lp(uint32_t count)
{
uint32_t utick;
utick = count + systick_get_tick();
while (systick_get_tick() < utick)
{
PWR_EnterSTANDBYMode();
}
}
/*!
\brief delay decrement
\param[in] none
\param[out] none
\retval none
*/
void delay_decrement(void)
{
_tick++;
}
/*!
\brief get systick tick
\param[in] none
\param[out] none
\retval none
*/
uint32_t systick_get_tick(void)
{
return _tick;
}
void systick_DisableIRQ(void)
{
NVIC_DisableIRQ(SysTicK_IRQn);
}
void systick_EnableIRQ(void)
{
NVIC_EnableIRQ(SysTicK_IRQn);
}
void systick_Disable(void)
{
/* Disable SysTick */
//关闭系统计数器STK,计数器停止计数
SysTick->CTLR = 0x0000;
}
void systick_Enable(void)
{
/* Enable SysTick */
//启动系统计数器STKHCLK/8时基) 72000000/8=9000000
SysTick->CTLR = 0x0001;
}
void systick_deinit(void)
{
//关闭系统计数器STK,计数器停止计数
SysTick->CTLR = 0x0000;
}
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;
delay_decrement();
}