大家好,小弟刚刚接触2440 ARM9,最近在调试底层PWM模块遇到如下问题,苦苦无法解决,夜不能寐,忘大侠们帮忙,不胜感激
本意是用PWM的TIMER1定时器功能让开发板上的灯间隔1S亮灭,我写的程序如下:
主函数main()
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
//================================
extern void pwm_init(void);
extern void clock_init(void);
extern void IO_init(void);
extern void Timer1INT_Init(void);
void Main(void)
{
clock_init();
IO_init();
pwm_init();
Timer1INT_Init();
while(1);
}
以下是各实现初始化和功能函数
//***************************************************
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
//===================
void __irq Timer1_ISR(void)
{
rGPBDAT = 0x3fffff;
rSRCPND |= BIT_TIMER1;
rINTPND |= BIT_TIMER1;
rINTMSK = ~(BIT_TIMER1);
}
void pwm_init(void)
{
// rGPGCON = rGPGCON & 0xfff0ffff | 0x00050000; //配置GPG口为信号输出
// rGPGDAT = rGPGDAT | 0x300;
rTCFG0 = 255; // Prescaler0=255
rTCFG1 = 3 << 4; //
rTCNTB1 = 50000000/256/16; // 在pclk=50MHZ下,1秒钟的记数值rTCNTB1 = 50000000 / 4 / 256 = 48828;
rTCMPB1 = 0x00;
rTCON = (1 << 11) | (1 << 9) | (0 << 8); //禁用定时器1,手动加载
rTCON = (1 << 11) | (0 << 9) | (1 << 8); //启动定时器1,自动装载
}
void clock_init(void)
{
rMPLLCON = 17<<12|1<<4|2; //50MHZ FCLK=2*(17+8)*12M/(3*2^2)
rCLKDIVN = 0x3;//时钟分频比1:1:1;
}
void IO_init(void)
{
rGPBCON = 0X55<<10;
rGPBUP = 0X3FF;
rGPBDAT = 5<<5;
}
//--------------------------------------------------------------------------
// 定时器中断初始化程序
//--------------------------------------------------------------------------
void Timer1INT_Init(void) //定时器接口使能
{
rINTMOD = 0X0;
if ((rINTPND & BIT_TIMER1))
{
rSRCPND |= BIT_TIMER1;
}
pISR_TIMER1 = (unsigned)Timer1_ISR;
rINTMSK &= ~(BIT_TIMER1); //开中断;
}
//--------------------------------------------------------------------------
// 目标板初始化程序,主函数中只需调用此函数,即可完成目标板的初始化
//--------------------------------------------------------------------------