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/MSP432P401R:ISRFault NmiSR 出现问题

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/646885/ccs-msp432p401r-problem-with-isrfault-nmisr

器件型号:MSP432P401R

工具/软件:Code Composer Studio

我遇到了一个异常问题、在我初始化 UC 的时钟频率后、它将随机进入 ISRFault 环路或 NmiSR。 我正在使用多个程序来实现 e-ink 普及显示、但我在为微控制器执行初始化后无法测试任何原因、我收到此故障中断、无法理解原因。

#include "conf_EPD.h"


/*首字母缩略词术语表
* gu =全局更新
* pu =部分更新
* LUT =查找表、用于定义驱动波形参数的数组
* OTP =一次性编程、 LUT 在驱动器 IC 中预编程
*/

/**
*\brief 定义 EPD 的计时控制器类型和大小
*\note
*- etc=外部计时控制器(驱动器 IC)
*- ITC=内部时序控制器*/
// ETC
#define SZ_etC_144 0 // J7开关0000 001X
#define SZ_etC_190 1 // J7开关0000 000x
#define SZ_etC_200 2 // J7开关0000 001X
#define SZ_etC_260 3 //J7开关0000_#define SZ_7
开关#define JITC/J215/J7

开关#define 000x #define Z_015/ JITC/JITC_000x #define 000x 开关#define J271/J7开关 1010 000x
#define SZ_ITC_287 6 //J7开关0101 010x
#define SZ_ITC_420 7 //J7开关0101 010x

/**
*\brief 用胶片材料定义 EPD 驱动器
*\note
*- BW =黑白颜色、Aurora 胶片
*- BWR=黑色、白色和红色、 光谱红胶片
*- a=Aurora Ma (V230)
*- b=Aurora MB (V231)*/
#define DR_etC_BWA 0
#define dr_etc_bwb 1
#define DR_ITC_BWB 2

/**
*\brief 根据连接的显示模型配置以下两个定义*/
#define USE_EPD_Type DR_etC_BWB
#define USE_EPD_SIZE SZ_etC_190


#if (USE_EPD_Type=DR_ETC_BWA || USE_EPD_Type=DR_etC_BWB)
#if (use_epd_Type=dr_etc_bwa)
#define EPD_Type DR_ETC_G2_Aurora
其他
#define EPD_Type DR_ETC_G2_Aurora MB
#endif
#if (use_epd_size==SZ_etc_144)
extern unsigned char const Image_etc_144_01[];
extern unsigned char const Image_etc_144_02[];
#define EPD_SIZE EPD_144_BW
#define Image1 (uint8_t *)&Image_etc_144_01
#define Image2 (uint8_t *)&Image_etc_144_02
#elif (use_epd_size==SZ_etc_190)
extern unsigned char const Image_etc_190_01[];
extern unsigned char const Image_etc_190_02[];
#define EPD_SIZE EPD_190_BW
#define Image1 (uint8_t *)&Image_etc_190_01
#define Image2 (uint8_t *)&Image_etc_190_02
#elif (use_epd_size==SZ_etc_200)
extern unsigned char const Image_etc_200_01[];
extern unsigned char const Image_etc_200_02[];
#define EPD_SIZE EPD_200_BW
#define Image1 (uint8_t *)&Image_etc_200_01
#define Image2 (uint8_t *)&Image_etc_200_02
#elif (use_epd_size==SZ_etc_260)
extern unsigned char const Image_etc_260_01[];
extern unsigned char const Image_etc_260_02[];
#define EPD_SIZE EPD_260_BW
#define Image1 (uint8_t *)&Image_etc_260_01
#define Image2 (uint8_t *)&Image_etc_260_02
#elif (use_epd_size==SZ_etc_271)
extern unsigned char const Image_etc_271_01[];
extern unsigned char const Image_etc_271_02[];
#define EPD_SIZE EPD_271_BW
#define Image1 (uint8_t *)&Image_etc_271_01
#define Image2 (uint8_t *)&Image_etc_271_02
#endif

