Exemplo n.º 1
0
/**
  * @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;
}
Exemplo n.º 2
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, &param);

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

}