0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

干货:PSoC SWDT在Standalone下的应用

电子设计 来源:电子设计 作者:电子设计 2020-10-30 10:13 次阅读

01、Author

Hank Fu (付汉杰) Staff FAE embedded, Xilinx, Inc. hankf@xilinx.com

02、问题

工程师反映,根据 MPSoC SWDT 在 Standalone 下的例子 xwdtps_polled_example.c,不能实现 MPSoC 的 PS 复位。SWDT 例子来自于目录 /Xilinx/SDK/2018.3/data/embeddedsw/XilinxProcessorIPLib/drivers/wdtps_v3_1/examples/。SWDT 例子 xwdtps_polled_example.c 只检查了超时状态,没有实现复位。工程师把其中的“XWdtPs_DisableOutput(&Watchdog, XWDTPS_RESET_SIGNAL)”改为“XWdtPs_EnableOutput(&Watchdog, XWDTPS_RESET_SIGNAL)”,仍然不能复位。


工程师根据 FSBL 的 main.c 中的 InitWatchDog( ),添加代码后,依然不能使 MPSoC 的 PS 复位。

03、分析

3.1. FSBL 的 main.c

main.c 是 Zynq-7000 的 FSBL 的代码。客户使用 SOurce Insight 分析代码时,使用了错误的文件。

3.2. MPSoC 的 FSBL
MPSoC 的 FSBL 的主文件是 xfsbl_main.c,wdt 的代码在 xfsbl_misc_drivers.c 和 xfsbl_misc_drivers.h 中,初始化 WDT 的函数是 u32 XFsbl_InitWdt(void),宏定义 XFSBL_WDT_EXPIRE_TIME 定义了 FSBL 中 wdt 的超时时间。

在 XFsbl_InitWdt(void)中,初始化并启动 WDT(XWdtPs_RestartWdt( ))后,直接使用 sleep(20),睡眠 20 秒。睡眠过程中,因为 WDT 超时,MPSoC 的 PS 会被复位。这说明 FSBL 关于 WDT 代码是正确的。

3.3. Standalone 下的 WDT
对比 MPSoC FSBL 初始化 WDT 的函数 XFsbl_InitWdt( ),发现它设置了 PMU 的 ERROR_SRST_EN_1 Register 和 ERROR_EN_1 Register。把相关代码复制到 Standalone 下的代码,在初始化 WDT 之前运行。重新编译后,WDT 超时会复位 MPSoC 的 PS。

3.4. 再次运行时,设置 PMU 的 ERROR_SRST_EN_1 后,PS 马上复位。

WDT 超时后,再次使用 Debugger 运行时,设置 PMU 的 ERROR_SRST_EN_1 后,WDT 还没有被初始化时,PS 马上被复位。检查 PMU ERROR_STATUS_1 Register,发现 WDT 的超时状态为 1。于是把读取到的 ERROR_STATUS_1 的值,再写回 ERROR_STATUS_1 Register,清除 WDT 的超时状态。

这样在 WDT 超时后,设置 PMU 的 ERROR_SRST_EN_1 后,PS 不会马上被复位。

3.5. FPD_SWDT 和 LPD_SWDT

工程师发现使用 LPD_SWDT,能复位 PS;换成 FPD_SWDT,不能复位 PS。


在设置 PMU 的 ERROR_SRST_EN_1 Register 和 ERROR_EN_1 Register 时,LPD_SWDT 和 FPD_SWDT 有各自的使能位。增加设置 FPD_SWDT 的使能位后,换成 FPD_SWDT,也能复位 PS。

#define PMU_GLOBAL_ERROR_SRST_EN_1 ( ( PMU_GLOBAL_BASEADDR ) + 0X0000056CU )
#define PMU_GLOBAL_ERROR_SRST_EN_1_LPD_SWDT_MASK 0X00001000U
#define PMU_GLOBAL_ERROR_SRST_EN_1_FPD_SWDT_MASK 0X00002000U


04、Vivado 设置

使用 WDT,要在 Vivado 里的 PCW 里,使能对应的 WDT。


05、相关代码

5.1. 检查和清除 PMU 寄存器

xil_printf("/r/n" );
u32_reg = Xil_In32(0xFFD80530);
xil_printf("Old PMU ERROR_STATUS_1 (PMU_GLOBAL) Register: %x./r/n", u32_reg );
Xil_Out32(0xFFD80530, u32_reg); // Clear PMU ERROR_STATUS_1 (PMU_GLOBAL) Register

u32_reg = Xil_In32(0xFFD80540);
xil_printf("Old PMU ERROR_STATUS_2 (PMU_GLOBAL) Register: %x./r/n", u32_reg );
Xil_Out32(0xFFD80540, u32_reg); // Clear PMU ERROR_STATUS_2 (PMU_GLOBAL) Register

u32_reg = Xil_In32(0xFFD80530);
xil_printf("New PMU ERROR_STATUS_1 (PMU_GLOBAL) Register: %x./r/n", u32_reg );

u32_reg = Xil_In32(0xFFD80540);
xil_printf("New PMU ERROR_STATUS_2 (PMU_GLOBAL) Register: %x./r/n", u32_reg );


5.2. 检查 SWDT 寄存器状态

