以下是新唐M051单片机定时器3的 周期模式测试程序 成功版:
#include "SmartM_M0.h"
UINT32 i =0;
/****************************************
*函数名称:TMR3Init
*输 入:无
*输 出:无
*功 能:定时器3初始化
******************************************/
VOID TMR3Init(VOID)
{
PROTECT_REG
(
/* 使能TMR0时钟源 */
APBCLK |= TMR3_CLKEN;
/* 选择TMR0时钟源为外部晶振12MHz */
CLKSEL1 = (CLKSEL1 & (~TM3_CLK)) | TM0_12M;
/* 复位TMR3 */
IPRSTC2 |= TMR3_RST;
IPRSTC2 &= ~TMR3_RST;
/* 选择TMR3的工作模式为周期模式*/
TCSR3 &= ~TMR_MODE;
TCSR3 |= MODE_PERIOD;
/* 溢出周期 = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*/
/* 溢出周期 = (1/12MHz) * (0 + 1) * (12000*500)=500ms (0.5S)*/
TCSR3 = TCSR3 & 0xFFFFFF01; // 设置预分频值 [0~255]
TCMPR3 = 12000*500; // 设置比较值 [0~16777215]
TCSR3 |= TMR_IE; //使能TMR0中断
NVIC_ISER |= TMR3_INT;
TCSR3 |= CRST; //复位TMR0计数器
TCSR3 |= CEN; //使能TMR0
)
}
/****************************************
*函数名称:main
*输 入:无
*输 出:无
*功 能:函数主体
******************************************/
INT32 main(VOID)
{
PROTECT_REG //ISP下载时保护FLASH存储器
(
PWRCON |= XTL12M_EN; //默认时钟源为外部晶振
while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz时钟稳定
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
P2_PMD = 0x5555; //P2口设置为输出模式
P2_DOUT= 0x00; //P2口输出低电平
)
TMR3Init();
while(1)
{
if(i > 7)
{
i = 0;
}
}
}
/****************************************
*函数名称:TMR3_IRQHandler
*输 入:无
*输 出:无
*功 能:定时器3中断服务函数
******************************************/
VOID TMR3_IRQHandler(VOID)
{
/* 清除TMR3中断标志位 */
TISR3 |= TMR_TIF;
P2_DOUT = 1UL<<i; //P2口输出相应的电平
i++;
}