#include #if ENABLE_FUNCTION_VALIDATION == 1 #include #include #include #include #include #include #include #include #include SYSCTRLA_SFRS_t sysCtrl; void PWM0_0(void); void SPI(void); void UART0(void); void CT3_COUNTER(void); uint16_t PT0data=0; uint16_t Rdata_SPI=0; uint16_t Tdata_UART0=0X55,Rdata_UART0=0; uint16_t CT3CV_data=0; void PWM0_0(void) { SYSCTRLA_SFRS->DEBUG_ACCESS_KEY.DEBUG_ACCESS_KEY = 0X05U; IOCTRLA_SFRS->PORT_GROUP_MUX[1] |= (uint32_t)0x02<<20; // PB5 0x2: PWM0_0. IOCTRLA_SFRS->PORT_GROUP_MUX[1] |= (uint32_t)0x02<<24; //PB6 0x2: PWM0_1. PWM_SFRS->CTRL0R.PT0RC = 1U;//0x1: PT0R is cleared, PT0 stops counting PWM_SFRS->CTRL1R.CC1CNTS = 0; PWM_SFRS->CTRL1R.CC2CNTS = 0; PWM_SFRS->CTRL1R.CC3CNTS = 0; PWM_SFRS->CTRL1R.PT0PRES = 1;//0x1: Divide by 2 48Mhz/2 = 24Mhz PWM_SFRS->CTRL1R.PT0MODE = 0;//0x0: Edge_aligned_mode: PWM_SFRS->PT0PERIOD = 100U*48U; //100us*2 = 5Khz PWM_SFRS->DTCR.CCXDTE = 0;//0x0: DISABLED: Dead-time generation is disabled. PWM_SFRS->DTCR.PT1DT = 0; PWM_SFRS->DTCR.PT0DT = 0; PWM_SFRS->CHREMAPR.PWM0RMP = 0;//0x0: Select CC0 PWM_SFRS->CHREMAPR.PWM1RMP = 0;//0x0: Select CC0 PWM_SFRS->CHREMAPR.PWM2RMP = 0;//0x0: Select CC0 PWM_SFRS->CHREMAPR.PWM3RMP = 0;//0x0: Select CC0 PWM_SFRS->CMPSTATR.CC00PS = 0;//0x0: CC0_0 drives passive level while CC0CS is 0, i.e. driven by CC0CS PWM_SFRS->CMPSTATR.CC01PS = 0; PWM_SFRS->CMPSTATR.CC10PS = 0;//0x0: CC1_0 drives passive level while CC0CS is 0, i.e. driven by CC0CS PWM_SFRS->CMPSTATR.CC11PS = 0; PWM_SFRS->CMPSTATR.CC20PS = 0;//0x0: CC2_0 drives passive level while CC0CS is 0, i.e. driven by CC0CS PWM_SFRS->CMPSTATR.CC21PS = 0; PWM_SFRS->CMPSTATR.CC30PS = 0;//0x0: CC3_0 drives passive level while CC0CS is 0, i.e. driven by CC0CS PWM_SFRS->CMPSTATR.CC31PS = 0; PWM_SFRS->PSL = 0X0;//0x0: Level_0: The passive level is 0 PWM_SFRS->MODCTRLR.MCEN = 0;//0x1: ENABLED: The modulation of the corresponding output signal by the multi-channel pattern according to bit field MCPTN is enabled PWM_SFRS->MODCTRLR.CCXMODEN = 0XFF;//0x1: ENABLED: The modulation of the corresponding output signal by CC0~3 pattern is enabled PWM_SFRS->MCOUTR.MCUPR= 1;//0x1: By_software: Bit field MCPTN is updated by MCPTNS immediately PWM_SFRS->MCOUTR.MCPTNS = 0XFF; PWM_SFRS->PULSE0R.PRISE0 = 0U; PWM_SFRS->PULSE0R.PFALL0 = 2000U; PWM_SFRS->CTRL0R.PT0UPES = 1;//0x1: PT0UPE is set, enabling update PWM_SFRS->CTRL0R.PT0RS = 1;//0x1: PT0R is set, PT0 start counting while(1){ PT0data = PWM_SFRS->PT0CV; } } void SPI(void) { SYSCTRLA_SFRS->DEBUG_ACCESS_KEY.DEBUG_ACCESS_KEY = 0X05U; IOCTRLA_SFRS->PORT_GROUP_MUX[0] |= (uint32_t)0x03<<20; //PA5 0x3: SCK. IOCTRLA_SFRS->PORT_GROUP_MUX[0] |= (uint32_t)0x03<<16; //PA4 0x3: MOSI. IOCTRLA_SFRS->PORT_GROUP_MUX[0] |= (uint32_t)0x03<<12; //PA3 0x3: MISO SPI_SFRS->SPICTRL.FIFOSOFTRESET = 1; while(SPI_SFRS->SPICTRL.FIFOSOFTRESET == 1); SPI_SFRS->SPICTRL.SCKEXT = 2; SPI_SFRS->SPICTRL.SPR = 3;//{10, 11}: System Clock / 4096 11.718KHZ SPI_SFRS->SPICTRL.LPBK = 1;//0x1: Loopback enable. Set to enable loopback SPI_SFRS->SPICTRL.ICNT = 0;//0x0: Interrupt is set after every completed transfer SPI_SFRS->SPICTRL.CPOL = 0;// SPI_SFRS->SPICTRL.CPHA = 0;//CPHA SPI_SFRS->SPICTRL.ENA_REQ = 1; while(SPI_SFRS->SPISTATUS.TXFIFOEMPTY == 1) { SPI_SFRS->TXDATA = 0x55; } if(SPI_SFRS->SPISTATUS.RXFIFOEMPTY == 0){ Rdata_SPI = SPI_SFRS->RXDATA; } } void UART0(void)//开loop功能时在TX端无数据信号,关闭时有 { SYSCTRLA_SFRS->DEBUG_ACCESS_KEY.DEBUG_ACCESS_KEY = 0X05U; IOCTRLA_SFRS->PORT_GROUP_MUX[1] |= (uint32_t)0x02U; //PB0 0x2: TXD. IOCTRLA_SFRS->PORT_GROUP_MUX[1] |= (uint32_t)0x03U<<12; //PB3 0x3: RXD. UART0_SFRS->MSGCTRL.ENABLE = 0U;//0:Disable UART0 UART0_SFRS->MSGCTRL.LOOPENA = 0U;//Loopback enable. Set to enable loopback UART0_SFRS->MSGCTRL.BREAKENA = 0U; UART0_SFRS->MSGCTRL.STICKENA = 0U; UART0_SFRS->MSGCTRL.PARODD = 0U;//0x0: ODD Parity UART0_SFRS->MSGCTRL.PARENA = 1U;//Parity enable. UART0_SFRS->MSGCTRL.STOP = 0U;//0x0: One stop bit UART0_SFRS->MSGCTRL.SIZE = 3U;//Transmission word size.0x3: 8-bit UART0_SFRS->MSGCTRL.TXXFERCNTCLR = 1U;// UART0_SFRS->MSGCTRL.RXXFERCNTCLR = 1U; UART0_SFRS->MSGCTRL.UFIFOSOFTRESET = 1U; //Baud_rate = Fclk/OSR/(BAUDDIV+1+FDIV/8) //48000000/16/(311+1+4/8)= 9600 UART0_SFRS->UARTBAUD.URETARD = 1; UART0_SFRS->UARTBAUD.UADVANCE = 1; UART0_SFRS->UARTBAUD.OSR = 16;//Over-sampling ratio. Valid OSR Range: 6 to 16. UART0_SFRS->UARTBAUD.BAUDDIV = 311;//Baud rate divider.16bits UART0_SFRS->UARTBAUD.FDIV = 4;//Fractional divider.3bits UART0_SFRS->UARTFIFO.TXMULTIPLEXFERDONECNT = 4;//Transmit Data Count Interrupt. Valid Range: 1 to 16 UART0_SFRS->MSGCTRL.ENABLE = 1U; while(UART0_SFRS->MSGCTRL.ENABLE_STS == 0); Tdata_UART0 = 0X55; UART0_SFRS->DATA.BYTE = Tdata_UART0; while(UART0_SFRS->UARTINT.STATUS.TXDONE == 0U){} UART0_SFRS->UARTINT.CLEAR.TXDONE = 1U; // Tdata_UART0 = 0X56; // UART0_SFRS->DATA.BYTE = Tdata_UART0; if(UART0_SFRS->UARTINT.STATUS.RXDONE == 1) { Rdata_UART0 = UART0_SFRS->DATA.BYTE; } } void CT3_COUNTER(void) { SYSCTRLA_SFRS->DEBUG_ACCESS_KEY.DEBUG_ACCESS_KEY = 0X05U; IOCTRLA_SFRS->PORT_GROUP_MUX[2] |= (uint32_t)0x07U << 12; //PC3 0x7: PAUX[1] IOCTRLA_SFRS->PORT_GROUP_MUX[2] |= (uint32_t)0x04U << 16; //PC4 0x4: CT3EUDB CTT_SFRS->CTTINSR.SELCT3EUD = 1U;//0x1: Signal CT3EUDB is selected CTT_SFRS->CT3CTRLR.CT3R = 0;//0x0: Timer CT3 stops CTT_SFRS->CT3CTRLR.CT3EUDE = 0U;//0x0: Count direction is controlled by bit CT3UD; input CT3EUD is ignored CTT_SFRS->CT3CTRLR.CT3UD = 0U;//0x0: Up: Timer CT3 counts up CTT_SFRS->CT3CTRLR.CT3M = 7U;//0x7: Incremental Interface Mode (Edge Detection Mode) CTT_SFRS->CT3CTRLR.CT3I = 2U;//Any transition (rising or falling edge) on CT3EUD PWMAUX_Init(GROUP_GPIOC,GPIO_PORT_3,PWMAUX_CH1,PWMAUX_BASE_0,PWMAUX_CLK_DIV_1,1000*48);//1ms PWMAUX_SetMatchValue(PWMAUX_CH1, 0, 1000*48/2);//PWMAUX1:PC3 CTT_SFRS->CT3CTRLR.CT3R = 1;//0x0: Timer CT3 stops while(1) { CT3CV_data = CTT_SFRS->CT3CV; } } void validation_main(void) { SYSCTRLA_SFRS->DEBUG_ACCESS_KEY.DEBUG_ACCESS_KEY = 0X05U; //SYSCTRLA_REG_TRIM_ACCESS_KEY.TRIM_ACCESS_KEY = 0x0EU; SYSCTRLA_SFRS->TRIM_ACCESS_KEY.TRIM_ACCESS_KEY = 0x0EU; Clock_SystemMainClockInit(SYS_MAIN_CLOCK_DIV); while(1); } #endif