- /**************************************************************************//**
- * [url=home.php?mod=space&uid=288409]@file[/url] main.c
- * [url=home.php?mod=space&uid=895143]@version[/url] V3.00
- * [url=home.php?mod=space&uid=247401]@brief[/url] GPIO function for level1 training course
- *
- *
- * SPDX-License-Identifier: Apache-2.0
- * [url=home.php?mod=space&uid=17282]@CopyRight[/url] (C) 2018 Nuvoton Technology Corp. All rights reserved.
- *
- ******************************************************************************/
- #include <stdio.h>
- #include "NuMicro.h"
- #define LED_R PC4
- #define LED_G PC5
- #define LED_B PC3
- #define LED_ON 0
- #define LED_OFF 1
- volatile uint32_t sw1_int_cnt = 0;
- volatile uint32_t sw2_int_cnt = 0;
- void SYS_Init(void)
- {
- /* Enable HXT clock (external XTAL 12MHz) */
- CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);
- /* Wait for HXT clock ready */
- CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
- /* Enable LIRC clock */
- CLK_EnableXtalRC(CLK_PWRCTL_LIRCEN_Msk);
- /* Wait for LIRC clock ready */
- CLK_WaitClockReady(CLK_STATUS_LIRCSTB_Msk);
- /* Set core clock as PLL_CLOCK from PLL */
- CLK_SetCoreClock(FREQ_48MHZ);
- /* Set PCLK0/PCLK1 to HCLK/2 */
- CLK->PCLKDIV = (CLK_PCLKDIV_APB0DIV_DIV2 | CLK_PCLKDIV_APB1DIV_DIV2);
- /* Enable module clock */
- CLK_EnableModuleClock(UART0_MODULE);
- /* Set module clock */
- CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HXT, CLK_CLKDIV0_UART0(1));
- }
- void UART0_Init()
- {
- /* Set GPB multi-function pins to UART0 RXD and TXD */
- SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)) |
- (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);
- /* Configure UART0 and set UART0 baud rate */
- UART_Open(UART0, 115200);
- }
- void LED_Init(void)
- {
- /* Set PC.3 ~ PC.5 to GPIO */
- SYS->GPC_MFPL = (SYS->GPC_MFPL & ~(SYS_GPC_MFPL_PC3MFP_Msk | SYS_GPC_MFPL_PC4MFP_Msk | SYS_GPC_MFPL_PC5MFP_Msk)) |
- (SYS_GPC_MFPL_PC3MFP_GPIO | SYS_GPC_MFPL_PC4MFP_GPIO | SYS_GPC_MFPL_PC5MFP_GPIO);
- /* Set PC.3 ~ PC.5 to GPIO output */
- GPIO_SetMode(PC, (BIT3 | BIT4 | BIT5), GPIO_MODE_OUTPUT);
- /* Let LED off after initialize */
- LED_R = LED_OFF;
- LED_G = LED_OFF;
- LED_B = LED_OFF;
- }
- void BTN_Init(void)
- {
- /************** SW1 ***************/
- /* Set PB.4 to GPIO */
- SYS->GPB_MFPL = (SYS->GPB_MFPL & ~(SYS_GPB_MFPL_PB4MFP_Msk)) | (SYS_GPB_MFPL_PB4MFP_GPIO);
- /* Set PB.4 to GPIO intput */
- GPIO_SetMode(PB, BIT4, GPIO_MODE_INPUT);
- GPIO_EnableInt(PB, 4, GPIO_INT_FALLING);
- NVIC_EnableIRQ(GPIO_PAPB_IRQn);
- /************** SW2 ***************/
- /* Set PB.0 to GPIO */
- SYS->GPB_MFPL = (SYS->GPB_MFPL & ~(SYS_GPB_MFPL_PB0MFP_Msk)) | (SYS_GPB_MFPL_PB0MFP_GPIO);
- /* Set PB.0 to GPIO intput */
- GPIO_SetMode(PB, BIT0, GPIO_MODE_INPUT);
- GPIO_EnableInt(PB, 0, GPIO_INT_FALLING);
- /* Set de-bounce function */
- GPIO_SET_DEBOUNCE_TIME(GPIO_DBCTL_DBCLKSRC_LIRC, GPIO_DBCTL_DBCLKSEL_512);
- GPIO_ENABLE_DEBOUNCE(PB, BIT4);
- }
- int main(void)
- {
- uint32_t sw1_cnt = 0, sw2_cnt = 0;
- /* Unlock protected registers */
- SYS_UnlockReg();
- /* Init System, peripheral clock and multi-function I/O */
- SYS_Init();
- /* Lock protected registers */
- SYS_LockReg();
- /* Init UART0 for printf */
- UART0_Init();
- printf("+---------------------------------------+\n");
- printf("| Level1 GPIO control Sample Code |\n");
- printf("+---------------------------------------+\n\n");
- /* Init LED */
- LED_Init();
- /* Init BTN */
- BTN_Init();
- while(1)
- {
- /* Check if the SW1 is pressed */
- if (sw1_int_cnt != sw1_cnt)
- {
- sw1_cnt = sw1_int_cnt;
- printf("SW1 interrupt count: %d\n", sw1_cnt);
- }
- /* Check if the SW2 is pressed */
- if (sw2_int_cnt != sw2_cnt)
- {
- sw2_cnt = sw2_int_cnt;
- printf("SW2 interrupt count: %d\n", sw2_cnt);
- }
- }
- }
- void GPABGH_IRQHandler(void)
- {
- /* Check if PB.4 the interrupt occurred */
- if(GPIO_GET_INT_FLAG(PB, BIT4))
- {
- LED_R ^= 1;
- sw1_int_cnt++;
- /* Clear PB.4 interrupt flag */
- GPIO_CLR_INT_FLAG(PB, BIT4);
- /* Check if PB.0 the interrupt occurred */
- }
- else if(GPIO_GET_INT_FLAG(PB, BIT0))
- {
- LED_G ^= 1;
- sw2_int_cnt++;
- /* Clear PB.0 interrupt flag */
- GPIO_CLR_INT_FLAG(PB, BIT0);
- }
- else
- {
- /* Un-expected interrupt. Just clear all PB interrupts */
- PB->INTSRC = PB->INTSRC;
- printf("Un-expected interrupts.\n");
- }
- }
- /*** (C) COPYRIGHT 2019 Nuvoton Technology Corp. ***/
|