Roxiaobai 发表于 2021-5-18 01:29:57

RISC-V on T-core demo

实验手册测试demo及其魔改系列

Roxiaobai 发表于 2021-5-18 01:41:09

demo_gpio 主要实现led流水灯效果
在后面的实验中,涉及到我的一些自己需要对其进行一些相关的GPIO操作,但是不知道怎么去针对某一个GPIO进行操作,以及对TERASIC_LED_MASK,掩码的一些理解问题。因为在E203中涉及到32I/O的操作,在TERASIC_LED_MASK中,定义了0x0000000F,即0x0000_000F其中的一位‘0’代表了的16进制的0000,即在对TERASIC_LED_MASK中的一位‘0’进行设置值,就是在对其中的二进制中的“0000”进行操作。而在TERASIC_LED_MASK中定义了0x0000000F,即对应与二进制中的1111,由原理图可知,LED对应的是GPIO。在设置TERASIC_LED_MASK中,即对GPIO进行操作。因而可以对其进行魔改,实现三个、两个LED的流水灯。
#include <stdint.h>
#include <stdbool.h>
#include <stdatomic.h>
#include "encoding.h"
#include <platform.h>


// LED0-3: bit 0-3
// SW0-3:bit 4-7
// KEY0-1: bit 8-9
// ...
#define TERASIC_LED_MASK0x0000000F
#define TERASIC_SW_MASK   0x000000F0
#define TERASIC_KEY_MASK0x00000300


uint32_t gpio_value = 0;

void set_LED(uint8_t value){
    gpio_value &= ~TERASIC_LED_MASK;
    gpio_value |= (uint32_t)(value << 0) & TERASIC_LED_MASK;
}

void update_GPIO_Output(void){
    GPIO_REG(GPIO_OUTPUT_VAL) = (GPIO_REG(GPIO_OUTPUT_VAL)&(~TERASIC_LED_MASK))|gpio_value;
}



int main (void){
    // Wait a bit because we were changing the GPIOs
    volatile int i=0;
    while(i < 10000){i++;}

    // Set LED0-3 output
    GPIO_REG(GPIO_OUTPUT_EN) |= TERASIC_LED_MASK;

    uint8_t led_value=0x01;

    while(1){
      volatile uint64_t *now = (volatile uint64_t*)(CLINT_CTRL_ADDR + CLINT_MTIME);
      volatile uint64_t then = *now + 4000;

      while (*now < then) { }

      if(led_value >= 0x08)
            led_value = 0x01;
      else
            led_value = led_value << 1;

      set_LED(led_value);
      update_GPIO_Output();
    }    //end of while


}
页: [1]
查看完整版本: RISC-V on T-core demo