2 . 程序 编写
本实验程序实现 PRU 对 LED 的控制。AM437x 开发板的 LED 和 GPIO 对应关系如下表
所示:
右击 PRU_LED 工程,在弹出对话框中选择”Add Files”,添加光盘“Demopru”目录下的
AM437x_PRU.cmd和resource_table_empty.h文件。这两个文件适用于所有AM437x的PRU
工程,每次新建工程均需要添加。
在 PRU_LED 工程 main.c 文件下,添加以下代码并保存。PRU_LED 工程 main.c 源码位
于光盘资料“DemopruApplicationPRU_LED”目录下。
#include
#include "resource_table_empty.h"
/* LED port address */
#define GPIO5_BASE_ADDR 0x48322000
#define GPIO_OE_OFFSET 0x134
#define GPIO_CLRDATAOUT_OFFSET 0x190
#define GPIO_SETDATAOUT_OFFSET 0x194
//volatile register uint32_t __R30;
volatile pruCfg CT_CFG __attribute__((cregister("PRU_CFG", near), peripheral));
int main(void) {
uint32_t i;
uint32_t value;
/* GPI Mode 0, GPO Mode 0 */
CT_CFG.GPCFG0 = 0;
/* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */
CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;
uint32_t led_set_addr;
uint32_t led_clr_addr;
led_set_addr = GPIO5_BASE_ADDR + GPIO_SETDATAOUT_OFFSET;
led_clr_addr = GPIO5_BASE_ADDR + GPIO_CLRDATAOUT_OFFSET;
*(uint32_t*)led_clr_addr |= 1<<10; //turn down LED0
while(1) {
for (i = 0; i < 4; i++) {
value = 1<<(i + 10);
*(uint32_t*)led_set_addr |= value;
__delay_cycles(100000000); // half-second delay
*(uint32_t*)led_clr_addr |= value;
__delay_cycles(100000000); // half-second delay
}
}
/* Halt the PRU core - shouldn't get here */
// __halt();
}
2 . 程序 编写
本实验程序实现 PRU 对 LED 的控制。AM437x 开发板的 LED 和 GPIO 对应关系如下表
所示:
右击 PRU_LED 工程,在弹出对话框中选择”Add Files”,添加光盘“Demopru”目录下的
AM437x_PRU.cmd和resource_table_empty.h文件。这两个文件适用于所有AM437x的PRU
工程,每次新建工程均需要添加。
在 PRU_LED 工程 main.c 文件下,添加以下代码并保存。PRU_LED 工程 main.c 源码位
于光盘资料“DemopruApplicationPRU_LED”目录下。
#include
#include "resource_table_empty.h"
/* LED port address */
#define GPIO5_BASE_ADDR 0x48322000
#define GPIO_OE_OFFSET 0x134
#define GPIO_CLRDATAOUT_OFFSET 0x190
#define GPIO_SETDATAOUT_OFFSET 0x194
//volatile register uint32_t __R30;
volatile pruCfg CT_CFG __attribute__((cregister("PRU_CFG", near), peripheral));
int main(void) {
uint32_t i;
uint32_t value;
/* GPI Mode 0, GPO Mode 0 */
CT_CFG.GPCFG0 = 0;
/* Clear SYSCFG[STANDBY_INIT] to enable OCP master port */
CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;
uint32_t led_set_addr;
uint32_t led_clr_addr;
led_set_addr = GPIO5_BASE_ADDR + GPIO_SETDATAOUT_OFFSET;
led_clr_addr = GPIO5_BASE_ADDR + GPIO_CLRDATAOUT_OFFSET;
*(uint32_t*)led_clr_addr |= 1<<10; //turn down LED0
while(1) {
for (i = 0; i < 4; i++) {
value = 1<<(i + 10);
*(uint32_t*)led_set_addr |= value;
__delay_cycles(100000000); // half-second delay
*(uint32_t*)led_clr_addr |= value;
__delay_cycles(100000000); // half-second delay
}
}
/* Halt the PRU core - shouldn't get here */
// __halt();
}
举报