zpsnqnws 发表于 2025-5-26 12:39:25

pwm输出应用问题,请求帮助

用到的芯片是:AI8H2K08U
系统:win7旗舰版64位
工具软件:Keil uVision5
要实现的功能:
利用PWMA的第一与第3输出通道正极驱动外设。
默认输出管脚设置:pwma1p:P1.0;pwma3p:P1.4
其中,pwma3p:P1.4引脚也定义为T11计数器的外部输入引脚。

程序如下:

#include "ai8h.h"
#include "intrins.h"

#define uint unsigned int
#define uchar unsigned char
      
uchar zhch;
uintzhch_H=800,zhch_L=500;      //

void tm11isr() interrupt 67   //T11中断程序
{
      if(zhch)
      {
                PWMA_CCR1 = zhch_L;                //设置占空比时间
                PWMA_CCR3 = zhch_L;
                zhch=0;
      }
      else
      {
                PWMA_CCR1 = zhch_H;                //设置占空比时间
                PWMA_CCR3 = zhch_H;
                zhch=1;
      }
}

void main()
{
      P_SW2 |= 0x80;      //使能访问XFR,没有冲突不用关闭
      P0M0 = 0x00;               
      P0M1 = 0x00;               
      P1M0 = 0x00;               
      P1M1 = 0x00;
      P2M0 = 0x00;
      P2M1 = 0x00;
               
      //PWMA_PS=0x00;//设置PWM通道输出脚位定义,默认0,管脚注释名
      
      //高级PWMA1P通道:
      PWMA_CCER1 = 0x0;      //写CCMRx前必须先清零CCERx的CCxE位,关闭通道。
      PWMA_CCMR1 = 0x60;      //设置CC1为PWMA1输出模式
      PWMA_CCER1 = 0x01;      //使能CC1通道
      PWMA_CCR1 = 500;      //设置占空比时间
      PWMA_ARR = 1500;      //设置周期时间

      //高级PWMA3P通道:
      PWMA_CCER2 = 0x0;      //写CCMRx前必须先清零CCERx的CCxE位,关闭通道。
      PWMA_CCMR3 = 0x60;      //设置CC3为PWMA1输出模式
      PWMA_CCER2 = 0x01;      //使能CC3通道
      PWMA_CCR3 = 500;      //设置占空比时间(PWMA_ARR:周期相同)
      
      PWMA_ENO = 0x11;      //使能1、3的正极性输出。3的输出,作为T11的外部计数输入
      PWMA_BKR = 0x80;      //使能主输出
      PWMA_CR1 = 0x01;         //开始计时
      
      /*定时器T11的初始化*/
      T11H=0xff; T11L=100;   //自动重载计数初值。预分频寄存器T11PS默认0:不分频
      T11CR=0xc2;      //0B1100,0010:使能、计数、禁止输出、分频、2位时钟源、可中断、中断标志

      while (1);
}

问题:
1:用“拓展Keil的C代码中断号”,支持了T11的中断号67,编译通过,但软件调试时,不能进入T11中断程序,不知哪里设置出了问题。第一次使用高级pwm功能。
2:软件调试时,可以观察自定义变量的数值,但不能观察很多片内寄存器数值,例如:观察PWMA_CCER1、PWMA_ENO等数值时,显示<cannot evaluate>,灰色。

   可以查看P0M1的数值,显示为0x00,uchar类型。是否开发环境没有设置好,或缺少什么支持文件。
谢谢各位大佬指正!

国芯人工智能 发表于 2025-5-26 12:43:00

c
// 在中断程序中,确保外部引脚的状态正确初始化
void tm11isr() interrupt 67 {
    // 确保外部引脚的状态正确初始化
    P14 = 0x00; // T11引脚的外部引脚初始化为0x00
    P11 = 0x00; // T12引脚的外部引脚初始化为0x00
}

说明:
1. 外部引脚的状态初始化:在中断程序中,外部引脚的状态需要正确初始化,确保在P14引脚变化时,外部引脚的状态变化能够被正确捕捉到。
2. 使用0x00初始化:外部引脚的状态初始化为0x00,确保在P14引脚变化时,外部引脚的状态变化能够被正确捕捉到。

注意事项:
外部引脚的状态初始化:在中断程序中,外部引脚的状态初始化为0x00,确保在P14引脚变化时,外部引脚的状态变化能够被正确捕捉到。
使用0x00:外部引脚的状态初始化为0x00,确保在P14引脚变化时,外部引脚的状态变化能够被正确捕捉到。

通过上述修改,中断程序能够正确检测P14引脚的状态变化,从而正确切换到执行代码。

[本文内容由国芯人工智能辅助生成,仅供参考]

王昱顺 发表于 2025-5-27 10:19:17

不能进入T11中断,可以查看有关T11中断,还有EA是否使能,如果都设置完好的话,是可以仿真跳转进入中断程序的,我看你的总中断EA=1这一句就没有
第二个问题,寄存器需要通过类似char a; a = PWMA_ENO;这样子,然后仿真查看a变量来观察
因为内部寄存器有部分没有关联/被占用做其他映射用途,所以要用普通的变量中转一下再查看
页: [1]
查看完整版本: pwm输出应用问题,请求帮助