打印
[DemoCode下载]

M258 GPIO 实现 ARGB2 LED 灯效

[复制链接]
686|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
643757107|  楼主 | 2022-6-13 21:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GB, IO, ar, gp, pi
EC_M258_GPIO_ARGB2_LED_Control_V1.00.zip (5.87 MB)
码使用M251、M252、M254、M256、M258系列的GPIO来模拟第二代灯条(ARGB2) 的时序,并演示ARGB2 LED 彩虹灯、跑马灯效果。此范例代码使用一组Timer来定时更新ARGB2 LED彩虹灯、跑马灯的颜色,一组UART用来选择执行模式。
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
* [url=home.php?mod=space&uid=247401]@brief[/url]    Show how to use GPIO input/output to control ARGB2 strip.
*
* SPDX-License-Identifier: Apache-2.0
* [url=home.php?mod=space&uid=17282]@CopyRight[/url] (C) 2022 Nuvoton Technology Corp. All rights reserved.
******************************************************************************/
#include "stdio.h"
#include "NuMicro.h"
#include "Nuvoton_ARGB2_Strip.h"

/*---------------------------------------------------------------------------------------------------------*/
/* Global variables                                                                                        */
/*---------------------------------------------------------------------------------------------------------*/
volatile int32_t g_i32Wait = TRUE;
int FeedbackMode_LEDcnt = 0;
int ch;

char        MODE = '0';                                                                                                                        //Which MODE to run,        0: Strip_GRBLoop()
                                                                                                                                                                                        //                                                                                1: Strip_rainbowCycle()
                                                                                                                                                                                        //                                                                                2: Strip_theaterChaseRainbow()
                                                                                                                                                                                        //                                                                                3: Strip_feedbackMode()
                                                                                                                                                                                        //                                                                                4: Strip_Th20SetMode()
                                                                                                                                                                                        //                                                                                 5: Y cable mode()


//Y Cable Mode
char Command = '2';                                                                                                                //Set_ID = 1, Clr_ID = 2, Chk_ID = 3, Specify_ID = 4
char ID        = '0';                                                                                                                                 //range: 0x0~0xf

char ID_set_status[16] = {0, 0, 0, 0, 0, 0,
                                                                                                        0, 0, 0, 0, 0,
                                                                                                        0, 0, 0, 0, 0};
char ID_set_status_chg = FALSE;

char ID_chk_status[16] = {0, 0, 0, 0, 0, 0,
                                                                                                        0, 0, 0, 0, 0,
                                                                                                        0, 0, 0, 0, 0};
char ID_chk_status_chg = FALSE;

extern int YCableMode_SetID_cnt;
extern int YCableMode_ChkID_cnt;

/*---------------------------------------------------------------------------------------------------------*/
/* Define functions prototype                                                                              */
/*---------------------------------------------------------------------------------------------------------*/
void TerminalShow_Init(void);
void FeedbackMode_waitFeedback(void);
void YCableMode_SetCommandID(void);

void SYS_Init(void)
{

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/
               
    /* Enable HIRC clock (Internal RC 48 MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

    /* Wait for HIRC clock ready */
    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

    /* Select HCLK clock source as HIRC and and HCLK clock divider as 1 */
    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));
               
                /* Set both PCLK0 and PCLK1 as HCLK */
    CLK->PCLKDIV = CLK_PCLKDIV_APB0DIV_DIV1 | CLK_PCLKDIV_APB1DIV_DIV1;

    /* Select IP clock source */
    /* Select UART0 clock source is HIRC */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));
               
                /* Enable IP clock */
    CLK_EnableModuleClock(GPC_MODULE);
                CLK_EnableModuleClock(UART0_MODULE);
    CLK_EnableModuleClock(TMR0_MODULE);
               
                /* Select IP clock source */
                CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_PCLK0, 0);
               
                /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
    SystemCoreClockUpdate();
               
                /*----------------------------------------------------------------------*/
    /* Init I/O Multi-function                                              */
    /*----------------------------------------------------------------------*/
    /* Set PB multi-function pins for UART0 RXD and TXD */
    Uart0DefaultMPF();
               
}

/*---------------------------------------------------------------------------------------------------------*/
/* ISR to handle GPIO(PC) interrupt event                                                                                              */
/*---------------------------------------------------------------------------------------------------------*/
void GPC_IRQHandler(void)
{
                /* To check if PC.2 interrupt occurred */
    if (GPIO_GET_INT_FLAG(Dout_Port, Dout_PinMask))
                {
                                GPIO_CLR_INT_FLAG(Dout_Port, Dout_PinMask);
                               
                                if(MODE == '3')
                                {
                                                FeedbackMode_LEDcnt++;
                                }
                                else if((MODE == '5') && (Command == 1))
                                {
                                                ID_set_status[YCableMode_SetID_cnt] = 1;
                                                ID_set_status_chg = TRUE;
                                }
                                else if((MODE == '5') && ((Command == 3) || (Command == 4)))
                                {
                                                ID_chk_status[YCableMode_ChkID_cnt] = 1;
                                                ID_chk_status_chg = TRUE;
                                }
                }
                else
                {
                                uint32_t u32Status;
        u32Status = PC->INTSRC;
        /* Un-expected interrupt. Just clear all PC interrupts */
        PC->INTSRC = u32Status;
                }
}

