22 using ExcTrig = TExceptionTrigger;
23 using MapEnum = SysTickAddressMap;
25 static constexpr u32 GetBeginPhysicalAddress() {
return 0xE010; }
26 static constexpr u32 GetEndPhysicalAddress() {
return 0xE0FF; }
30 static constexpr auto kAdr = SysTickAddressMap::kCsr;
31 static constexpr bool kUseReadModifyWrite =
false;
32 static constexpr bool kReadOnly =
false;
34 static u32 ReadRegister(TCpuAccessor &cpua) {
35 auto ret = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysTickCsr>();
36 LOG_TRACE(TLogger,
"READ SYST_CSR: 0x%X", ret);
38 auto csr_wb = ret & (~SysTickRegister::kCsrCountFlagMsk);
39 cpua.template WriteSpecialRegister<SpecialRegisterId::kSysTickCsr>(csr_wb);
44 static void WriteRegister(TCpuAccessor &cpua, u32 value) {
45 auto csr_old = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysTickCsr>();
46 LOG_TRACE(TLogger,
"WRITE SYST_CSR: 0x%X", value);
47 if (((csr_old & SysTickRegister::kCsrEnableMsk) == 0U) &&
48 ((value & SysTickRegister::kCsrEnableMsk) != 0U)) {
50 auto rvr = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysTickRvr>();
51 cpua.template WriteSpecialRegister<SpecialRegisterId::kSysTickCvr>(rvr);
52 LOG_DEBUG(TLogger,
"Enable SysTick");
53 }
else if (((csr_old & SysTickRegister::kCsrEnableMsk) != 0U) &&
54 ((value & SysTickRegister::kCsrEnableMsk) == 0U)) {
55 LOG_DEBUG(TLogger,
"Disable SysTick");
58 value = value & (~SysTickRegister::kCsrCountFlagMsk);
59 cpua.template WriteSpecialRegister<SpecialRegisterId::kSysTickCsr>(value);
65 static constexpr auto kAdr = SysTickAddressMap::kRvr;
66 static constexpr bool kUseReadModifyWrite =
true;
67 static constexpr bool kReadOnly =
false;
69 static u32 ReadRegister(TCpuAccessor &cpua) {
70 auto ret = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysTickRvr>();
71 LOG_TRACE(TLogger,
"READ SYST_RVR: 0x%X", ret);
75 static void WriteRegister(TCpuAccessor &cpua, u32 value) {
76 LOG_TRACE(TLogger,
"WRITE SYST_RVR: 0x%X", value);
77 cpua.template WriteSpecialRegister<SpecialRegisterId::kSysTickRvr>(value);
83 static constexpr auto kAdr = SysTickAddressMap::kCvr;
84 static constexpr bool kUseReadModifyWrite =
false;
85 static constexpr bool kReadOnly =
false;
87 static u32 ReadRegister(TCpuAccessor &cpua) {
88 auto ret = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysTickCvr>();
89 LOG_TRACE(TLogger,
"READ SYST_CVR: 0x%X", ret);
93 static void WriteRegister(TCpuAccessor &cpua, u32 value) {
95 LOG_TRACE(TLogger,
"WRITE SYST_CVR: 0x%X", value);
96 cpua.template WriteSpecialRegister<SpecialRegisterId::kSysTickCvr>(value);
102 static constexpr auto kAdr = SysTickAddressMap::kCalib;
103 static constexpr bool kUseReadModifyWrite =
false;
104 static constexpr bool kReadOnly =
true;
106 static u32 ReadRegister(TCpuAccessor &cpua) {
107 auto ret = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysTickCalib>();
108 LOG_TRACE(TLogger,
"READ SYST_CALIB: 0x%X", ret);
113 static constexpr auto kRegisters =
124 auto csr = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysTickCsr>();
126 if ((csr & SysTickRegister::kCsrEnableMsk) == SysTickRegister::kCsrEnableMsk) {
127 auto cvr = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysTickCvr>();
130 LOG_DEBUG(TLogger,
"SysTick counted to zero");
131 auto rvr = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysTickRvr>();
132 cpua.template WriteSpecialRegister<SpecialRegisterId::kSysTickCvr>(rvr);
134 if ((csr & SysTickRegister::kCsrTickIntMsk) == SysTickRegister::kCsrTickIntMsk) {
135 ExcTrig::SetPending(cpua, ExceptionType::kSysTick);
138 csr |= SysTickRegister::kCsrCountFlagMsk;
139 cpua.template WriteSpecialRegister<SpecialRegisterId::kSysTickCsr>(csr);
141 cpua.template WriteSpecialRegister<SpecialRegisterId::kSysTickCvr>(cvr - 1U);
152 constexpr SysTick() =
delete;
157 virtual ~SysTick() =
delete;
163 SysTick(
const SysTick &r_src) =
delete;
169 SysTick &operator=(
const SysTick &r_src) =
delete;
175 SysTick(SysTick &&r_src) =
delete;
181 SysTick &operator=(SysTick &&r_src) =
delete;