mirror of
https://github.com/WeActStudio/WeActStudio.EpaperModule.git
synced 2026-08-16 13:13:45 +02:00
164 lines
3.3 KiB
C
164 lines
3.3 KiB
C
/*---------------------------------------
|
||
- 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; //启动系统计数器STK(HCLK/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 */
|
||
//启动系统计数器STK(HCLK/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();
|
||
}
|