/*---------------------------------------------------------------------------------------------------------*/
/* Init UART0                                                                                             */
/*---------------------------------------------------------------------------------------------------------*/
void UART0_Init(void)
{
                /* Configure UART0 and set UART0 baud rate */
    UART_Open(UART0, 115200);
}

/*---------------------------------------------------------------------------------------------------------*/
/* ISR to handle UART0 interrupt event                                                            */
/*---------------------------------------------------------------------------------------------------------*/
void UART0_IRQHandler(void)
{
       
                uint32_t u32IntSts = UART0->INTSTS;
               
                g_i32Wait = FALSE;
               
                if ((u32IntSts & UART_INTSTS_RDAINT_Msk) || (u32IntSts & UART_INTSTS_RXTOINT_Msk))
                {
                                /* Get all the input characters */
                                while (UART_GET_RX_EMPTY(UART0) == 0)
                                {
                                                /* Get the character from UART Buffer */
                                                uint8_t u8InChar = UART_READ(UART0);
                                                MODE = u8InChar;
                                                printf("%c\n\n", u8InChar);       
                                               
                                                if(MODE == '5')
                                                {
                                                                UART_DisableInt(UART0, UART_INTEN_RDAIEN_Msk);                                               
                                                               
                                                                YCableMode_SetCommandID();
                                                               
                                                                UART_EnableInt(UART0, UART_INTEN_RDAIEN_Msk);
                                                }
                                                else
                                                {
                                                                if((MODE == '0') || (MODE == '1') || (MODE == '2'))
                                                                {
                                                                                GPIO_SetMode(Dout_Port, Dout_PinMask, GPIO_MODE_OUTPUT);
                                                                }
                                                                                       
                                                                printf("+---------------------------------------+\n");
                                                                printf("  Press the key to start test ARGB2\n");
                                                                printf("+---------------------------------------+\n");
                                                                printf("    0: Run GRBLoop\n");
                                                                printf("    1: Run rainbowCycle\n");
                                                                printf("    2: Run theaterChaseRainbow\n");
                                                                printf("    3: Run Feedback mode\n");
                                                                printf("    4: Run TH20 SET mode\n");
                                                                printf("    5: Run Y cable mode\n");
                                                                printf("    Others: mode pause\n");
                                                                printf("+---------------------------------------+\n");
                                                               
                                                                if((MODE == '0') || (MODE == '1') || (MODE == '2') || (MODE == '3') || (MODE == '4') || (MODE == '5'))
                                                                {
                                                                                printf("Start to run MODE: %c!\n\n", MODE);
                                                                               
                                                                                if(MODE == '3')
                                                                                {
                                                                                                printf("Please check only one strip to test.\n");
                                                                                }
                                                                                else
                                                                                {
                                                                                                printf("Press the key: ");
                                                                                }
                                                                }
                                                                else
                                                                {
                                                                                printf("Please press key range from 0 to 5\n");
                                                                                printf("Press the key: ");
                                                                }                                                                               
                                                }                       
                                }
                               
                                GPIO_SetMode(Dout_Port, Dout_PinMask, GPIO_MODE_OUTPUT);
                               
                                /*Forces a write of all user-space buffered data for the given output*/
        fflush(stdout);               
                }
               
                if (UART0->FIFOSTS & (UART_FIFOSTS_BIF_Msk | UART_FIFOSTS_FEF_Msk | UART_FIFOSTS_PEF_Msk | UART_FIFOSTS_RXOVIF_Msk))
    {
        UART0->FIFOSTS = (UART_FIFOSTS_BIF_Msk | UART_FIFOSTS_FEF_Msk | UART_FIFOSTS_PEF_Msk | UART_FIFOSTS_RXOVIF_Msk);
    }
}

/*---------------------------------------------------------------------------------------------------------*/
/* Init TIMER0                                                                                             */
/*---------------------------------------------------------------------------------------------------------*/
void TIMER0_Init(void)
{
    /* Configure and set TIMER0 */
    // Give a dummy target frequency here. Will over write prescale and compare value with macro
    TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 48000000);

    // Update prescale and compare value to what we need in event counter mode.
    TIMER_SET_PRESCALE_VALUE(TIMER0, 0);
    TIMER_SET_CMP_VALUE(TIMER0, 160);
       
    // Counter increase on rising edge
    TIMER_EnableEventCounter(TIMER0, TIMER_COUNTER_EVENT_RISING);
}

