搜索
bottom↓
回复: 14

M051学习简记--定时器

[复制链接]

出0入0汤圆

发表于 2010-11-15 10:30:49 | 显示全部楼层 |阅读模式
新唐M051的库函数呢,说实在的,只能说还行吧!
如果开发过程中遇到库函数不够用的情况,建议适当的寄存器操作和库函数操作并行,可以提高运行效率!!

今天看了看DrvTimer库函数,觉得奇怪,定时器怎么没有初始值设置的函数呢,再仔细看了看,原来是这样的!记录下
   
#include <stdio.h>
#include "Driver/DrvTIMER.h"
#include "Driver/DrvGPIO.h"
#include "Driver/DrvSYS.h"
void TMR0_CallbackFunction(uint32_t u32Param)
{
   DrvGPIO_ClrBit(E_PORT3,E_PIN6);
   DrvSYS_Delay(300000);
   DrvGPIO_SetBit(E_PORT3,E_PIN6);

}

int main (void)      //main
{
     UNLOCKREG();         /
    SYSCLK->WRCON.XTL12M_EN = 1;
    DrvSYS_SelectHCLKSource (7);
    DrvSYS_Delay(5000);
     DrvGPIO_Open(E_PORT3,E_PIN6,E_IO_OUTPUT);
     DrvGPIO_ClrBit(E_PORT3,E_PIN6);
     DrvSYS_Delay(600000);
     DrvGPIO_SetBit(E_PORT3,E_PIN6);
     DrvSYS_Delay(600000);
    DrvTIMER_Init();
// TMR0的时钟源选择:CLKSEL1来设置:000 =外部12MHz 晶振,010 = HCLK,011 = 外部触发时钟,1xx =内部22.1184MHz 振荡器
    DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 0);//





  
            /*定时中断* E_TMR0*/
                DrvTIMER_Open(E_TMR0, 100, E_PERIODIC_MODE);   
                DrvTIMER_SetTimerEvent(E_TMR0, 300, (TIMER_CALLBACK)TMR0_CallbackFunction, 1);
                DrvTIMER_EnableInt(E_TMR0);   
               DrvTIMER_Start(E_TMR0);//
               while(1);
}


说明:
此程序代表定时器0工作在Periodic模式下,并且是每 300/100=3s执行一次中断函数,
DrvTIMER_Open(E_TMR0, 100, E_PERIODIC_MODE);    是指设置Timer0为1s一百次中断Ticks,
  DrvTIMER_SetTimerEvent(E_TMR0, 300, (TIMER_CALLBACK)TMR0_CallbackFunction, 1); 是指设置每300个中断ticks执行一次中断响应函数

所以中断函数执行周期为 300/100=3s
设置中断应该按如下步骤:
1.DrvTIMER_Init(); 这个函数是必须调用的;只要用到timer
2. DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 0);//时钟源选择;
//000 =外部12MHz 晶振,010 = HCLK,011 = 外部触发时钟,1xx =内部22.1184MHz 振荡器
3.
DrvTIMER_Open(E_TMR0, 100, E_PERIODIC_MODE);   
DrvTIMER_SetTimerEvent(E_TMR0, 300, (TIMER_CALLBACK)TMR0_CallbackFunction, 1);
这两个方法配合使用,设置定时器的工作模式,初值,以及中断响应函数
4.DrvTIMER_EnableInt(E_TMR0);     使能中断
5.DrvTIMER_Start(E_TMR0); 开启Timer0

6.必要的时候关闭中断:
  DrvTIMER_Close(E_TMR0);关闭Timer0;


这里在中断里面延时300ms,只是做为演示之用,至于项目中,一般在中断回调函数中不要这样做!

如有描述或理解错误,请指点!!谢谢!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入134汤圆

发表于 2010-11-15 13:31:45 | 显示全部楼层
好快  学习

出0入0汤圆

发表于 2010-11-15 20:22:54 | 显示全部楼层
学习了,
继续呀!!
串口咋调呢?还有120的USB有人调过么?

出0入0汤圆

发表于 2010-11-15 21:06:56 | 显示全部楼层
不是发过了吗?

出0入0汤圆

 楼主| 发表于 2010-11-15 23:06:38 | 显示全部楼层
我这个是M051的,NUC系列的我还没看!


回复【3楼】vvvv50000  
-----------------------------------------------------------------------

我是第一次发啊!!

出0入0汤圆

发表于 2010-11-16 06:56:50 | 显示全部楼层
记号学习。。。。

出0入0汤圆

发表于 2010-11-16 07:31:11 | 显示全部楼层
MARK!!!

出0入0汤圆

发表于 2010-11-16 10:40:18 | 显示全部楼层
回复【3楼】vvvv50000
-----------------------------------------------------------------------

NUC100和M051功能差不多,51是精简的NUC

出0入0汤圆

发表于 2010-11-19 16:20:38 | 显示全部楼层
学习了,
继续呀!!
串口咋调呢?还有120的USB有人调过么?
///-----------------------------------------------------------------
串口要接串口收发IC才能行,芯唐出了一款带串口IC的开发板,但没有免费送。我们是从代理商申请的。USB我们也调过,好像还不错。过两天把测试的软件发上来给大家玩玩,要整理一下!

出0入0汤圆

 楼主| 发表于 2010-11-22 02:51:04 | 显示全部楼层
