打印
[DemoCode下载]

【新唐资料分享月】NUC100工程模板

[复制链接]
2252|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wujianwei3980|  楼主 | 2016-12-21 10:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
NUC100工程模板, 包含ADC, PWM, Capture,TIMER, 读写Dataflash功能

NUC100_Template.zip

90.06 KB

沙发
heisexingqisi| | 2016-12-21 18:03 | 只看该作者
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/* Writed by Nuvoton(SH) CF10.   2013/02/25                                                                                                        */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvFMC.h"
#include "DrvSYS.h"
#include "DrvPWM.h"
#include "DrvADC.h"
#include "DrvTIMER.h"
/*---------------------------------------------------------------------------------------------------------*/
/* Define functions prototype                                                                              */
/*---------------------------------------------------------------------------------------------------------*/

void TMR0_Callback(uint32_t u32Param)
{       
        GPIOC->DOUT ^= (1 << 3);          //定时器中断取反IO口   
}


void CalPeriodTime(uint8_t u8Capture)
{
    uint16_t u32Count[4];
    uint32_t u32i;
    uint16_t u16RisingTime, u16FallingTime, u16HighPeroid, u16LowPeroid, u16TotalPeroid;
   
    /* Clear the Capture Interrupt Flag  */
    DrvPWM_ClearCaptureIntStatus(u8Capture, DRVPWM_CAP_FALLING_FLAG);
   
    /* Wait for Interrupt Flag  (Falling) */
    while (DrvPWM_GetCaptureIntStatus(u8Capture, DRVPWM_CAP_FALLING_FLAG) != 1);
   
    /* Clear the Capture Interrupt Flag */
    DrvPWM_ClearCaptureIntStatus(u8Capture, DRVPWM_CAP_FALLING_FLAG);
   
    u32i = 0;
   
    while (u32i < 4)
    {
        /* Wait for Interrupt Flag (Falling) */
        while(DrvPWM_GetCaptureIntStatus(u8Capture, DRVPWM_CAP_FALLING_FLAG) != 1);

        /* Clear the Capture Interrupt Flag */
        DrvPWM_ClearCaptureIntStatus(u8Capture, DRVPWM_CAP_FALLING_FLAG);

        /* Clear the Capture Rising Interrupt Flag */
        DrvPWM_ClearCaptureIntStatus(u8Capture, DRVPWM_CAP_RISING_FLAG);
               
        /* Get the Falling Counter Data */
        u32Count[u32i++] = DrvPWM_GetFallingCounter(u8Capture);
        
        /* Wait for Capture Rising Interrupt Flag */
        while(DrvPWM_GetCaptureIntStatus(u8Capture, DRVPWM_CAP_RISING_FLAG) != 1);
        
        /* Clear the Capture Rising Interrupt Flag */
        DrvPWM_ClearCaptureIntStatus(u8Capture, DRVPWM_CAP_RISING_FLAG);
        
        /* Get the Rising Counter Data */
        u32Count[u32i++] = DrvPWM_GetRisingCounter(u8Capture);
    }   
    //因为使能了下降沿中断,所以下降沿会复位计数器的值,上升沿不会复位计数器
    u16RisingTime = u32Count[1];   //检测到上升沿时计数器的值  
   
    u16FallingTime = u32Count[0];  //检测到下降沿时计数器的值   
   
    u16HighPeroid = u32Count[1] - u32Count[2]; //高电平的时间
   
    u16LowPeroid = 0x10000 - u32Count[1];      //低电平的时间
   
    u16TotalPeroid = 0x10000 - u32Count[2];    //周期时间
        
    printf("Capture Test Result:\nRising Time = %d, Falling Time = %d.\nHigh Period = %d, Low  Period = %d, Total Period = %d.\n\n",
        u16RisingTime, u16FallingTime, u16HighPeroid, u16LowPeroid, u16TotalPeroid);
}


void Test_TIMER(void)
{       
    DrvTIMER_Init();
                DrvTIMER_Open(E_TMR0, 4, E_PERIODIC_MODE);  //配置定时器为周期模式
                DrvTIMER_SetTimerEvent(E_TMR0, 2, (TIMER_CALLBACK)TMR0_Callback, 1);//配置每秒中断两次
                DrvTIMER_EnableInt(E_TMR0);    //使能定时器中断
                DrvTIMER_Start(E_TMR0);         
}       