/*---------------------------------------------------------------------------------------------------------*/
/*  Main Function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/
int main(void)
{

    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, peripheral clock and multi-function I/O */
    SYS_Init();
               
                /* Init UART0 for printf and test */
    UART0_Init();

    /* Lock protected registers */
    SYS_LockReg();

    /* Init ARGB2 Strip */
    Strip_Init();
               
                /* Init display of first show in terminal*/
    TerminalShow_Init();
               
          while(1)
                {
                                switch(MODE)
                                {
                                        case '0':                                                                                                                //Run GRBLoop
                                                Strip_GRBLoop();
                                                break;
                                        case '1':                                                                                                                //Run rainbowCycle
                                                Strip_rainbowCycle();
                                                break;
                                        case '2':                                                                                                                //Run theaterChaseRainbow
                                                Strip_theaterChaseRainbow();
                                                break;
                                        case '3':                                                                                                                //feedback mode                                               
                                                Strip_FeedbackMode();
                                                FeedbackMode_waitFeedback();
                                                break;
                                        case '4':                                                                                                                //TH20 SET mode                                       
                                                Strip_Th20SetMode();
                                                break;
                                        case '5':                                                                                                                //Y cable mode                                       
                                                Strip_YCableMode();
                                                break;
                                        default:
                                                break;
                                }
                }
               
}

/**
  * @brief  Setting of first show in terminal after power on
  * @param  None
  * @retval None
  */
void TerminalShow_Init(void)
{
                printf("+---------------------------------------+\n");
                printf("  Press the key to start test ARGB2\n");
                printf("+---------------------------------------+\n");
                printf("    0: Run GRBLoop\n");
                printf("    1: Run rainbowCycle\n");
                printf("    2: Run theaterChaseRainbow\n");
                printf("    3: Run Feedback mode\n");
                printf("    4: Run TH20 SET mode\n");
                printf("    5: Run Y cable mode\n");
                printf("    Others: mode pause\n");
                printf("+---------------------------------------+\n");
                printf("  Press the key: ");
               
                UART_SetTimeoutCnt(UART0, 0x10);

    UART0->FIFO &= ~ UART_FIFO_RFITL_Msk;
    UART0->FIFO |= UART_FIFO_RFITL_1BYTE;
               
                /* Enable UART RDA/THRE/Time-out interrupt */
    NVIC_EnableIRQ(UART0_IRQn);
                UART_EnableInt(UART0, UART_INTEN_RDAIEN_Msk);
               
                while (g_i32Wait);
               
                g_i32Wait = FALSE;
}

/**
  * @brief  Wait pulse from ARGB2 that know LED's number in a strip
  * @param  None
  * @retval None
  */
void FeedbackMode_waitFeedback(void)
{
                TIMER_Delay(TIMER0, 1000000);
                                       
                printf("There are %d pcs LED in the strip\n", FeedbackMode_LEDcnt);
       
                GPIO_DisableInt(Dout_Port, Dout_IRQn_Pin);
                FeedbackMode_LEDcnt = 0;
                printf("Press ENTER key to Continue...\n");  
                scanf("%d",&ch);
}

/**
  * @brief  Use to show information and set Command and ID about Y Cable mode
  * @param  None
  * @retval None
  */
void YCableMode_SetCommandID(void)
{
                printf("Start the setting of Y Cable mode\n");
               
                printf("Please set Command, then press the ENTER.: (Set_ID = 1, Clr_ID = 2, Chk_ID = 3, Specify_ID = 4)\n");
                printf("Command:");
                scanf("%d",&ch);
                Command = ch;
                printf("%d\n\n", Command);
                                                               
                printf("Please set ID, then press the ENTER.: (Range: 0x0~0xf)\n");
                printf("ID:");
                scanf("%d",&ch);
                ID = ch;       
                printf("%d\n\n", ID);
                printf("You set the Command = %d, ID = %d\n\n", Command, ID);
               
                if(ID > 0xf)
                {
                                printf("Setting ID is over range. (0x0~0xf)\n");
                                printf("Leave Y Cable mode.\n\n");
                               
                                printf("Press any key to start test.\n");
                       
                                return;
                }
               
                if(Command == 1)
                {
                                printf("Run Set_ID function. Setting number is all strip in parallel. ID start from %d to last .\n", ID);
                                printf("You can check waveform from an oscilloscope now.\n");
                }
                else if(Command == 2)
                {
                                if(ID == 0)
                                {
                                                printf("Run Clr_ID function. Clear all strip's ID to 0.\n");
                                }
                                else if((ID > 0) && (ID <= 0xf))
                                {
                                                printf("Run Clr_ID. Clear strip's ID to 0.\n");
                                }               
                               
                                printf("You can check waveform from an oscilloscope now.\n");
                }
                else if(Command == 3)
                {
                                printf("Run Chk_ID function. Checking number is all strip in parallel. ID start from %d to last .\n", ID);
                                printf("You can check waveform from an oscilloscope now.\n");
                }
                else if(Command == 4)
                {
                                printf("Run Specify_ID function. Specifying number is all strip in parallel. ID start from %d to last one.\n", ID);
                                printf("You can see all strip show the different light effect.\n");
                }
                else
                {
                                printf("Set Command error!\n");
                                printf("Leave Y Cable mode.\n\n");
                }
               
               
                printf("Press any key to run other mode.\n");
}



使用特权

评论回复
沙发
kiwis66| | 2022-6-19 14:42 | 只看该作者
ARGB2是灯带的型号,还是什么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

3805

帖子

11

粉丝