NUC100 pwm诡异

[复制链接]
3657|8
 楼主| formatmd 发表于 2010-10-21 10:13 | 显示全部楼层 |阅读模式
void init_pwm_tiaokuan(INT16U g_u16Frequency01)
{
  S_DRVPWM_TIME_DATA_T_TiaoKuan sPt01;
  // Enable PWM clock //
DrvPWM_Open();
HWREG(0x50000030)|=0x00001000; //GPA_MFP的12位 设置PA12为PWM0
UNLOCKREG();
DrvSYS_SetHCLKSource(0); //外部晶振
LOCKREG();
sPt01.u8Mode = DRVPWM_TOGGLE_MODE;
sPt01.u32Frequency = g_u16Frequency01;//g_u16Frequency;
sPt01.u32HighPulseRatio = 50; // High Pulse peroid : Total Pulse peroid = 1 : 100 //
sPt01.i32Inverter = 0;
// Select PWM engine clock //
// DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_HCLK);
HWREG(0x50000208)|=0x00100000;//APBCLK PWM01EN=1
// DrvPWM_SetTimerClk_TiaoKuan(DRVPWM_TIMER0,&sPt01);
HWREG(0x40040000)|=0x0000003f; //PPR
HWREG(0x40040004)|=0x00000004;//CSR time0输入,1分频
HWREG(0x40040008)|=0x00000004;//PCR 自动重装模式,PWM time0使能
HWREG(0x40040010)|=0x00003fff;//CMR 自动重装模式,PWM time0使能
HWREG(0x4004000C)|=0x0000fffe;//CNR 自动重装模式,PWM counter


//运行以下两句CMR CNR会清0
   //  DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
HWREG(0x4004007C)|=0x00000001; //使能输出 POE03

// DrvPWM_Enable(DRVPWM_TIMER0, 1);
HWREG(0x40040008)|=0x00000001;//PCR PWM time0使能



}

想自己设置pwm宽度,有的地方没用库函数
调试时到
HWREG(0x4004007C)|=0x00000001; //使能输出 POE03
就会清CMR CNR
不知道那里出错
静默 发表于 2010-10-21 11:14 | 显示全部楼层
看了半天, 还真找不出哪里会出问题.

建议楼主, 新建一个工程, 然后仅把初始PWM部分代码加进去, 再加一个while(1)看看相应输出引脚是否输出自己需要的PWM. 当然也可用调试工具看一下寄存器值(最好用Memory方式看寄存器的值).
 楼主| formatmd 发表于 2010-10-21 14:56 | 显示全部楼层
void init_pwm_tiaokuan(INT16U TiaoKuan)
{        INT32U temp;
        S_DRVPWM_TIME_DATA_T_TiaoKuan sPt01;
        // Enable PWM clock //
        DrvPWM_Open();
        HWREG(0x50000030)|=0x00001000; //GPA_MFP的12位 设置PA12为PWM0
        UNLOCKREG();
        DrvSYS_SetHCLKSource(0); //外部晶振
        LOCKREG();

        sPt01.u8Mode = DRVPWM_TOGGLE_MODE;
        sPt01.u32Frequency = 1000;//g_u16Frequency;
        sPt01.u32HighPulseRatio = 50;        // High Pulse peroid : Total Pulse peroid = 1 : 100 //
        sPt01.i32Inverter = 0;

        // Select PWM engine clock //
        DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_HCLK);
        HWREG(0x50000208)|=0x00100000;//APBCLK PWM01EN=1

        DrvPWM_SetTimerClk_TiaoKuan(DRVPWM_TIMER0,&sPt01);

        temp=0;
        temp=HWREG(0x40040000)&0xffffff00;           //PPR
        temp=temp|0x01;
        HWREG(0x40040000)=temp;

        temp=0;
        temp=HWREG(0x40040004)&0xfffffffb;
        temp=temp|0x04;
        HWREG(0x40040004)=temp;                                 //CSR

//        HWREG(0x40040000)|=0x00000021; //PPR
//        HWREG(0x40040004)|=0x00000004;//CSR time0输入,1分频
//        HWREG(0x40040008)|=0x00000004;//PCR 自动重装模式,PWM time0使能
        temp=0;
        temp=HWREG(0x40040010)&0xffff0000;
        temp=temp|TiaoKuan;
    HWREG(0x40040010)=temp;//CMR 自动重装模式,PWM time0使能  65535

        temp=0;
        temp=HWREG(0x4004000C)&0xffff0000;
        temp=temp|65535;
        HWREG(0x4004000C)=temp;//CNR 自动重装模式,PWM counter           65535





   //  DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
        HWREG(0x4004007C)|=0x00000001;        //使能输出        POE03


//        DrvPWM_Enable(DRVPWM_TIMER0, 1);
        HWREG(0x40040008)|=0x00000001;//PCR PWM time0使能







}
懒得去找原因了,
调用库再赋值
不会清,16位的调宽ok
hotpower 发表于 2010-10-21 16:25 | 显示全部楼层
HWREG()实在晕!
难道没头文件?
还是为了优化代码?
X-Hawk 发表于 2010-10-21 17:34 | 显示全部楼层
本帖最后由 X-Hawk 于 2010-10-21 17:35 编辑

碰到过好多客户,不喜欢套用现成的软件bsp里的函数和代码。
其实那些例子代码整理的很干净的。
客户爱自己写,为什么呢??????
yybj 发表于 2010-10-21 18:17 | 显示全部楼层
可能觉得自己写比较清楚一点吧
 楼主| formatmd 发表于 2010-10-23 08:38 | 显示全部楼层
#define HWREG(x)                (*((volatile unsigned long *)(x)))
忘记写出宏定义了,
从TI的库函数复制过来的
库函数不是万能的,有时想实现自己要的功能,库里面没有,只有自己写的。
能拿来的,用的上的,决不会自己去写的,哈哈本人比较懒,
huzixian 发表于 2010-10-23 20:11 | 显示全部楼层
自己写思路比较清楚,用现成的出了问题也说不清楚
huzixian 发表于 2010-10-24 14:24 | 显示全部楼层
断点调试带你找出问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

25

帖子

0

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