/****************************************************************************** * * @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