嵌入式开发者社区

标题: 实际测试可以用PRUSS初始化IO. [打印本页]

作者: cl17726    时间: 2017-5-23 15:13
标题: 实际测试可以用PRUSS初始化IO.
我实际写了个程序做测试.
  1. /*
  2. * LED Bilnk Pruss code for tl_am572x.
  3. * vefone <vefone2lemon@gmail.com>
  4. * Copyright (C) 2016 Tronlong, Inc.
  5. *
  6. */

  7. #include <stdint.h>
  8. #include <pru_cfg.h>
  9. #include "resource_table_empty.h"

  10. /* LED port address */
  11. #define GPIO3_BASE_ADDR             0x48057000
  12. #define GPIO_OE_OFFSET              0x134
  13. #define GPIO_CLRDATAOUT_OFFSET      0x190
  14. #define GPIO_SETDATAOUT_OFFSET      0x194

  15. #define CTRL_CORE_PAD_VIN1A_D15 0x4A003530

  16. //volatile register uint32_t __R30;

  17. volatile pruCfg CT_CFG __attribute__((cregister("PRU_CFG", near), peripheral));

  18. int main(void) {

  19.     uint32_t i;
  20.     uint32_t value;

  21.     /* GPI Mode 0, GPO Mode 0 */
  22.     CT_CFG.GPCFG0 = 0;
  23.     /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */
  24.     CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;

  25.     uint32_t led_set_addr;
  26.     uint32_t led_clr_addr;
  27.     uint32_t led_oe_addr;
  28.     uint32_t ctrl_core_io_mode;

  29.     led_oe_addr = GPIO3_BASE_ADDR + GPIO_OE_OFFSET;
  30.     ctrl_core_io_mode = CTRL_CORE_PAD_VIN1A_D15;
  31.     led_set_addr = GPIO3_BASE_ADDR + GPIO_SETDATAOUT_OFFSET;
  32.     led_clr_addr = GPIO3_BASE_ADDR + GPIO_CLRDATAOUT_OFFSET;

  33.     *(uint32_t*)led_clr_addr |= 1 << 19; //turn down LED0 (GPIO3_19)
  34.     *(uint32_t*)ctrl_core_io_mode = 0x0001000E;
  35.     *(uint32_t*)led_oe_addr = 0x00000000;

  36.     while(1) {
  37.             value = 1 << 19;
  38.             *(uint32_t*)led_set_addr |= value;
  39.             __delay_cycles(100000000); // half-second delay
  40.             *(uint32_t*)led_clr_addr |= value;
  41.             __delay_cycles(100000000); // half-second delay
  42.     }
  43.      /* Halt the PRU core - shouldn't get here */
  44.      //__halt();
  45. }
复制代码
然后先连接A15核心,再连接PRU0核心,就像下图一样.寄存器数值没手动改过,ARM端也没跑程序.然后LED就闪烁起来了.看图.

[attach]2356[/attach]
[attach]2357[/attach]

这么说PRU也是有权限的啊,是为什么呢?还是说因为仿真?
[attach]2358[/attach]


作者: human    时间: 2017-5-23 17:26
你要先确定你的代码是否真的能修改pinmux,可能不是你的代码生效
作者: cl17726    时间: 2017-5-23 23:03
human 发表于 2017-5-23 17:26
你要先确定你的代码是否真的能修改pinmux,可能不是你的代码生效

我测试过单步寄存器,确实有其中一个生效的,在群中有回复.
作者: vefone    时间: 2017-5-23 23:56
cl17726 发表于 2017-5-23 23:03
我测试过单步寄存器,确实有其中一个生效的,在群中有回复.

在我的印象中,pru是没有权限修改pinmux的。
可参考以下链接:
http://processors.wiki.ti.com/index.php/PRU-ICSS_FAQ#Q:_Why_does_my_PRU_firmware_hang_when_reading_or_writing_to_an_address_external_to_the_PRU_Subsystem.3F

您这个问题,确实是因为啥,我这边还没时间测试,也说不上是什么情况

作者: vefone    时间: 2017-5-24 08:28
cl17726 发表于 2017-5-23 23:03
我测试过单步寄存器,确实有其中一个生效的,在群中有回复.

AM5728的pru和am437x的不太一样,am5728的pru有权限修改pinmux了。

作者: cl17726    时间: 2017-5-25 11:27
vefone 发表于 2017-5-24 08:28
AM5728的pru和am437x的不太一样,am5728的pru有权限修改pinmux了。

看着图权限大了好多.




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4