void CheckWDTRegisterValue( u32 EffectiveAddress )
{
u32 u32_reg;

u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_ZMR_OFFSET);
xil_printf("WDT Zero Mode Register: %x./r/n", u32_reg );
u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_CCR_OFFSET);
xil_printf("WDT Counter Control Register: %x./r/n", u32_reg );
u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_RESTART_OFFSET);
xil_printf("WDT Restart Register: %x./r/n", u32_reg );
u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_SR_OFFSET);
xil_printf("WDT Status Register: %x./r/n", u32_reg );
}

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PSoC
    +关注

    关注

    12

    文章

    170

    浏览量

    91930
收藏 人收藏

    评论

    相关推荐

    英飞凌推出PSOC™ Control MCU系列,用于工业和消费应用的电机控制与功率转换

    英飞凌科技股份公司近日推出全新PSOC™ Control微控制器(MCU)系列。该系列适用于新一代工业和消费电机控制以及功率转换系统应用,包括家用电器、电动工具、可再生能源产品、工业驱动器,以及照明
    的头像 发表于 09-25 10:32 522次阅读

    使用PSoC5LP的过程中,遇到PSoC5LPEFT干扰时复位的问题怎么解决?

    我使用 PSoC5LP 的过程中(>8 年),我曾多次验证测试中遇到 PSoC5LP EFT 干扰时复位的问题。 大多数情况
    发表于 07-05 07:26

    英飞凌发布全新PSOC Edge微控制器系列

    英飞凌科技股份公司近日发布了全新的PSOC™ Edge微控制器(MCU)系列,特别针对机器学习(ML)应用进行了精心优化。新系列包括E81、E83和E84三个型号,这些产品性能、功能和内存选项上展现出高度的可扩展性和兼容性。
    的头像 发表于 06-04 10:56 992次阅读

    使用PSOC UART与Nextion HMI进行通信,PSOC UART发送字符串不起作用的原因?

    PSOC creator 3.3 使用 PSOC(型号 CY8C5888LTI)、 我正在尝试使用 PSOC UART 与我的 Ne
    发表于 05-30 07:19

    STM32CubeF4 1.24.0的DFU_Standalone工程不能识别设备是什么原因导致的?

    STM32F413H Discovery 板子上运行 STM32CubeF4 1.24.0 里面的 DFU_Standalone 工程, 发现用 Keil MDK 编译烧到板子上运行连到PC后设
    发表于 04-18 06:27

    什么是可编程片上系统?PSOC和FPGA的区别

    可编程片上系统(PSoC)是一种高度集成化和灵活性的嵌入式系统解决方案。它将数字逻辑、模拟电路和可配置模块等功能融合在一起,形成一个单一的集成电路。PSoC的核心理念在于其可编程性,用户可以通过软件
    的头像 发表于 03-28 14:59 1829次阅读

    玩转PSoC 6 RTT积木式开发套件,实现毫米波雷达等实用功能

    本期英飞凌手工课,将由来自英飞凌的工程师Jenson给大家带来PSoC62withCAPSENSEevaluationkit(PSoC6RTT开发板)和其积木式开发套件的全面介绍。让我们跟着
    的头像 发表于 03-20 08:35 995次阅读
    玩转<b class='flag-5'>PSoC</b> 6 RTT积木式开发套件,实现毫米波雷达等实用功能

    如何使用CLIJTAG链上选择要写入的PSoC6?

    MiniProg4 和CYPRESS™编程器, 有一个单选按钮可以选择要写入的 PSoC6。 但是,当尝试通过 CLI 写入时,只能识别一个 PSoC6。 如何使用 CLI JTAG 链上选择要写入的
    发表于 03-04 07:26

    PSoC6的WDTHibernate模式是否可以工作?

    大家好!我在这个帖子PSoC 6 Watchdog 看到介绍WDTHibernate模式是可以工作的,但是这里却,却没提到 我把CE220607的deep sleep 模式改为
    发表于 02-21 06:47

    CY8C6347BZI-BLD53调用SMIF组件休眠模式功耗较高怎么解决?

    客户将PSOC6 BLE Prototyping Kit 上的ES版本的芯片 替换为正式版 调用PSOC6 的SMIF 组件之后 发现在休眠模式 有800uA的静态电流消耗, 即使
    发表于 02-21 06:31

    Linux环境能使用PSoC Creator 4.3吗?

    最近碰到一个Linux系统编译的要求,PSoC Creator能够Linux环境使用吗?
    发表于 02-18 07:22

    PSOC4平台如何编译生成.bin后缀的文件?

    PSOC4平台如何编译生成.bin后缀的文件
    发表于 02-01 06:37

    请问PSoC MiniProgPSoC Designer5.4上可作为ICE仿真器使用吗?

    大家好! 请问一PSoC MiniProgPSoC Designer5.4上可作为ICE仿真器使用吗?
    发表于 01-31 06:51

    PSoC Creator会支持PSoC 4000T吗?

    PSoC Creator 会支持 PSoC 4000T 吗? 同一 SDK/IDE 中使用预先加载的示例和主板支持包来完全支持所有 PSoC 4000 器件会很有帮助。 如果
    发表于 01-31 06:21

    PSoC™ 6如何在低电压下工作?

    我对 PSoC™ 6 有疑问,我使用的 TDA5235_868_5_BOARD 是 CY8CPROTO-063-BLE,我想让它在低电压下工作,我知道它可以 3.3、1.1 和 0.9 伏下
    发表于 01-18 08:47