arduino_midi_player/Midi/music-box-nv32-master/nv32lib/drivers/sim/sim.h
2025-03-24 14:30:56 +08:00

473 lines
13 KiB
C
Raw Permalink 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.

/******************************************************************************
*
* @brief SIM 驱动头文件.
*
******************************************************************************/
#ifndef SIM_H_
#define SIM_H_
typedef enum {
ID_TYPE_FAMID, /*!< NV32F100x系列 ID */
ID_TYPE_SUBFAMID, /*!< NV32F100x子系列 ID */
ID_TYPE_REVID, /*!< 器件版本 ID */
ID_TYPE_PINID /*!< 器件引脚 ID */
} IDType;
#if defined(CPU_NV32)
typedef struct{
struct{
uint32_t bEnableCLKOUT : 1; /*!< 1: 使能 , 0: 禁用 */
uint32_t bTXDME : 1; /*!< 1: 使能 TXDME, 0: 禁用 */
uint32_t bETMSYNC : 1; /*!< 1: 使能 ETM SYNC, 0: 未触发任何同步 */
uint32_t bRXDFE : 1; /*!< 1: 使能 RXD 滤波, 0: 无滤波 */
uint32_t bRXDCE : 1; /*!< 1: 使能 RXD 捕捉, 0: 无捕捉 */
uint32_t bACIC : 1; /*!< 1: ACMP0的输出通道连接到ETM1的输入通道0, 0: 无连接 */
uint32_t bRTCC : 1; /*!< 1: RTC溢出连接到ETM1输入通道1, 0: 无连接 */
uint32_t u8ADHWT : 2; /*!< 选择ADC转换硬件触发源 */
uint32_t bDisableSWD : 1; /*!< 1: 禁用SWD, 0: 使能 */
uint32_t bDisableRESET : 1; /*!< 1: 禁用复位引脚, 0: 使能 */
uint32_t bDisableNMI : 1; /*!< 1: 禁用NMI中断输入引脚, 0:使能 */
uint32_t bBusDiv : 1; /*!< 总线分频系数 */
} sBits;
uint8_t u8Delay; /*!< ETM触发ADC转换延时值 */
uint8_t u8BusRef; /*!< 总线参考 */
uint32_t u32PinSel; /*!< 引脚选择寄存器的值*/
uint32_t u32SCGC; /*!< 时钟选通寄存器的值 */
} SIM_ConfigType, *SIM_ConfigPtr; /*!< SIM模块配置结构体类型 */
#endif
#if defined(CPU_NV32)
/*****************************************************************************//*!
*
* @brief 设置ETM2触发ADC转换的延时时间
*
* @param[in] u8Delay 延时时间模数值,参考时钟采用总线时钟分频
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
__STATIC_INLINE void SIM_DelayETM2Trig2ADC(uint8_t u8Delay)
{
SIM->SOPT = (SIM->SOPT & ~(SIM_SOPT_DELAY_MASK)) | SIM_SOPT_DELAY(u8Delay);
}
/*****************************************************************************//*!
*
* @brief 使能总线时钟在PH2上
*
* @param none
*
* @return none
*
* @ 参看 SIM_DisableClockOutput
*****************************************************************************/
__STATIC_INLINE void SIM_EnableClockOutput(void)
{
SIM->SOPT |= (SIM_SOPT_CLKOE_MASK);
}
/*****************************************************************************//*!
*
* @brief 禁用总线时钟输出在PH2上
*
* @param none
*
* @return none
*
* @参看 SIM_EnableClockOutput
*****************************************************************************/
__STATIC_INLINE void SIM_DisableClockOutput(void)
{
SIM->SOPT &= ~(SIM_SOPT_CLKOE_MASK);
}
/*****************************************************************************//*!
*
* @brief 设置总线时钟输出分频.
*
* @param[in] u8Divide 分频系数 (3-bits)
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_SetClockOutputDivide(uint8_t u8Divide)
{
SIM->SOPT = (SIM->SOPT & ~(SIM_SOPT_BUSREF_MASK)) | SIM_SOPT_BUSREF(u8Divide & 0x07);
}
/*****************************************************************************//*!
*
* @brief UART0_RX输入信号连接到UART0模块和ETM0通道1
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_EnableUART0RXDConnectETMOCH1(void)
{
SIM->SOPT |= (SIM_SOPT_RXDCE_MASK);
}
/*****************************************************************************//*!
*
* @brief UART0_TX输出在映射到引出线前由ETM0通道0调制
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_EnableUART0Modulation(void)
{
SIM->SOPT |= (SIM_SOPT_TXDME_MASK);
}
/*****************************************************************************//*!
*
* @brief UART0_TX输出直接连接到引出线上
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_DisableUART0Modulation(void)
{
SIM->SOPT &= ~(SIM_SOPT_TXDME_MASK);
}
/*****************************************************************************//*!
*
* @brief 生成ETM2模块的PWM同步触发
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
__STATIC_INLINE void SIM_GenerateSoftwareTrig2ETM2(void)
{
SIM->SOPT |= (SIM_SOPT_ETMSYNC_MASK);
}
/*****************************************************************************//*!
*
* @brief ETM2_CH3通道映射到PD1上
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
__STATIC_INLINE void SIM_RemapETM2CH3Pin(void)
{
SIM->PINSEL |= SIM_PINSEL_ETM2PS3_MASK;
}
/*****************************************************************************//*!
*
* @brief ETM2_CH2通道映射到PD0上
*
* @param none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
__STATIC_INLINE void SIM_RemapETM2CH2Pin(void)
{
SIM->PINSEL |= SIM_PINSEL_ETM2PS2_MASK;
}
/*****************************************************************************//*!
*
* @brief ETM0_CH1通道映射到PB3上
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_RemapETM0CH1Pin(void)
{
SIM->PINSEL |= SIM_PINSEL_ETM0PS1_MASK;
}
/*****************************************************************************//*!
*
* @brief ETM0_CH0通道映射到PB2上
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_RemapETM0CH0Pin(void)
{
SIM->PINSEL |= SIM_PINSEL_ETM0PS0_MASK;
}
/*****************************************************************************//*!
*
* @brief UART0_RX和UART0_TX映射到PA2和PA3上
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_RemapUART0Pin(void)
{
SIM->PINSEL |= SIM_PINSEL_UART0PS_MASK;
}
/*****************************************************************************//*!
*
* @brief SPI0_SCK SPI0_MOSI SPI0_MISO和SPI0_PCS映射到PE0、PE1、PE2、PE3上
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_RemapSPI0Pin(void)
{
SIM->PINSEL |= SIM_PINSEL_SPI0PS_MASK;
}
/*****************************************************************************//*!
*
* @brief I2C0_SCL和I2C_SDA分别映射到PB7、PB6上
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_RemapI2CPin(void)
{
SIM->PINSEL |= SIM_PINSEL_IICPS_MASK;
}
/*****************************************************************************//*!
*
* @brief RXD0输入信号由ACPM0滤波然后注入UART0
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_EnableUART0Filter(void)
{
SIM->SOPT |= (SIM_SOPT_RXDFE_MASK);
}
/******************************************************************************!
*
* @brief RXD0输入信号直接连接到UARTO模块
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_DisableUART0Filter(void)
{
SIM->SOPT &= ~(SIM_SOPT_RXDFE_MASK);
}
/*****************************************************************************//*!
*
* @brief 选择RTC溢出作为ADC硬件触发源
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_TriggerADCByRTC(void)
{
SIM->SOPT &= ~(SIM_SOPT_ADHWT_MASK);
}
/*****************************************************************************//*!
*
* @brief 选择PIT溢出作为ADC硬件触发源
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_TriggerADCByPIT(void)
{
SIM->SOPT = (SIM->SOPT & ~(SIM_SOPT_ADHWT_MASK)) | SIM_SOPT_ADHWT(1);
}
/*****************************************************************************//*!
*
* @brief 设置ETM2初始化作为ADC硬件触发源.ETM2初始化后经过一段时间延时触发ADC转换
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_TriggerADCByETM2Init(void)
{
SIM->SOPT = (SIM->SOPT & ~(SIM_SOPT_ADHWT_MASK)) | SIM_SOPT_ADHWT(2);
}
/*****************************************************************************//*!
*
* @brief 设置ETM2匹配作为ADC硬件触发源ETM2匹配后经过一段时间的延时触发ADC转换
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_TriggerADCByETM2Match(void)
{
SIM->SOPT = (SIM->SOPT & ~(SIM_SOPT_ADHWT_MASK)) | SIM_SOPT_ADHWT(3);
}
/*****************************************************************************//*!
*
* @brief RTC溢出连接到ETM1输入通道1
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_EnableRTCCapture(void)
{
SIM->SOPT |= (SIM_SOPT_RTCC_MASK);
}
/*****************************************************************************//*!
*
* @brief RTC溢出未连接到ETM1输入通道1
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_DisableRTCCapture(void)
{
SIM->SOPT &= ~(SIM_SOPT_RTCC_MASK);
}
/*****************************************************************************//*!
*
* @brief ACMP0输出连接到ETM1输入通道0
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_EnableACMP0InputCapture(void)
{
SIM->SOPT |= (SIM_SOPT_ACIC_MASK);
}
/*****************************************************************************//*!
*
* @brief ACMP0输出未连接到ETM1输入通道0
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_DisableACMP0InputCapture(void)
{
SIM->SOPT &= ~(SIM_SOPT_ACIC_MASK);
}
/*****************************************************************************//*!
*
* @brief RTC0映射到PC5上
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_RemapRTCPin(void)
{
SIM->PINSEL |= SIM_PINSEL_RTCPS_MASK;
}
/*****************************************************************************//*!
*
* @brief 设置总线时钟频率
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_SetBusDivide(uint8_t u8Divide)
{
SIM->BUSDIV = u8Divide;
}
/*****************************************************************************//*!
*
* @brief ETM2_CH1通道映射到PH1上
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_RemapETM2CH1Pin(void)
{
SIM->PINSEL |= SIM_PINSEL_ETM2PS1_MASK;
}
/*****************************************************************************//*!
*
* @brief ETM2_CH0通道映射到PH0上
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_RemapETM2CH0Pin(void)
{
SIM->PINSEL |= SIM_PINSEL_ETM2PS0_MASK;
}
/*****************************************************************************//*!
*
* @brief ETM1_CH1通道映射到PE7上
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_RemapETM1CH1Pin(void)
{
SIM->PINSEL |= SIM_PINSEL_ETM1PS1_MASK;
}
/*****************************************************************************//*!
*
* @brief ETM1_CH0映射到PH2上
*
* @param none
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SIM_RemapETM1CH0Pin(void)
{
SIM->PINSEL |= SIM_PINSEL_ETM1PS0_MASK;
}
#endif
/****************************************************************************/
void SIM_Init(SIM_ConfigType *pConfig);
void SIM_SetClockGating(uint32_t u32PeripheralMask, uint8_t u8GateOn);
uint32_t SIM_GetStatus(uint32_t u32StatusMask);
uint8_t SIM_ReadID(IDType sID);
#endif