This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS570LC4357:N2HEt HTU 不能 n#39;t 生成正确的 PWM。

Guru**** 1807890 points
Other Parts Discussed in Thread: HALCOGEN
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/575750/ccs-tms570lc4357-n2het-htu-doesn-t-generate-proper-pwm

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

工具/软件:Code Composer Studio

你(们)好

我尝试使用项目 SPNA217 -"使用 PWM 以及 Hercules N2HET 和 HTU 生成正弦波"  

我已将 项目导入到新的 CCS7.0 中、该项目与此 TMS570LC43一起用于 Launchpad。  

初始设置04.05.02的 Halcogen。

我尝试生成 PWM。  没有效果。  

在调试模式中 ,恰好在 hetREG1->REQENS=1之后; PWM 停止....  当然、PWM 应该具有不同的占空比、但它不具有。

有完整的项目文件夹.zip CCS7.0/ halcogen 文件/ HET 项目 等

e2e.ti.com/.../2311.Sine_5F00_wave_5F00_PWM2.zip

  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Marcin、您好!

    感谢您发布您的问题和相关项目。 我将查看它、并在找到根本原因后与您联系。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我刚刚意识到有更新的 Halcogen 04.06.00、我使用了它、结果相同、没有正确的 PWM 生成。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Marcin、

    您说您尝试生成 PWM 而不起作用,或者它没有生成 PWM,但您还说它在 hetREG1->REQEN=1之后在调试模式下选择了生成 PWM。 那么、在它停止之前、它是否按预期工作? 在调试模式下、当您遇到断点时、它是否停止? 如果是、您是否启用了暂停时继续、以便即使 CPU 暂停、HET 也将继续生成 PWM?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先、我强烈建议您获得一个 LS1224 launchpad (仅~ 20美元)、以便您可以按原样运行 Appnote 代码。

    现在、如果您必须将其移植到 LC4357、这是可以的、但 HalCoGen 中有许多屏幕、而1224的.HCC/DIL 文件则不能
    加载到 LC4357项目中。 手动"编辑"文件并不是很安全。

    因此、您有很多配置需要处理、在填写 GUI 页面时很容易出错。

    这样、如果您得到的是1224、您会得到一些应按原样工作的参考、并且可以与之进行比较。

    现在、LC4357具有缓存-因此这会带来额外的复杂性。

    HalCoGen 中的缺省值是具有 RAM 回写类型。 这在将数据放入用于 DMA (包括 HTU)的 L2SRAM 进行拾取时效果不是很好、因为回写类型缓存在必要时才会清除数据、因此当您编写表供 HTU 取时、 写入可能卡在高速缓存中、但尚未写入 L2SRAM。 DMA 无法从缓存(仅 L2SRAM)读取数据、因此它可能读取0或过时数据。

    尝试禁用高速缓存或更改写入类型(WT)而不是回写类型(WB)。

    长期而言、您需要对缓冲区进行 SRAM 的一个区域写通、以保存数据并将其传递到 DMA、并对 CPU 处理但不与 DMA 共享的其余数据(如堆栈、全局变量等)进行另一个区域写回。 这是因为 WB 通常会快一点。 [这就是为什么它是 HalCoGen 的默认值、因为临时用户更有可能运行某个算法的基准。 而不是深入研究 DMA 或 HTU...]

    此致、
    Anthony
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、 我尝试逐步澄清:

    作为 PWM,我使用    映射 为 V7的端口 N2HET1_09 -这是引脚 J1.10 (Hercules TMS570LC43x LaunchPad 开发套件) 这是在 HAlcogen 中设置的。

    我的主函数:  

    int main (void)
    {
    /*根据 HalCoGen 设置初始化 HTU1 */
    htuInit();
    
    /*根据 HalCoGen 设置初始化 NHET1 */
    hetInit();
    
    /*根据宏设置配置 NHET1的其他设置*/
    configNHET1();
    
    while (1);
    
    //返回0;
    } 

    函数 htuINIT   

    空 htuInit (void){ 
    /* DCP0 CPx 元素计数= 1、帧计数= SAMPLE_SIZE */
    htuDCP1->ITCOUNT = 0x00010000 + SAMPLE_SIZE;
    
    htuDCP1->IHADDRCT =(htuDCP1->IHADDRCT & 0x0)|
    0x1 << 23 |// DIR
    0x0 << 22 |//大小
    0x0 << 21 |// ADDMH
    0x0 << 20 |// ADDFM
    0x1 << 18 |// TBA
    0x0 << 16 |// TMBB
    0x28 <<0;// IHADDR
    
    
    /* DCP0 CPA 源缓冲器的起始地址*/
    htuDCP1 -> IFADDRA =(unsigned int) sine_table;
    
    /*启用 DCP0 CPA */
    htuREG1->CPENA=0x00000001;
    /*启用 HTU */
    htuREG1 ->GC = 0x00010000;
    } 

    函数 hetInit 来自 Halcogn  

    void hetInit (void)
    {
    /**@b 初始化@b HET */
    
    /**-设置 HET 引脚默认输出值*/
    hetREG1->DOUT =(uint32)((uint32) 0U << 31U)
    |(UINT32)((UINT32) 0U << 30U)
    |(UINT32)((UINT32) 0U << 29U)
    |(UINT32)((UINT32) 0U << 28U)
    |(UINT32)((UINT32) 0U << 27U)
    |(UINT32)((UINT32) 0U << 26U)
    |(UINT32)((UINT32) 0U << 25U)
    |(UINT32)((UINT32) 0U << 24U)
    |(UINT32)((UINT32) 0U <<23U)
    |(UINT32)((UINT32) 0U << 22U)
    |(UINT32)((UINT32) 0U << 21U)
    |(UINT32)((UINT32) 0U << 20U)
    |(UINT32)((UINT32) 0U << 19U)
    |(UINT32)((UINT32) 0U << 18U)
    |(UINT32)((UINT32) 0U << 17U)
    |(UINT32)((UINT32) 0U <<16U)
    |(UINT32)((UINT32) 0U << 15U)
    |(UINT32)((UINT32) 0U << 14U)
    |(UINT32)((UINT32) 0U << 13U)
    |(UINT32)((UINT32) 0U << 12U)
    |(UINT32)((UINT32) 0U << 11U)
    |(UINT32)((UINT32) 0U << 10U)
    |(UINT32)((UINT32) 1U <<9U)
    |(UINT32)((UINT32) 0U << 8U)
    |(UINT32)((UINT32) 0U << 7U)
    |(UINT32)((UINT32) 0U << 6U)
    |(UINT32)((UINT32) 0U << 5U)
    |(uint32)((uint32) 0U << 4U)
    |(UINT32)((UINT32) 0U << 3U)
    |(uint32)((uint32) 0U << 2U)
    |(uint32)((uint32) 0U << 1U)
    |(uint32)((uint32) 0U << 0U);
    
    /**-设置 HET 引脚方向*/
    hetREG1->DIR =(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000200U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U;
    
    /**-设置 HET 引脚开漏使能*/
    hetREG1->PDR =(uint32) 0x000000000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U;
    
    /**-设置 HET 引脚上拉/下拉使能*/
    hetREG1->PULDIS =(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U;
    
    /**-设置 HET 引脚上拉/下拉选择*/
    hetREG1->PSL =(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U;
    
    /**-设置 HET 引脚高分辨率共享*/
    hetREG1->HRSH =(UINT32) 0x00008000U
    |(UINT32) 0x00004000U
    |(UINT32) 0x00002000U
    |(UINT32) 0x00001000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000008U
    |(UINT32) 0x00000004U
    |(UINT32) 0x00000002U
    |(UINT32) 0x00000001U;
    
    /**-设置 HET 引脚并共享*/
    hetREG1->AND =(uint32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U;
    
    /**-设置 HET 引脚 XOR 共享*/
    hetREG1->XOR =(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x000000000000;
    
    //用户代码开始(1)*/
    //用户代码结束*/
    
    /**-设置预分频器值
    * -环路分辨率预分频器
    * -高分辨率预分频器
    *
    hetREG1->PFR =(uint32)((uint32) 6U << 8U)
    |((UINT32) 0U);
    
    
    /**-奇偶校验控制寄存器
    * -启用/禁用奇偶校验
    *
    hetREG1->PCR =(uint32) 0x00000005U;
    
    /**-用操作码和数据填充 HET RAM */
    /**-"HET_INITx_PST"中的"x"表示 HET 模块实例
    * x - 0至9的有效范围
    * 对于 HET1模块 x = 0
    * 有关更多信息、请参阅 HET 汇编器用户指南
    *
    /*SAFETYMCUSW 94 S MR:11.1、11.2、11.4 "HET RAM fill from the table - perable as per MISRA rule 11.2"*
    /*SAFETYMCUSW 95 S MR:11.1、11.4 "HET RAM fill from the table - perable as per MISRA rule 11.2"*
    /*SAFETYMCUSW 95 S MR:11.1、11.4 "HET RAM fill from the table - perable as per MISRA rule 11.2"*
    (void) memcpy ((void*) hetRAM1、(void*) HET_INIT0_PST、sizeof (HET_INIT0_PST);
    
    /**-设置中断优先级*/
    hetREG1->PRY = 0xFFFFFFFF;
    
    /**-启用中断*/
    hetREG1->INTENAC = 0xFFFFFFU;
    hetREG1->INTENAS =(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x00000000U
    |(UINT32) 0x000000000000;
    
    
    /**-设置控制寄存器
    * -启用输出缓冲器
    * -忽略软件断点
    * -主时钟或从时钟模式
    * -启用 HET
    *
    hetREG1->GCR =(0x00000001U
    |(uint32)((uint32) 1U <<24U)
    |(uint32)((uint32) 1U <<16U)
    |(0x00020000U);
    
    
    /*用户代码开始(4)*/
    /*用户代码结束*/
    
    } 

    函数 htuINITConfigNHET1():  

    void configNHET1() 
    {
    /*配置 LRP 预分频器,hr 始终为1,LR 可以为1
    * 16、32、64或128 */
    hetREG1->PFR = LRPFC << 8;
    
    // calculate_ecmp_compare();已删除,但 sine_table 声明为:uint32 sine_table[sample_size]={1、20000、5000、5、30};
    
    
    /*在 HTU 的通道0上启用 DMA 请求。 在 CNT 指令中
    *对 HTU 模块的通道0发出 DMA 请求*
    hetREG1->REQENS=1;
    
    /*将选定的引脚设置为输出。 *
    hetREG1->DIR =(1 << NHET1_PIN_PWM);
    
    /*根据定义的宏将 PWM 周期加载到 CNT 指令中*/
    hetRAM1->Instruction [Phet_L00_0].Control =(uint32)(CNT_MAX_PERIOD - 1)|
    (hetRAM1->Instruction [Phet_L00_0].Control & 0xFFFD0000);
    
    /*配置引脚编号以输出 PWM */
    hetRAM1->Instruction [Phet_L01_0].Control =
    (hetRAM1->Instruction [Phet_L01_0].Control & 0xFFFFE0FF)|
    (NHET1_PIN_PWM << 8);
    
    } 
    
    

    函数 htuINITConfigNHET1():  

    执行时
    hetREG1->PFR = LRPFC << 8;
    PWM 已启动(但占空比为常量)、它不会改变占空比




    时间
    hetREG1->REQENS=1;
    然后 PWM 停止. 这就是所有;-(

    当我尝试在没有调试模式的情况下执行时、只有两个 PWM 脉冲。 我认为占空比的变化(下图)与 DMA/HTU 的功能无关、而是与配置的变化有关。



    我认为现在我需要更好地处理 Anthony 提到的内存缓存问题。

    此致 Marcin。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    最后、解决方案是关闭 halcogen 的高速缓存。
    现在工作正常、感谢您的帮助。
    问题是:
    -关闭高速缓存是否会大大降低性能?
    -是否有其他解决方案?

    谢谢、
    注意 Marcin。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是关闭高速缓存会降低性能。

    请阅读上述帖子。 您有两个基本选项:
    1) 1)将 RAM 的某些区域配置为直写类型、而不是回写。
    2) 2)在您写入 DMA 应拾取的缓冲区后、手动强制使用缓存维护和屏障进行回写。

    1)可能是最简单、影响最小的、因此我建议尝试一下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    那么 、我 将尝试执行下一步 。 使用  HTU/DMA 生成2个 PWM。  遗憾的是、只有一个 PWM 正常生成。 下一个不会更改占空比。

    我已修改 项目 SPNA217。 "使用 PWM 和 Hercules 生成正弦波"  

    (笑声)

    根据 Anthony 的建议、我创建了新帖子  

    这被移到这里:  

    Marcin。