/** * @brief Enable chip clock sources including HXT, LXT, LIRX, HIRC and PLL. And then set HCLK clock source and divider. * If the second parameter is NOT NULL, also enable the clock and set the source/divider of peripheral functions. * @param sChipCfg - [in], The pointer to the structure which stores the configuration of chip clock source and HCLK. * u32ChipClkEn : CLK_PWRCTL_XXX_EN, where XXX could be HXT, LXT, HIRC or LIRC * u32PLLClkSrc : CLK_PLLCTL_PLLSRC_HIRC or CLK_PLLCTL_PLLSRC_HXT * u8PLLEnable : 1 to enable PLL, 0 to disable PLL * ePLLInFreq : E_SYS_PLLIN_4M, _8M, _12M, _15M or _24M * ePLLOutFreq : E_SYS_PLLOUT_45M, _48M, _90M, _96M, _120M or _128M * u32HClkSrc : CLK_CLKSEL0_HCLK_XXX, where XXX could be HXT, LXT, PLL, HIRC or LIRC * u32HClkDiv : 0 ~ 15 * * @param sIPCfg - [in], The pointer to the structure which stores the configuration of peripheral functions. * u32AHBClkEn : The combination of CLK_AHBCLK_XXX_EN, where XXX can be GPIO, PDMA, ISP, EBI, SRAM, TICK * u32APBClkEn : The combination of CLK_APBCLK_XXX_EN, the XXX can be : * WDT, RTC, TMR0~3, FDIV, SC0~2, I2C0~1, SPI0~2, UART0~1, PWM0_CH01, PWM0_CH23, * PWM1_CH01, PWM1_CH23, TK, DAC, LCD, USBD, ADC, I2S. * * u32ClkSel1 : The combination of CLK_CLKSEL1_XXX_YYY, search "CLK_CLKSEL1_" in nano1xx.h for possible values. * u32ClkSel2 : The combination of CLK_CLKSEL2_XXX_YYY, search "CLK_CLKSEL2_" in nano1xx.h for possible values. * sClkDiv : Structure to store clock divider of devices. The elements * are listed below. * u8USBDiv : 0 ~ 15, USBD clock divider * u8UARTDiv : 0 ~ 15, UART clock divider * u8I2SDiv : 0 ~ 15, I2S clock divider * u8ADCDiv : 0 ~ 255, ADC clock divider * u8TKDiv : 0 ~ 15, TK clock divider * u8SC0Div : 0 ~ 15, SC0 clock divider * u8SC1Div : 0 ~ 15, SC1 clock divider * @return Execution result. * @retval 0 Success * @retval -1 The chip clock sources are not stable * @retval -2 The selected PLL setting is not supported * * retval -3 The PLL clock output is not stable */ int32_t SYS_InitChipClock(S_SYS_CHIP_CLKCFG *sChipCfg) { uint32_t u32ClkEn, u32ClkSts, u32PllCtl; volatile uint32_t delayCnt; assert_param(CHECK_CLK_CONFIG(sChipCfg)); /* Check input parameter */ assert_param(CHECK_HCLK_SOURCE(sChipCfg->u32HClkSrc)); /* Check HCLK clock select */ /* enable chip clock sources */ u32ClkEn = u32ClkSts = (sChipCfg->u32ChipClkEn) & 0x0F; if (u32ClkSts & CLK_PWRCTL_HIRC_EN) u32ClkSts = (u32ClkSts & ~CLK_PWRCTL_HIRC_EN) | CLK_CLKSTATUS_HIRC_STB; SYS_SetChipClockSrc(u32ClkEn, 1); /* enable the selected chip clock sources */ for (delayCnt=0; delayCnt<100000; delayCnt++) if ((CLK->CLKSTATUS & u32ClkSts) == u32ClkSts) break; if (delayCnt == 100000) return -1; /* enable PLL */ if (sChipCfg->u8PLLEnable == 1) { /* check PLL in clock freq. */ assert_param(CHECK_PLLIN_CLK(sChipCfg->ePLLInFreq)); assert_param(CHECK_PLLOUT_CLK(sChipCfg->ePLLOutFreq)); u32PllCtl = _DrvSYS_PLL_Table[sChipCfg->ePLLInFreq][sChipCfg->ePLLOutFreq]; if (u32PllCtl == PLL_NOT_SUPPORTED) return -2; /* select correct pll clock source */ u32PllCtl |= sChipCfg->u32PLLClkSrc; /* set PLL control reg and waits for PLL clock stable */ CLK->PLLCTL = u32PllCtl; for (delayCnt=0; delayCnt<100000; delayCnt++) if (CLK->CLKSTATUS & CLK_CLKSTATUS_PLL_STB) break; if (delayCnt == 100000) return -3; } /* set HCLK divider and source */ CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_HCLK_MASK) | sChipCfg->u32HClkDiv; SYS_SelectHCLKSource(sChipCfg->u32HClkSrc); /* select required clock source for HCLk */ return 0; }
int32_t main(void) { int32_t bLoop = true; uint32_t com, seg, onoff; uint8_t u8Item; char input; char text[LCD_DIGIT_NUM]=""; int32_t idx = 0, blinkfreq, ret; long long num; S_LCD_INIT lcdinit; STR_UART_T param; SYS_SetChipClockSrc((CLK_PWRCTL_HXT_EN | CLK_PWRCTL_LXT_EN), 1); // Wait HXT and LXT stable while(SYS_CheckChipClockSrc(CLK_CLKSTATUS_LXT_STB | CLK_CLKSTATUS_HXT_STB) != 0) ; /* Select UART Clock Source From 12MHz */ SYS_SelectIPClockSource_1(CLK_CLKSEL1_UART_MASK, CLK_CLKSEL1_UART_HXT); MFP_UART0_TO_PORTA(); param.u32BaudRate = 115200; param.u32cDataBits = DRVUART_DATABITS_8; param.u32cStopBits = DRVUART_STOPBITS_1; param.u32cParity = DRVUART_PARITY_NONE; param.u32cRxTriggerLevel = DRVUART_FIFO_1BYTES; param.u8TimeOut = 0; UART_Init(UART0, ¶m); /* Select LCD Clock Source From 32KHz */ SYS_SelectIPClockSource_1(CLK_CLKSEL1_LCD_MASK, CLK_CLKSEL1_LCD_LXT); /* Select LCD Clock Source From 10KHz */ //SYS_SelectIPClockSource_1(CLK_CLKSEL1_LCD_MASK, CLK_CLKSEL1_LCD_LIRC); /* Select LCD COMs, SEGs, V1 ~ V3, DH1, DH2 */ MFP_LCD_TYPEA(); /* LCD Initialize */ lcdinit.cpump_enable = true; lcdinit.internal_bias = false; lcdinit.cpump_freqdiv = LCD_CPUMP_DIV1; lcdinit.cpump_voltage = LCD_CPVOl_3V; lcdinit.bias = LCD_BIAS_THIRD; lcdinit.mux = LCD_MUX_ONE_FOURTH; lcdinit.freqdiv = LCD_FREQ_DIV64; LCD_Init(&lcdinit); while(bLoop) { idx = 0; strcpy(text, ""); // clear buffer TestItem(); u8Item = getchar(); printf("%c\n", u8Item); switch(u8Item) { case '0': { printf("Input text: "); while(1) { input = getchar(); printf("%c", input); if(input == 0xD) break; strcat( text, &input); idx++; if(idx >= LCD_ALPHABET_NUM) break; } printf("\n"); printf("%s \n", text); LCD_Write(text); break; } case '1': { printf("Input number: "); while(1) { input = getchar(); printf("%c", input); if(input == 0xD) break; strcat( text, &input); idx++; if(idx >= LCD_DIGIT_NUM) break; } printf("\n"); //num = atof(text); num = local_atoi(text); LCD_Number(num); break; } case '2': { //DrvLCD_Write("NUVOTON"); LCD_Number(8888888888888); input: printf("Input the frequency of blinking (ms): "); blinkfreq = sysGetNum(); printf("\n"); ret = LCD_BlinkFrequency(blinkfreq); if(ret == ERR_LCD_CAL_BLINK_FAIL) { printf("Over the time range and input again...\n"); goto input; } LCD_EnableInt(LCD_FRAMECOUNT_INT); LCD_EnableBlink(); printf("Any key to end Blinking display..."); getchar(); LCD_DisableBlink(); break; } case '3': printf("Pixel On/Off (1:On, 0:Off): "); onoff = sysGetNum(); printf("\n"); if(onoff>1) continue; printf("Input Com: "); com = sysGetNum(); printf("\nInput Segment: "); seg = sysGetNum(); if(onoff) LCD_EnableSegment(com, seg); else LCD_DisableSegment(com, seg); break; case '4': bLoop = false; break; default: printf("Wrong Item\n"); break; } } LCD_Disable(); return true; }