/**************************************************************************//**
 * @item     CosyOS-III Config
 * @file     mcucfg_rv32.h
 * @brief    RISC-V32 Core Config File
 * @author   迟凯峰
 * @version  v3.0.7
 * @date     2026.08.15
 ******************************************************************************/

#ifndef __MCUCFG_RV32_H
#define __MCUCFG_RV32_H

///////////////////////////////////////////////////////////////////////////////
// 中断FIFO服务装载器-互斥访问方案
// <1=> [lr][sc]指令 <2=> [amoadd]指令 <255=> 互斥访问机制 <0=> 关闭总中断（嵌套方式）
// <i> ------------------------------------------------------------------------
// [lr][sc]指令
// 可实现全局不关总中断、零中断延迟。
// 值得留意的是，青稞 V3A/V4 系列微处理器，对该指令进行了弱化处理，仅作为 lw，sw
// 执行，不再具有独占访问能力，所以不要使用。
// <i> ------------------------------------------------------------------------
// [amoadd]指令
// 可实现全局不关总中断、零中断延迟。
// 该指令执行周期可能会稍长且不确定。
// <i> ------------------------------------------------------------------------
// 互斥访问机制
// 可实现全局不关总中断、零中断延迟。
// 适用于不支持上述原子访问指令的情况，如青稞 V2 系列。
// x4(tp)、mscratch 专用于该机制下中断FIFO服务的互斥装载，用户不要使用。
// 青稞 V3/V4 系列，如果启用硬件压栈（port_rv32i_HWS.S），也会用到这两个寄存器，
// 会与互斥访问机制相冲突。
// <i> ------------------------------------------------------------------------
// 关闭总中断（嵌套方式）
// 适用于不支持上述原子访问指令的情况，如青稞 V2 系列。
// 由于在关闭总中断之后必须使用 fence.i 指令同步隔离，所以关闭总中断时间暂不确定。
#define MCUCFG_PENDSVFIFO_MUTEX         2

///////////////////////////////////////////////////////////////////////////////
// 浮点寄存器上下文自动保存
// <0=> 不保存 <1=> 保存
// 是否启用浮点寄存器的上下文自动保存功能？
// 如果存在并且启用了硬件浮点单元，同时在多个任务中都要进行浮点运算，可考虑开启该选项。
#define MCUCFG_FPU_AUTOSTORE            0

///////////////////////////////////////////////////////////////////////////////

/* 系统滴答-配置方式 */
// <0=> 手动配置 <1=> 自动配置
// 手动配置：您需自行手动配置和系统滴答有关的一切事宜；
// 例外的是，滴答中断优先级将由CosyOS自动配置为最低级。
// 自动配置：CosyOS会自动为您处理好一切事宜，开箱即用。
#define MCUCFG_SYSTICK_AUTOCONFIG       1

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#if (MCUCFG_SYSTICK_AUTOCONFIG == 1)
/* 自动配置-额外配置 */
// 如果系统滴答配置方式为自动配置，需额外配置下方定义项。

// 系统时钟频率
// 告知CosyOS您所配置的系统时钟，单位为兆赫（MHZ）。
#define MCUCFG_SYSCLK                   96

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#else
/* 手动配置-额外配置 */
// 如果系统滴答配置方式为手动配置，用户仍需额外配置下方定义项，
// 用于 CosyOS-任务管理器 的CPU使用率统计、滴答时间统计等功能。
// 当然，如果您不打算使用 CosyOS-任务管理器，可不用配置。
// 默认配置仅为示例，给用户以参考和提示。

// 系统滴答-计数方式
// <1=> 从零向上计数至重装载值溢出 <2=> 从重装载值向下计数至零溢出
// <3=> 从重装载值向上计数至零溢出 <4=> 从零向下计数至重装载值溢出
// 告知CosyOS您所配置的定时器计数方式。
#define MCUCFG_SYSTICK_COUNTMODE        2

// 系统滴答-位数
// 如果定时器计数方式配置为3或4，应正确配置该定义。
#define MCUCFG_SYSTICK_BITS             32

// 系统滴答-当前值
// 应配置为可读的当前值寄存器。
#define MCUCFG_SYSTICK_CURRVALUE        (*(volatile uint32_t *)0xE000F008)

// 系统滴答-重装载值
// 如果该值为常量可配置为常量，否则应配置为可读的重装载值寄存器。
#define MCUCFG_SYSTICK_LOADVALUE        (*(volatile uint32_t *)0xE000F010)

// 系统滴答-时钟
// 告知CosyOS您所配置的系统滴答时钟，单位为兆赫（MHZ）。
#define MCUCFG_SYSTICK_CLK              96 // = (系统时钟 / (((*(volatile uint32_t *)0xE000F000) & 4) ? 1 : 8))

#endif

//////////////////////////////////* 系统定义 *//////////////////////////////////

// 以下为系统定义，用户不可随意修改。

#define MCUCFG_REGBYTES     4
#define MCUCFG_FPUBYTES     4
#define MCUCFG_TIMn_IRQn   12
#define MCUCFG_XXXx_IRQn   14
#define OS_PendSV_Handler  SW_Handler

////////////////////////////////////////////////////////////////////////////////

#endif