void Test_PWM_CAP(void)     //需要PWM0和PWM3连在一起
{       
          uint8_t u8Timer, u8CapTimer;
          S_DRVPWM_TIME_DATA_T sPt;
       
        /* Enable PWM clock */
    DrvPWM_Open();  
   
    /* Set PWM pins */
    DrvGPIO_InitFunction(E_FUNC_PWM01);
                DrvGPIO_InitFunction(E_FUNC_PWM23);

    /* PWM Timer property */
    sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;  //配置为自动重载初值模式
    sPt.u32Frequency = 1000;     //PWM0输出频率1K
    sPt.u8HighPulseRatio = 30;   //占空比30%
    sPt.i32Inverter = 0;         //输出不反向  
    u8Timer = DRVPWM_TIMER0;     //PWM0
                                
    /* Select PWM engine clock */
    DrvPWM_SelectClockSource(u8Timer, DRVPWM_HCLK);
   
    /* Set PWM Timer0 Configuration */
    DrvPWM_SetTimerClk(u8Timer, &sPt);

    /* Enable Output for PWM Timer0 */
    DrvPWM_SetTimerIO(u8Timer, 1);
               
                /* Enable the PWM Timer 0 */
    DrvPWM_Enable(u8Timer, 1);               
                               
                /*--------------------------------------------------------------------------------------*/
                /* Set the PWM Capture 3 for capture function                                           */
                /*--------------------------------------------------------------------------------------*/

                /* PWM Timer property for Capture */
                sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE;
                sPt.u32Frequency = 100;         /* Set the proper frequency to capture data (Less than the input data)*/
                sPt.u8HighPulseRatio = 50;      /* High Pulse peroid : Total Pulse peroid = 50 : 100 (Set a non-zero value) */
                sPt.u32Duty = 0x10000;  //计数器初值/* Set the counter to the maximum value */
                sPt.i32Inverter = 0;
                u8CapTimer = DRVPWM_CAP3; //配置PWM3作为捕获通道

                /* Select PWM engine clock */
                DrvPWM_SelectClockSource(u8CapTimer, DRVPWM_EXT_12M);//选择外部12M晶振做时钟源
               
                /* Set PWM Timer 3 for Capture */
                DrvPWM_SetTimerClk(u8CapTimer, &sPt);
               
                /* Enable Interrupt Sources of PWM Capture3 */
                DrvPWM_EnableInt(u8CapTimer, DRVPWM_CAP_FALLING_INT, NULL);//使能下降沿中断
               
                /* Enable Input function for PWM Capture 3 */
                DrvPWM_SetTimerIO(u8CapTimer, 1);
               
                /* Enable the PWM Capture3 */
                DrvPWM_Enable(u8CapTimer, 1);

                /* Capture the Input Waveform Data */
                CalPeriodTime(u8CapTimer);   //计算捕获时间
}

void Test_ADC(void)
{       
    int32_t i32ConversionData;
       
                DrvADC_Open(ADC_SINGLE_END, ADC_SINGLE_OP, 0, EXTERNAL_12MHZ, 1);       
                /* Disable the digital input path */
                DrvGPIO_DisableDigitalInputBit(E_GPA, 0); //关闭ADC0数字输入通道
                /* Configure the corresponding ADC analog input pin */
                DrvGPIO_InitFunction(E_FUNC_ADC0);  //使能ADC0管脚功能
                                                               
                DrvADC_SetADCChannel(1);        //使能ADC0通道
                while(1)
                {                                           
                        /* start A/D conversion */
                        DrvADC_StartConvert();      

                        /* Wait conversion done */
                        while(DrvADC_IsConversionDone()==FALSE);
      ADC->ADSR.ADF=1;                           //清转换完成标志
                        i32ConversionData = DrvADC_GetConversionData(0);  //读取转换结果
                        printf("Conversion result: 0x%X (%d)\n\n",  i32ConversionData,        i32ConversionData);
                        DrvSYS_Delay(200000);               
                }
}       