M051的串口的基本用法主要是比51多了FIFO!!
过几天把我的学习笔记部分的--M051的各类时钟设置发布一下!

出0入0汤圆

发表于 2010-11-24 16:32:34 | 显示全部楼层
帮我看看串口程序吧  
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include "Driver\DrvUART.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSYS.h"
#include "NUC1xx.h"

                  
/*---------------------------------------------------------------------------------------------------------*/
/* Global variables                                                                                        */
/*---------------------------------------------------------------------------------------------------------*/

/*---Using in UART Test -------------------*/
volatile uint8_t buffer[12];                        //串口缓冲
uint8_t UART_Flag;            //串口标志



/*---------------------------------------------------------------------------------------------------------*/
/* Define functions prototype                                                                              */
/*---------------------------------------------------------------------------------------------------------*/
void UART_INT_HANDLE(uint32_t u32IntStatus);


/*---------------------------------------------------------------------------------------------------------*/
/* UART Callback function                                                                                      */
/*---------------------------------------------------------------------------------------------------------*/
void UART_INT_HANDLE(uint32_t u32IntStatus)
{
        unsigned int len,i;
        unsigned int j=0;

        if(u32IntStatus & DRVUART_RDAINT)         //查询接收可用数据标志位 当FIFO达到限制 则RDA_IF置位
        {
                        while (UART0->FSR.RX_EMPTY ==1);//查询FIFO内部是否存在数据         当内部有数据时 RX_EMPTY==0 则程序往下执行
                        len=UART0->DATA;
                        for(i=0;i<len;i++)
                        {
                                while(UART0->ISR.RDA_IF==0)
                                {
                                        j++;
                                        if(j>100000)
                                        break;
                                }
                                if(j<1000)
                                {
                                        if(UART1->FSR.RX_EMPTY == 0)
                                        {
                                                buffer=UART0->DATA;
                                        }
                                        j=0;
                                }
                                else
                                {
                                        break;
                                }
                                if(i==len);
                                UART_Flag=1;
                        }
        }
        else if(u32IntStatus & DRVUART_THREINT)         //查询接收中断标志
        {
                if((UART0->ISR.RDA_IF==0)&&(UART0->ISR.THRE_IF==1)&& (UART_Flag==1))
                {
                         len=buffer[0];       
                         for(i=0;i=len+1;i++)
                         {
                                 if(UART0->FSR.TX_FULL==0)
                                {
                                        UART0->DATA=buffer;       
                                }
                                if(i==len+1)
                                {
                                        UART_Flag=1;       
                            }
                         }                                                  
                 }
         }         

}
/****************UART0配置函数***************************************/
void UART0_Config(void)
{
        STR_UART_T sParam;
                        /* Set UART Pin */
        DrvGPIO_InitFunction(E_FUNC_UART0);           //使能UART0接口

                /* Select UART Clock Source From 12Mhz*/
        DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC,0);  //选择UART接口的时钟位外部12MHz

                /* UART Setting */
    sParam.u32BaudRate                 = 115200;
    sParam.u8cDataBits                 = DRVUART_DATABITS_8;
    sParam.u8cStopBits                 = DRVUART_STOPBITS_1;
    sParam.u8cParity                 = DRVUART_PARITY_NONE;
    sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES;

        if(DrvUART_Open(UART_PORT0,&sParam) != E_SUCCESS)
        {
                printf("UART0 open failed\n");
        }//设定UART0的参数

        DrvUART_EnableInt(UART_PORT0, (DRVUART_RLSINT | DRVUART_THREINT | DRVUART_RDAINT|DRVUART_THREINT),UART_INT_HANDLE);
        //使能串口中断,1接收中断状态 2发送保持寄存器空中断使能 3可接受数据中断使能       
}

/**********************RCC配置函数****************************/
void RCC_Config(void)
{
       
                        /* SYSCLK =>12Mhz*/
        UNLOCKREG();

    SYSCLK->PWRCON.XTL12M_EN = 1;

         /* Waiting for 12M Xtal stalble */
    DrvSYS_Delay(5000);           //系统定时

         /* Run 48Mhz */
    DrvSYS_Open(48000);          // 选择系统时钟

        LOCKREG();

}



/*---------------------------------------------------------------------------------------------------------*/
/* Main Function                                                                                                            */
/*---------------------------------------------------------------------------------------------------------*/

int32_t main()
{
        unsigned int i;
        for(i=0;i<12;i++)
        {
                buffer=0xff;
        }
        RCC_Config();
           UART0_Config();
       

        printf("UART Demp \r\n");

        while(1)
        {
                if(UART_Flag==1)
                {
                        UART0->DATA=0;         //串口接收完后向THRE写0进入中断
                }       
        }
}

出0入0汤圆

发表于 2011-1-20 12:10:53 | 显示全部楼层
不错,顶~

出0入0汤圆

发表于 2011-1-21 19:38:00 | 显示全部楼层
谢谢楼主!
你的STM32开发板不错,啥时来个整体移植,整块M051的开发板吧

出0入0汤圆

发表于 2014-5-21 16:15:36 | 显示全部楼层
蛋疼地狠,这个新唐的库各种版本。。

出0入0汤圆

发表于 2014-5-31 08:22:28 | 显示全部楼层
学习学习。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 09:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表