MyFPGA Forum

标题: RISC-V on T-core demo [打印本页]

作者: Roxiaobai    时间: 2021-5-18 01:29
标题: RISC-V on T-core demo
实验手册测试demo及其魔改系列
作者: Roxiaobai    时间: 2021-5-18 01:41
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[3:0]对应的是GPIO[3:0]。在设置TERASIC_LED_MASK中,即对GPIO[3:0]进行操作。因而可以对其进行魔改,实现三个、两个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_MASK  0x0000000F
#define TERASIC_SW_MASK   0x000000F0
#define TERASIC_KEY_MASK  0x00000300


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


}




欢迎光临 MyFPGA Forum (http://www.myfpga.org/discuz/) Powered by Discuz! X3