void Test_DataFlash(void)
{       
                uint32_t base,Data;
                uint32_t config0;

                UNLOCKREG();
                SYSCLK->PWRCON.OSC22M_EN = 1;
                DrvSYS_Delay(22);
                SYSCLK->AHBCLK.ISP_EN = 1;
                FMC->ISPCON.ISPEN = 1;

                //这一部分可以在烧录代码时配置好
                //enable data flash for 128K APROM
                DrvFMC_Read(0x300000, &config0);      //读Cfg0
                config0 &= ~0x1;                      //使能数据Flash,(仅对于128K的型号)
                FMC->ISPCON.CFGUEN = 1;               //使能ISP更新Config功能
                DrvFMC_Erase(0x300000);
                DrvFMC_Write(0x300000, config0);
                DrvFMC_Write(0x300004, 0x1F000);      //配置好config要复位芯片后才生效
                //用户配置
                base = DrvFMC_ReadDataFlashBaseAddr();         //读一下数据Flash的基址

                DrvFMC_Erase(base);                         //erase 0x1F000 - 0x1F200
                DrvFMC_Write(base, 0x3333CCCC);         //写一个字到基地址
                DrvFMC_Write(base+4, 0x55555555);       //写第二个字
                DrvFMC_Read(base, &Data);               //读出第一个数据校验
                if(Data!=0x3333CCCC)   
                          printf("DataFlash test fail\n");
                else
                          printf("DataFlash test succeed\n");
}       
/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                                                 */
/*---------------------------------------------------------------------------------------------------------*/

int32_t main()
{               
                /* SYSCLK =>12Mhz*/
                UNLOCKREG();
                DrvSYS_SetOscCtrl(E_SYS_XTL12M,ENABLE);
                DrvSYS_Delay(5000);
                DrvSYS_Open(50000000);
                DrvSYS_Delay(5000);
                       
                DrvGPIO_Open(E_GPC, 3, E_IO_OUTPUT);
       
                Test_DataFlash();
                       
                Test_TIMER();
               
                Test_PWM_CAP();
               
                Test_ADC();
               
                while(1);       

}       


使用特权

评论回复
板凳
dongnanxibei| | 2016-12-21 20:09 | 只看该作者
void Test_TIMER(void)
{        
    DrvTIMER_Init();
                DrvTIMER_Open(E_TMR0, 4, E_PERIODIC_MODE);  //配置定时器为周期模式
                DrvTIMER_SetTimerEvent(E_TMR0, 2, (TIMER_CALLBACK)TMR0_Callback, 1);//配置每秒中断两次
                DrvTIMER_EnableInt(E_TMR0);    //使能定时器中断
                DrvTIMER_Start(E_TMR0);         
}     
测试定时器?

使用特权

评论回复
地板
zhuomuniao110| | 2016-12-21 20:50 | 只看该作者
捕获的应用很少用,看看怎么做。

使用特权

评论回复
5
643757107| | 2016-12-21 23:36 | 只看该作者
读写Dataflash功能不会,看看怎么做

使用特权

评论回复
6
syfw| | 2017-1-12 10:18 | 只看该作者

请问在往FLash里写数据或者读数据需要关闭所有中断吗

使用特权

评论回复
7
syfw| | 2017-1-12 10:52 | 只看该作者

请问写入Flash或者读Flash是否需要关闭所有中断啊?

使用特权

评论回复
8
wahahaheihei| | 2017-1-12 16:02 | 只看该作者
syfw 发表于 2017-1-12 10:52
请问写入Flash或者读Flash是否需要关闭所有中断啊?

我觉得这种事情肯定是最好关闭,要不会被打断吧。

使用特权

评论回复
9
wahahaheihei| | 2017-1-12 16:04 | 只看该作者
做关键事情的时候一定要关掉中断,万一打断了就不好看了。

使用特权

评论回复
10
huangcunxiake| | 2017-1-17 23:03 | 只看该作者
DrvFMC_Erase(base);                         //erase 0x1F000 - 0x1F200
                DrvFMC_Write(base, 0x3333CCCC);         //写一个字到基地址
                DrvFMC_Write(base+4, 0x55555555);       //写第二个字
                DrvFMC_Read(base, &Data);               //读出第一个数据校验

使用特权

评论回复
11
lee9888| | 2017-1-19 16:12 | 只看该作者
学习下PWM捕捉功能,谢

使用特权

评论回复
12
643757107| | 2017-1-20 19:02 | 只看该作者
   /* Enable PWM clock */
    DrvPWM_Open();  
貌似新唐有两套库函数吧,这个应该类似STM32的标准函数,现在应该也有个HAL的。

使用特权

评论回复
13
643757107| | 2017-1-26 11:50 | 只看该作者
HAL的不知道新唐开始支持没。

使用特权

评论回复
14
zhuomuniao110| | 2017-1-26 17:21 | 只看该作者
工程模板中的内容也非常丰富。

使用特权

评论回复
15
dongnanxibei| | 2017-1-26 19:56 | 只看该作者
我看看DataFlash的功能怎么做。

使用特权

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

本版积分规则

个人签名:分享资源,共同进步

99

主题

3237

帖子

10

粉丝