#elif (use_epd_Type=dr_itc_bwb)
#if (USE_EPD_SIZE=SZ_ITC_215)
extern unsigned char const Image_ITC_215_01[];
extern unsigned char const Image_ITC_215_02[];
#define EPD_Type DR_ITC_215_Aurora MB
#define EPD_SIZE EPD_215_BW
#define Image1 (uint8_t *)&Image_ITC_215_01
#define Image2 (uint8_t *)&Image_ITC_215_02
#elif (use_epd_size==SZ_ITC_287)
extern unsigned char const Image_ITC_287_01[];
extern unsigned char const Image_ITC_287_02[];
#define EPD_Type DR_ITC_287_Aurora MB
#define EPD_SIZE EPD_287_BW
#define Image1 (uint8_t *)&Image_ITC_287_01
#define Image2 (uint8_t *)&Image_ITC_287_02
#elif (use_epd_size==SZ_ITC_420)
extern unsigned char const Image_ITC_420_01[];
extern unsigned char const Image_ITC_420_02[];
#define EPD_Type DR_ITC_420_Aurora MB
#define EPD_SIZE EPD_420_BW
#define Image1 (uint8_t *)&Image_ITC_420_01
#define Image2 (uint8_t *)&Image_ITC_420_02
#endif
#endif

void main (void)
{
system_init();
EPD_DISPLAY_INIT();
SysTick 配置();
//EPD_DELAY_ms (1000);
Set_AssignEPD_Drive (EPD_Type、EPD_SIZE、USE_Temperature_Sensor);
///EPD_DISPLAY_GU_FITH_POINTER (Image2、Image1、GU_Mode、true);

_DELAY_CYCLES (200000);
while (true)
{
EPD_DISPLAY_GU_FITH_POINTER (Image2、Image1、GU_Mode、true);
EPD_DELAY_ms (5000);
EPD_DISPLAY_GU_FITH_POINTER (Image1、Image2、GU_Mode、true);
EPD_DELAY_ms (5000);
}
}

void system_init (void)

   /*停止看门狗*/
   MAP_WDT_A_HOLDTimer();

   /*为 DCO 频率计算启用 FPU */
   map_fpu_enableModule();

   /*将 DCO 设置为48MHz (升级 Vcore)*/
   MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);
   /*将 DCO 频率设置为非标准48MHz */
   //map_CS_setDCOFrequency (48000000);

   CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48);


   MAP_Interrupt_enableMaster();

   //MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);
   //CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48);

代码将在 DCO 频率初始化后随机进入故障中断函数。

谢谢。

安德烈

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

    Andre、

    我认为您缺少用于设置闪存等待状态的代码

    MAP_FlashCtl_setWaitState (FLASH_BANK0、1);
    MAP_FlashCtl_setWaitState (FLASH_BANK1、1); 

    对于器件上的48MHz、对于正常读取模式、您需要将闪存等待状态设置为1。  

    因此、您的代码与以下代码类似:

    /*为 DCO 频率计算启用 FPU */
    map_fpu_enableModule();
    
    /*将 DCO 设置为48MHz (升级 Vcore)*/
    MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);
    MAP_FlashCtl_setWaitState (FLASH_BANK0、1);
    MAP_FlashCtl_setWaitState (FLASH_BANK1、1);
    /*将 DCO 频率设置为非标准48MHz */
    //map_CS_setDCOFrequency (48000000);
    
    CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48); 

    此外、如果您在自己的电路板上、请确保您使用的是最新的 LaunchPad (红色)或 Rev C 或更大的器件。 请告诉我这是否能解决您的问题。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它确实解决了每次进入 ISRFault 的问题、但是现在、我被一个延迟阻止、当我检查寄存器 CS -> CTL2 -> HFXFREQ 时、它不会从000值改变。 它不会仅因延迟而被阻止、甚至会因__delay_cycles (1)而被阻止;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    安德烈

    HFXTFREQ 是指高频晶体振荡器、而不是 DCO。 请参阅以下内容:

    我相信您希望看到的是 CSCTL0中的 DCO 设置:

    如需更多信息、请参阅 TRM :http://www.ti.com/lit/ug/slau356g/slau356g.pdf