[DemoCode下载] M051多重演示例子

[复制链接]
581|4
 楼主| 小明的同学 发表于 2019-5-26 23:29 | 显示全部楼层 |阅读模式
TE, ni, PWM, TI
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2014 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. #include <stdio.h>
  7. #include "M051Series.h"
  8. #include "lcd_Driver.h"
  9. #include "EEPROM_24LC64.h"
  10. #include "spi_flash.h"

  11. #define PLLCON_SETTING      CLK_PLLCON_50MHz_HXT
  12. #define PLL_CLOCK           50000000

  13. void Delay(int32_t ms)
  14. {
  15.     int32_t i;

  16.     for(i = 0; i < ms; i++)
  17.         CLK_SysTickDelay(1000);/* SysTick to generate the delay time and the UNIT is in us.  */
  18. }

  19. void EINT0_IRQHandler(void)
  20. {
  21.     /* Clear GPIO Pin Interrupt Flag */
  22.     GPIO_CLR_INT_FLAG(P3, 0x1 << 2);

  23.     /* Toggle PWM3 enable/disable */
  24.     PWM_EnableOutput(PWMA, 1 << 3);

  25.     printf("EINT0 Interrupt!\n");
  26. }

  27. void TMR0_IRQHandler(void)
  28. {
  29.     /* Clears Timer time-out interrupt flag */
  30.     TIMER_ClearIntFlag(TIMER0);
  31. }

  32. void SPIFLASH_Init(void)
  33. {
  34.     /* Configure SPI1 as a master, MSB first, 8-bit transaction, SPI Mode-0 timing, clock is 2MHz */
  35.     SPI_Open(SPI1, SPI_MASTER, SPI_MODE_0, 8, 2000000);

  36.     /* Enable the automatic hardware slave select function. Select the SS0 pin and configure as low-active. */
  37.     SPI_EnableAutoSS(SPI1, SPI_SS, SPI_SS_ACTIVE_LOW);
  38.     SPI_EnableFIFO(SPI1, 2, 2);

  39.     /* Wait ready */
  40.     SpiFlash_WaitReady(SPI1);
  41. }

  42. void PWM_Init(void)
  43. {
  44.     /* PWM0 = 2Hz, duty cycle = 25 % */
  45.     /* PWM1 = 2Hz, duty cycle = 50 % */
  46.     /* PWM2 = 4Hz, duty cycle = 25 % */
  47.     /* PWM3 = 4Hz, duty cycle = 50 % */
  48.     /* Config PWM generator and get the nearest frequency in edge aligned auto-reload mode */
  49.     PWM_ConfigOutputChannel(PWMA, 0, 2, 25);
  50.     PWM_ConfigOutputChannel(PWMA, 1, 2, 50);
  51.     PWM_ConfigOutputChannel(PWMA, 2, 4, 25);
  52.     PWM_ConfigOutputChannel(PWMA, 3, 4, 50);

  53.     /* PWMA pin output enabled */
  54.     PWM_EnableOutput(PWMA, 0xF);

  55.     /* Start PWMA module */
  56.     PWM_Start(PWMA, 0xF);

  57. }

  58. void TMR0_Init(void)
  59. {
  60.     /* Configure timer to operate in periodic mode and frequency = 10Hz*/
  61.     TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 10);

  62.     /* Enable the Timer time-out interrupt */
  63.     TIMER_EnableInt(TIMER0);

  64.     /* Start Timer counting */
  65.     TIMER_Start(TIMER0);

  66.     /* Enable TMR0 Interrupt */
  67.     NVIC_EnableIRQ(TMR0_IRQn);
  68. }

  69. void EINT0_Init(void)
  70. {
  71.     /* Debounce function control */
  72.     GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_HCLK, GPIO_DBCLKSEL_32768);
  73.     /* Enable Pin De-bounce Function */
  74.     GPIO_ENABLE_DEBOUNCE(P3, 0x1 << 2);

  75.     /* Configure external interrupt */
  76.     GPIO_EnableInt(P3, 2, GPIO_INT_FALLING);
  77.     /* Enable EINT0 Interrupt */
  78.     NVIC_EnableIRQ(EINT0_IRQn);
  79. }

  80. void SYS_Init(void)
  81. {
  82.     /*---------------------------------------------------------------------------------------------------------*/
  83.     /* Init System Clock                                                                                       */
  84.     /*---------------------------------------------------------------------------------------------------------*/

  85.     /* Enable Internal RC 22.1184MHz clock */
  86.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  87.     /* Waiting for Internal RC clock ready */
  88.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  89.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  90.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  91.     /* Enable external XTAL 12MHz clock */
  92.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  93.     /* Waiting for external XTAL clock ready */
  94.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  95.     /* Set core clock as PLL_CLOCK from PLL */
  96.     CLK_SetCoreClock(PLL_CLOCK);

  97.     /* Enable IP clock */
  98.     CLK_EnableModuleClock(UART0_MODULE);
  99.     CLK_EnableModuleClock(SPI0_MODULE);
  100.     CLK_EnableModuleClock(SPI1_MODULE);
  101.     CLK_EnableModuleClock(ADC_MODULE);
  102.     CLK_EnableModuleClock(I2C0_MODULE);
  103.     CLK_EnableModuleClock(PWM01_MODULE);
  104.     CLK_EnableModuleClock(PWM23_MODULE);
  105.     CLK_EnableModuleClock(TMR0_MODULE);

  106.     /* IP clock source */
  107.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));
  108.     CLK_SetModuleClock(ADC_MODULE, CLK_CLKSEL1_ADC_S_HCLK, CLK_CLKDIV_ADC(4));
  109.     CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01_S_HXT, 0);
  110.     CLK_SetModuleClock(PWM23_MODULE, CLK_CLKSEL1_PWM23_S_HXT, 0);
  111.     CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0_S_HXT, 0);

  112.     /* Update System Core Clock */
  113.     /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
  114.     //SystemCoreClockUpdate();
  115.     PllClock        = PLL_CLOCK;            // PLL
  116.     SystemCoreClock = PLL_CLOCK / 1;        // HCLK
  117.     CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

  118.     /*---------------------------------------------------------------------------------------------------------*/
  119.     /* Init I/O Multi-function                                                                                 */
  120.     /*---------------------------------------------------------------------------------------------------------*/

  121.     /* Set P3 multi-function pins for UART0 RXD and TXD. Set P3.4 P3.5 for I2C  */
  122.     SYS->P3_MFP = SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0 | SYS_MFP_P34_SDA0 | SYS_MFP_P35_SCL0;

  123.     /* Set P1.4, P1.5, P1.6, P1.7 for SPI0 */
  124.     SYS->P1_MFP = SYS_MFP_P14_SPISS0 | SYS_MFP_P15_MOSI_0 | SYS_MFP_P16_MISO_0 | SYS_MFP_P17_SPICLK0;

  125.     /* Set P0.4, P0.5, P0.6, P0.7 for SPI1. Set P0.0 for AD0 */
  126.     SYS->P0_MFP = SYS_MFP_P04_SPISS1 | SYS_MFP_P05_MOSI_1 | SYS_MFP_P06_MISO_1 |
  127.                   SYS_MFP_P07_SPICLK1 | SYS_MFP_P00_AD0;

  128.     /* Set P4.0, P4.1 for PWM0, PWM1, PWM2, PWM3. Set P4.6, P4.7 for ICE */
  129.     SYS->P4_MFP = SYS_MFP_P40_PWM0 | SYS_MFP_P41_PWM1 | SYS_MFP_P42_PWM2 | SYS_MFP_P43_PWM3 |
  130.                   SYS_MFP_P46_ICE_CLK | SYS_MFP_P47_ICE_DAT;

  131. }

  132. /*---------------------------------------------------------------------------------------------------------*/
  133. /* Init UART                                                                                               */
  134. /*---------------------------------------------------------------------------------------------------------*/
  135. void UART0_Init()
  136. {
  137.     /* Reset IP */
  138.     SYS_ResetModule(UART0_RST);

  139.     /* Configure UART0 and set UART0 Baudrate */
  140.     UART_Open(UART0, 115200);
  141. }


  142. /*---------------------------------------------------------------------------------------------------------*/
  143. /* MAIN function                                                                                           */
  144. /*---------------------------------------------------------------------------------------------------------*/

  145. int main(void)
  146. {
  147.     uint32_t u32Counter = 0, u32AdcData = 0, u32I2cData, u32LedOn = 0;
  148.     uint32_t u32Id;
  149.     int32_t i32BuzzerCnt;
  150.     char AdcValue[15] = "ADC Value:";
  151.     char TestOk[15] = "Test OK:";
  152.     char strClearAdcValue[15] = "ADC Value:     ";

  153.     /* Unlock protected registers */
  154.     SYS_UnlockReg();

  155.     /* Init System, IP clock and multi-function I/O */
  156.     SYS_Init();

  157.     /* Lock protected registers */
  158.     SYS_LockReg();

  159.     /* Init UART0 for printf */
  160.     UART0_Init();

  161.     /*---------------------------------------------------------------------------------------------------------*/
  162.     /* Init Other peripherals                                                                                  */
  163.     /*---------------------------------------------------------------------------------------------------------*/
  164.     LCD_Init();
  165.     SPIFLASH_Init();
  166.     EEPROM_Init();
  167.     PWM_Init();
  168.     TMR0_Init();
  169.     EINT0_Init();

  170.     /*
  171.         StartKit is used to demo Nu-LB_004 learning board. This sample will test EEPROM, SPI Flash read/write by
  172.         I2C, SPI. And test LED by GPIO and PWM. Test KEY by EINT0. Use ADC to convert the voltage of
  173.         variable resistor by AD0. Generate 4kHz key sound by buzzer with PWM. LCD display is enabled to show working
  174.         message. CPU will be idle by __WFI() when a loop has been done. Timer events (every 100ms) or key events are
  175.         used to wakeup CPU to execute next loop.
  176.     */

  177.     LCD_EnableBackLight();
  178.     LCD_ClearScreen();

  179.     printf("CPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);

  180.     // SPI0 test
  181.     LCD_Print(0, "Welcome! Nuvoton");
  182.     LCD_Print(1, "This is LB test ");

  183.     i32BuzzerCnt = 1;
  184.     while(1)
  185.     {
  186.         /* Key sound */
  187.         if(PWMA->POE & PWM_POE_PWM3_Msk)
  188.         {
  189.             if(i32BuzzerCnt-- <= 0)
  190.             {
  191.                 /* Disable Buzzer */
  192.                 PWM_DisableOutput(PWMA, 0x1 << 3);
  193.             }
  194.         }
  195.         else
  196.             i32BuzzerCnt = 1;

  197.         printf("\nTest time: %d\n", u32Counter++);

  198.         /* LED test */
  199.         if(u32Counter % 8 == 0)
  200.             u32LedOn = 0x01;
  201.         GPIO_SET_OUT_DATA(P2, ~u32LedOn); /* Set GPIO Port OUT Data */
  202.         u32LedOn <<= 1;

  203.         /* Check ADC is idle */
  204.         if((ADC->ADCR & ADC_ADCR_ADST_Msk) == 0)
  205.         {
  206.             /* Read the result from last ADC convert */
  207.             u32AdcData = ADC_GET_CONVERSION_DATA(ADC, 0);

  208.             printf("ADC value: %d\n", u32AdcData);
  209.             sprintf(AdcValue + 10, "%d", u32AdcData);
  210.             LCD_Print(3, strClearAdcValue);
  211.             LCD_Print(3, AdcValue);

  212.             /* Set the ADC operation mode as single, input mode as single-end and enable the analog input channel 0 */
  213.             ADC_Open(ADC, ADC_ADCR_DIFFEN_SINGLE_END, ADC_ADCR_ADMD_SINGLE, 0x1);

  214.             /* Power on ADC module */
  215.             ADC_POWER_ON(ADC);

  216.             /* Start A/D conversion */
  217.             ADC_START_CONV(ADC);
  218.         }

  219.         /*I2C test*/
  220.         u32AdcData = (u32Counter + u32AdcData) & 0xFF;
  221.         EEPROM_Write(u32Counter, u32AdcData);/* Write data to EEPROM */
  222.         u32I2cData = EEPROM_Read(u32Counter);/* Read data from EEPROM */
  223.         if(u32I2cData != u32AdcData)
  224.         {
  225.             LCD_Print(2, "I2C fail ");
  226.             while(1);
  227.         }
  228.         else
  229.             printf("I2C address:0x%x, Data:0x%x\n", u32Counter, u32I2cData);

  230.         /*SPI1 test*/
  231.         u32Id = SpiFlash_ReadMidDid(SPI1) & 0xFFFFUL;
  232.         if(u32Id != 0xEF14)  /*Get flash ID*/
  233.         {
  234.             LCD_Print(2, "SPI fail ");
  235.             while(1);
  236.         }

  237.         //Test OK
  238.         sprintf(TestOk + 8, "%d", u32Counter);
  239.         LCD_Print(2, TestOk);

  240.         /* Waiting for events */
  241.         __WFI();
  242.     }
  243. }






 楼主| 小明的同学 发表于 2019-5-26 23:29 | 显示全部楼层
    SPIFLASH_Init();
    EEPROM_Init();
    PWM_Init();
    TMR0_Init();
    EINT0_Init();
捉虫天师 发表于 2019-5-27 16:14 | 显示全部楼层
多个功能一起用。
equivalent 发表于 2019-5-29 20:40 | 显示全部楼层
感谢分享!学习了
稳稳の幸福 发表于 2019-5-29 22:47 | 显示全部楼层
多个外设操作,高级。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

159

主题

1640

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部