在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

以RISC-V架構(gòu)的D1 Dock Pro和D1 Nezha開發(fā)板

芯片開放社區(qū) ? 來源:玄鐵杯第二屆RISC-V應(yīng)用創(chuàng) ? 作者:玄鐵杯第二屆RIS ? 2022-12-19 10:20 ? 次閱讀

本項(xiàng)目以RISC-V架構(gòu)的D1 Dock Pro和D1 Nezha開發(fā)板為硬件平臺,應(yīng)用物聯(lián)網(wǎng)區(qū)塊鏈技術(shù),設(shè)計(jì)開發(fā)一套分布式能源智慧管理小型示范系統(tǒng),在該系統(tǒng)上實(shí)現(xiàn)能源生產(chǎn)和消費(fèi)數(shù)據(jù)的實(shí)時(shí)監(jiān)測。該項(xiàng)目在“玄鐵杯第二屆RISC-V應(yīng)用創(chuàng)新大賽”活動中榮獲一等獎。

關(guān)于分布式能源智慧管理和M2M交易系統(tǒng)的技術(shù)細(xì)節(jié),請看本文詳細(xì)介紹。

01項(xiàng)目介紹

能源和環(huán)保是關(guān)乎人類未來的重要課題。為實(shí)現(xiàn)碳中和目標(biāo),大力發(fā)展可再生清潔能源以替代傳統(tǒng)化石能源,提高能源系統(tǒng)監(jiān)控和消費(fèi)的智能化水平,是可行的重要途徑之一。本項(xiàng)目以RISC-V架構(gòu)的D1 Dock Pro和D1 Nezha開發(fā)板為硬件平臺,應(yīng)用物聯(lián)網(wǎng)和區(qū)塊鏈技術(shù),設(shè)計(jì)開發(fā)一套分布式能源智慧管理小型示范系統(tǒng),在該系統(tǒng)上實(shí)現(xiàn)能源生產(chǎn)和消費(fèi)數(shù)據(jù)的實(shí)時(shí)監(jiān)測。

02技術(shù)方案

項(xiàng)目使用 D1 Dock Pro 開發(fā)板設(shè)計(jì)開發(fā)一款專用網(wǎng)關(guān),實(shí)時(shí)采集電池控制器、氣象環(huán)境傳感器等其它傳感器的數(shù)據(jù),并通過無線通信方式(WiFi)以HTTP協(xié)議或MQTT協(xié)議將傳感器數(shù)據(jù)上傳至物聯(lián)網(wǎng)后臺。

17570832-7f43-11ed-8abf-dac502259ad0.jpg??

圖1.專用網(wǎng)關(guān)示意

1791faaa-7f43-11ed-8abf-dac502259ad0.jpg

圖2.專用網(wǎng)關(guān)實(shí)物圖

智能開關(guān)用于能源消費(fèi)端,實(shí)現(xiàn)對能源消費(fèi)者(電器負(fù)載)的供電控制、電能消費(fèi)數(shù)據(jù)的采集和傳輸?shù)裙δ堋T撝悄荛_關(guān)基于 D1 Dock Pro 開發(fā)板進(jìn)行設(shè)計(jì)開發(fā),通過開發(fā)板的I/O口控制繼電器、UART接收電能計(jì)量模塊的數(shù)據(jù)。設(shè)計(jì)一個(gè)擴(kuò)展電路板與開發(fā)板配合使用,擴(kuò)展電路板集成電能計(jì)量模塊、繼電器等。本文設(shè)計(jì)的智慧開關(guān)的功能主要是控制電器開關(guān)與計(jì)量電器用電參數(shù)以及環(huán)境參數(shù)并上傳到云端服務(wù)器。

17c2c180-7f43-11ed-8abf-dac502259ad0.jpg

圖3.智能開關(guān)示意圖

17f22718-7f43-11ed-8abf-dac502259ad0.jpg

圖4.智能開關(guān)實(shí)物圖

03核心業(yè)務(wù)代碼

3.1智能開關(guān)電能采集分析

// sensor variable
float sensor_data[9] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9};
int recv_cmd; 
unsigned long Voltage_data, Current_data, Power_data, Energy_data, Pf_data, CO2_data, HZ;

// read the consumer date
void read_consumer_data(void)
{

//send the instruction
unioncrc_data
{
unsigned int word16;
unsigned char byte[2];
} crc_now;

tx_buffer[0] = 0x01;
tx_buffer[1] = 0x03;
tx_buffer[2] = 0x01;
tx_buffer[3] = 0x00;
tx_buffer[4] = 0x02;
tx_buffer[5] = 0x08;
crc_now.word16 = chk_crc(tx_buffer, 6);
tx_buffer[6] = crc_now.byte[1];//CRC verification
tx_buffer[7] = crc_now.byte[0];

ret = csi_uart_send_async(&g_uart, tx_buffer,8);
//wait until send finished
while(1) {
if (tx_async_flag) {
tx_async_flag = 0;
break;
}
}

printf("send succeed
");
   ret = csi_uart_receive_async(&g_uart, rx_buffer, 1);
   //wait until receieve  finished
   while(1) {
//   printf("not_receieved
");
   aos_msleep(200);
     if (rx_async_flag) {
         break;
     }
   }


  printf("Line 358: got data");
  parse_data();
  publish_sensor_data(client, "publish");
  
}

//analyze the consumer date
void parse_data(void)
{
csi_error_t ret;
unsigned char i;
union crc_data
{
unsigned int word16;
unsigned char byte[2];
} crc_now;

if (rx_async_flag == 1){ // check if receieve finished
rx_async_flag = 0;
if ((rx_buffer[0] == 0x01)) { //check the ID of the device
crc_now.word16 = chk_crc(rx_buffer, recieve_data_num - 2);//crc verification
if ((crc_now.byte[0] == rx_buffer[recieve_data_num - 1]) && (crc_now.byte[1] == rx_buffer[recieve_data_num - 2])) {
//parse voltage
Voltage_data = (((unsigned long)(rx_buffer[3])) << 24) | (((unsigned long)(rx_buffer[4])) << 16) | (((unsignedlong)(rx_buffer[5])) << 8) | rx_buffer[6];
sensor_data[0] = (float)(Voltage_data * 0.0001);

//parse current
Current_data = (((unsigned long)(rx_buffer[7])) << 24) | (((unsigned long)(rx_buffer[8])) << 16) | (((unsignedlong)(rx_buffer[9])) << 8) | rx_buffer[10];
sensor_data[1] = (float)(Current_data * 0.0001);

//parse power
Power_data = (((unsignedlong)(rx_buffer[11])) << 24) | (((unsigned long)(rx_buffer[12])) << 16) | (((unsignedlong)(rx_buffer[13])) << 8) | rx_buffer[14];
sensor_data[2] = (float)(Power_data * 0.0001);

//parse energy
Energy_data = (((unsignedlong)(rx_buffer[15])) << 24) | (((unsigned long)(rx_buffer[16])) << 16) | (((unsignedlong)(rx_buffer[17])) << 8) | rx_buffer[18];
sensor_data[3] = (float)(Energy_data * 0.0001);

//parse power factor
Pf_data = (((unsignedlong)(rx_buffer[19])) << 24) | (((unsigned long)(rx_buffer[20])) << 16) | (((unsignedlong)(rx_buffer[21])) << 8) | rx_buffer[22];
sensor_data[4] = (float)(Pf_data * 0.001);

//parse CO2
CO2_data = (((unsigned long)(rx_buffer[23])) << 24) | (((unsigned long)(rx_buffer[24])) << 16) | (((unsignedlong)(rx_buffer[25])) << 8) | rx_buffer[26];
sensor_data[5] = (float)(CO2_data * 0.0001);

//parse frequency of the Single phase alternating current
HZ = (((unsigned long)(rx_buffer[31])) << 24) | (((unsigned long)(rx_buffer[32])) << 16) | (((unsignedlong)(rx_buffer[33])) << 8) | rx_buffer[34];
sensor_data[6] = (float)(HZ * 0.01);

} else {
printf("CRC_error
");
}
}

} else {
printf("receieve_not_finished
");
  }
}
// EOF uart

3.2MQTT電能數(shù)據(jù)上云

// mqtt 
char pub_topic[] = "wattnode/data"; 
char sub_topic[] = "wattnode/cmd"; 
mqtt_client_t *client;
int is_mqtt_ready = 0;

void mqtt_do_connect(mqtt_client_t *client);
static void mqtt_incoming_data_cb(void *arg, const u8_t *data, u16_t len, u8_t flags);
void publish_sensor_data(mqtt_client_t *client, void *arg);

/* Called when publish is complete either with sucess or failure */
static void mqtt_pub_request_cb(void *arg, err_t result)
{
  if(result != ERR_OK) {
    printf("Publish result: %d
", result);
  }
}

/* The idea is to demultiplex topic and create some reference to be used in data callbacks
   Example here uses a global variable, better would be to use a member in arg
   If RAM and CPU budget allows it, the easiest implementation might be to just take a copy of
   the topic string and use it in mqtt_incoming_data_cb
*/
static int inpub_id;
static void mqtt_incoming_publish_cb(void *arg, const char *topic, u32_t tot_len)
{
  printf("Incoming publish at topic %s with total length %u
", topic, (unsigned int)tot_len);

  /* Decode topic string into a user defined reference */
  if(strcmp(topic, "print_payload") == 0) {
    inpub_id = 0;
  } else if(topic[0] == 'A') {
    /* All topics starting with 'A' might bwhile(1)e handled at the same way */
    inpub_id = 1;
  } else {
    /* For all other topics */
    inpub_id = 2;
  }
}

static void mqtt_sub_request_cb(void *arg, err_t result)
{
  /* Just print the result code here for simplicity, 
     normal behaviour would be to take some action if subscribe fails like 
     notifying user, retry subscribe or disconnect from server */
    printf("Subscribe result: %d
", result);
}

static void mqtt_connection_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_t status)
{
  err_t err;
  if(status == MQTT_CONNECT_ACCEPTED) {
    printf("mqtt_connection_cb: Successfully connected
");
    
    /* Setup callback for incoming publish requests */
    mqtt_set_inpub_callback(client, mqtt_incoming_publish_cb, mqtt_incoming_data_cb, arg);
    
    /* Subscribe to a topic named "subtopic" with QoS level 1, call mqtt_sub_request_cb with result */ 
    err = mqtt_subscribe(client, sub_topic, 1, mqtt_sub_request_cb, arg);

    if(err != ERR_OK) {
      printf("mqtt_subscribe return: %d
", err);
    }

    printf("ready to read data");

    is_mqtt_ready = 1;

  } else {
    printf("mqtt_connection_cb: Disconnected, reason: %d
", status);
    
    /* Its more nice to be connected, so try to reconnect */
    mqtt_do_connect(client);
  }  
}

static void mqtt_incoming_data_cb(void *arg, const u8_t *data, u16_t len, u8_t flags)
{
  printf("Incoming publish payload with length %d, flags %u
", len, (unsigned int)flags);

  if(flags & MQTT_DATA_FLAG_LAST) {
    /* Last fragment of payload received (or whole part if payload fits receive buffer
       See MQTT_VAR_HEADER_BUFFER_LEN)  */

    /* Call function or do action depending on reference, in this case inpub_id */
    if(inpub_id == 0) {
      /* Don't trust the publisher, check zero termination */
      if(data[len-1] == 0) {
        //printf("mqtt_incoming_data_cb: %s
", (const char *)data);
      }
    } else if(inpub_id == 1) {
      /* Call an 'A' function... */
    } else {
    //   printf("mqtt_incoming_data_cb: Ignoring payload...
");
        // printf("mqtt_incoming_data_cb: %s
", (const char *)data);
        recv_cmd = atoi((const char *)data);



        printf("receive data: %d
", recv_cmd);
    
    }
  } else {
    /* Handle fragmented payload, store in buffer, write to file or whatever */
  }
}

void publish_sensor_data(mqtt_client_t *client, void *arg)
{
    err_t err;
    u8_t qos = 0; /* 0 1 or 2, see MQTT specification */
    u8_t retain = 0; /* No don't retain such crappy payload... */

    const int LEN = 9;
    // cat all float data to string
    char sep = ';';
    // char *prefix = "data=";
    char *prefix = "";
    char _str_data[10];
    char post_str[128];

    strcpy(post_str, prefix);
    for (int i = 0; i < LEN-1; i++) {
        sprintf(_str_data, "%.3f", sensor_data[i]);
        _str_data[strlen(_str_data)-1] = sep;
        strcat(post_str, _str_data);
    }

    sprintf(_str_data, "%.3f", sensor_data[LEN-1]);
    strcat(post_str, _str_data);

    err = mqtt_publish(client, pub_topic, post_str, strlen(post_str), qos, retain, mqtt_pub_request_cb, arg);
    if(err != ERR_OK) {
        printf("Publish err: %d
", err);
    }
}

void mqtt_do_connect(mqtt_client_t *client)
{
    struct mqtt_connect_client_info_t ci;
    err_t err;

    ip4_addr_t ip_addr;
    IP4_ADDR(&ip_addr, 106, 14, 44, 95);

    /* Setup an empty client info structure */
    memset(&ci, 0, sizeof(ci));

    /* Minimal amount of information required is client identifier, so set it here */ 
    ci.client_id = "wattnode1";

    /* Initiate client and connect to server, if this fails immediately an error code is returned
        otherwise mqtt_connection_cb will be called with connection result after attempting 
        to establish a connection with the server. 
        For now MQTT version 3.1.1 is always used */

    err = mqtt_client_connect(client, &ip_addr, MQTT_PORT, mqtt_connection_cb, 0, &ci);

    /* For now just print the result code if something goes wrong */
    if(err != ERR_OK) {
        printf("mqtt_connect return %d
", err);
    }
}

static void mqtt_main_task(void *d)
{
    printf("Enter mqtt_main_task
");
    // mqtt_client_t *client = mqtt_client_new();
    client = mqtt_client_new();
    if(client != NULL) {
        mqtt_do_connect(client);
    }
}
// EOF mqtt

3.3智能開關(guān)

// switch variable
const int SWITCH_PIN = PC1;
static csi_gpio_pin_t pin;
#define GPIO_CHECK_RETURN(ret)           
    do {                                 
        if (ret != CSI_OK) {             
            return -1;                   
        }                                
    } while(0);

//init the switch
void switch_init()
{
  ret = csi_gpio_pin_init(&pin, SWITCH_PIN);
  GPIO_CHECK_RETURN(ret);

  /* Set output mode */
  ret = csi_gpio_pin_dir(&pin, GPIO_DIRECTION_OUTPUT);
  GPIO_CHECK_RETURN(ret);
}
// EOF switch

3.4串口處理部分

// uart variable
static csi_uart_t g_uart;
static volatile uint8_t rx_async_flag = 0;
static volatile uint8_t tx_async_flag = 0;
static uint8_t tx_buffer[140];
static uint8_t rx_buffer[140];
int recieve_data_num = 37;
#define DATE_UART_BAUDRATE   4800
#define DATE_UART_IDX 5
#define UART_CHECK_RETURN(ret)                      
        do {                                        
            if (ret != CSI_OK) {                    
                return -1;                          
            }                                       
        } while(0);

// crc function
unsigned int calc_crc(unsigned char crcbuf, unsigned int crc);
unsigned int chk_crc(unsigned char* buf, unsigned char len);

//task
static aos_task_t task_date_uart5;

void date_uart5_entry()
{
   
while(1)
{
switch(recv_cmd){
case 0:
break;
case 1:
csi_gpio_pin_write(&pin, GPIO_PIN_HIGH);
recv_cmd = 0;
break;
case 2:
csi_gpio_pin_write(&pin, GPIO_PIN_LOW);
recv_cmd = 0;
break;
case 3:
read_consumer_data();
recv_cmd = 0;
break;
default:
break;

}//eof switch

aos_msleep(2000);
    }//eof while
}//eof func

//callback function of uart
static void uart_event_cb(csi_uart_t *uart, csi_uart_event_t event, void *arg)
{
  switch (event) {
    case UART_EVENT_SEND_COMPLETE:
      tx_async_flag = 1;
      break;

    case UART_EVENT_RECEIVE_COMPLETE:
      rx_async_flag = 1;
      break;

    default:
      break;
  }//eof switch
}//eof func


void uart_init()
{
  csi_pin_set_mux(PB4, PB4_UART5_TX);
  csi_pin_set_mux(PB5, PB5_UART5_RX);

  /* init uart, DATE_UART_IDX == 5 */
  ret = csi_uart_init(&g_uart, DATE_UART_IDX);
  UART_CHECK_RETURN(ret);

  /* set uart baudrate */
  ret = csi_uart_baud(&g_uart, DATE_UART_BAUDRATE);
  UART_CHECK_RETURN(ret);

  /* set uart format */
  ret = csi_uart_format(&g_uart, UART_DATA_BITS_8, UART_PARITY_NONE, UART_STOP_BITS_1);
  UART_CHECK_RETURN(ret);

  /* attach callback to uart device */
  ret = csi_uart_attach_callback(&g_uart, uart_event_cb, NULL);
  UART_CHECK_RETURN(ret);

}



// calculate crc function
unsigned int calc_crc(unsigned char crcbuf, unsigned int crc)
{
unsigned char i;
unsigned char chk;
crc = crc ^ crcbuf; for (i = 0; i < 8; i++)
{
chk = (unsigned char)(crc & 1);
crc = crc >> 1;
crc = crc & 0x7fff;
if (chk == 1) crc = crc ^ 0xa001;
crc = crc & 0xffff;
}
return crc;
}

// verify crc function
unsigned int chk_crc(unsigned char* buf, unsigned char len)
{
unsigned char hi, lo;
unsigned int i;
unsigned int crc;
crc = 0xFFFF;
for (i = 0; i < len; i++)
{
crc = calc_crc(*buf, crc);
buf++;
}

hi = (unsigned char)(crc % 256);
lo = (unsigned char)(crc / 256);
crc = (((unsigned int)(hi)) << 8) | lo;
return crc;
}

3.5主函數(shù)

int main(void)
{
  cxx_system_init();
  board_yoc_init();

  switch_init();
  uart_init();
    
  /* Subscribe */
  event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);
  event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);
  
  aos_task_new_ext(&task_date_uart5, "task_date_uart5", date_uart5_entry, NULL, 4096, AOS_DEFAULT_APP_PRI);
//  aos_task_new_ext(&uart5_proc, "uart5_proc", data_proc, NULL, 1024, 30);
  
  app_wifi_init();

  // while (1) {
  //   if (is_mqtt_ready == 1) {
  //   //   read_consumer_data();
  //     printf("OK");
  //     // aos_msleep(1000);
  //   }
  //   // test_uart();
    
  //   // aos_msleep(2000);
  // }
}

04問題匯總

uart的配置

在官方的GitBook中對驅(qū)動函數(shù)進(jìn)行了詳細(xì)地講解并附有相關(guān)例程:文檔首頁· GitBook (t-head.cn)

但并未對具體的底層配置修改進(jìn)行說明,在一開始編寫串口部分的代碼時(shí),一直未能成功初始化并調(diào)通串口,在工程師的幫助之下對D1 dock pro的底層配置有了一定的了解。這里以led_demo為例,演示如何在此基礎(chǔ)之上成功配置uart5。

改動1

181fac06-7f43-11ed-8abf-dac502259ad0.png

改動2

184a2e5e-7f43-11ed-8abf-dac502259ad0.png

改動3

189f4ca4-7f43-11ed-8abf-dac502259ad0.png

改動4

191571cc-7f43-11ed-8abf-dac502259ad0.png

做完以上三處改動,即可參考UART·GitBook(t-head.cn)中的使用示例對uart5進(jìn)行驗(yàn)證,注意需要先csi_pin_set_mux(PB4,PB4_UART5_TX);和csi_pin_set_mux(PB5,PB5_UART5_RX);

05項(xiàng)目總結(jié)

“我們對‘碳中和’比較感興趣,學(xué)校也鼓勵(lì)我們探索交叉學(xué)科,我負(fù)責(zé)系統(tǒng)架構(gòu)搭建和區(qū)塊鏈技術(shù),另外兩位隊(duì)員負(fù)責(zé)硬件編程及網(wǎng)頁編程。從最初簡單的能源物聯(lián)網(wǎng)演示,到利用區(qū)塊鏈技術(shù)實(shí)現(xiàn)M2M自主交易,我們做了很多討論和嘗試,終于在RISC-V平臺上跑通了程序!”“萌新隊(duì)”隊(duì)長、華東師范大學(xué)大四學(xué)生龔丹妮說。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 能源系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    85

    瀏覽量

    11137
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5088

    瀏覽量

    97797
  • RISC-V
    +關(guān)注

    關(guān)注

    45

    文章

    2306

    瀏覽量

    46291

原文標(biāo)題:應(yīng)用速遞 | 摘得頭獎的小隊(duì)究竟是做了什么項(xiàng)目?

文章出處:【微信號:芯片開放社區(qū),微信公眾號:芯片開放社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    請問TVP5158分辨率D1與HalfD1是如何轉(zhuǎn)換的?

    這段時(shí)間在調(diào)試TVP5158模擬視頻采集芯片,發(fā)現(xiàn)輸出數(shù)據(jù)有三種分辨率D1、HalfD1和CIF,手冊上面只是說明了D1、HalfD1和CIF三者的水平像素點(diǎn)和垂直行數(shù)的關(guān)系,但是這
    發(fā)表于 12-23 06:31

    RISC-V架構(gòu)及MRS開發(fā)環(huán)境回顧

    ,華為海思轉(zhuǎn)向了開源指令集架構(gòu)RISC-V,針對鴻蒙操作系統(tǒng)的開發(fā)者發(fā)布了首款RISC-V開發(fā)板Hi3861。Hi3861針對的是物聯(lián)網(wǎng)市場
    發(fā)表于 12-16 23:08

    SiFive 推出高性能 Risc-V CPU 開發(fā)板 HiFive Premier P550

    “ ?HiFive Premier P550:世界上性能最高的 RISC-V CPU 開發(fā)板 Mini-DTX 外形提供高性能 Linux 開發(fā)平臺,支持下一波
    的頭像 發(fā)表于 12-16 11:16 ?370次閱讀
    SiFive 推出高性能 <b class='flag-5'>Risc-V</b> CPU <b class='flag-5'>開發(fā)板</b> HiFive Premier P550

    如何使用 RISC-V 進(jìn)行嵌入式開發(fā)

    、準(zhǔn)備開發(fā)環(huán)境 選擇開發(fā)板RISC-V架構(gòu)的嵌入式開發(fā)板有多種選擇,如GD32VF103R-START、飛凌嵌入式OK113i-S等。選
    的頭像 發(fā)表于 12-11 17:32 ?617次閱讀

    Made with KiCad(十六):全志RISC-V 64 SoC F133/D1s開發(fā)板

    Linux 的開發(fā)板一起推出的全志D1 RISC-V 處理器的低成本版,它和D1的主要區(qū)別在于D1s內(nèi)置的RAM是 64MB DDR2。
    的頭像 發(fā)表于 12-04 18:22 ?1365次閱讀
    Made with KiCad(十六):全志<b class='flag-5'>RISC-V</b> 64 SoC F133/<b class='flag-5'>D1</b>s<b class='flag-5'>開發(fā)板</b>

    【RA8D1試用活動】RA8D1B-CPKCOR開發(fā)板移植linux

    【RA8D1試用活動】RA8D1B-CPKCOR開發(fā)板移植linux
    的頭像 發(fā)表于 11-16 01:02 ?277次閱讀
    【RA8<b class='flag-5'>D1</b>試用活動】RA8<b class='flag-5'>D1</b>B-CPKCOR<b class='flag-5'>開發(fā)板</b>移植linux

    香蕉派開發(fā)板BPI-CanMV-K230D-Zero 嘉楠科技 RISC-V開發(fā)板開發(fā)

    K230D Zero 開發(fā)板。這款創(chuàng)新的開發(fā)板是由嘉楠科技與香蕉派開源社區(qū)聯(lián)合設(shè)計(jì)研發(fā),搭載了先進(jìn)的勘智 K230D 芯片。 K230D
    發(fā)表于 11-05 15:29

    香蕉派開發(fā)板BPI-CanMV-K230D-Zero 嘉楠科技 RISC-V開發(fā)板開發(fā)

    科技 K230D RISC-V芯片設(shè)計(jì),探索 RISC-V Vector1.0 的前沿技術(shù),選擇嘉楠科技的 Canmv K230D Zero 開發(fā)板
    的頭像 發(fā)表于 11-05 15:27 ?426次閱讀
    香蕉派<b class='flag-5'>開發(fā)板</b>BPI-CanMV-K230<b class='flag-5'>D</b>-Zero 嘉楠科技 <b class='flag-5'>RISC-V</b><b class='flag-5'>開發(fā)板</b>公<b class='flag-5'>開發(fā)</b>售

    香蕉派 BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片設(shè)計(jì)

    開發(fā)板采用的是嘉楠科技Kendryte?系列AIoT芯片中的最新一代SoC芯片K230D。該芯片采用全新的多異構(gòu)單元加速計(jì)算架構(gòu),集成了2個(gè)RISC-V高能效計(jì)算核心,內(nèi)置新一代KPU
    發(fā)表于 07-30 17:43

    在ESP Wemos D1 Mini Pro上將FTDI連接到RX和TX遇到的疑問求解

    我在 ESP Wemos D1 Mini Pro 上將 FTDI 連接到我的 RX 和 TX。我必須物理斷開 Wemos D1 上的 RX 引腳才能刷新新固件。我的猜測是引腳與 Wemos
    發(fā)表于 07-10 07:29

    RISC-V最新開發(fā)板

    最近市面上有啥新出的RISC-V開發(fā)板,可以介紹學(xué)習(xí)下
    發(fā)表于 04-28 22:12

    STM32L475 QSPI單指令模式D1無輸出的原因?

    用STM32L475外擴(kuò)N25Q256存儲器,在配置為單指令模式時(shí)(如寫使能),處理器的D1未見有輸出。 比如:Instruction 段配置為0x5A,Address 段配置為NONE,Data段
    發(fā)表于 04-26 07:34

    全志D1s開發(fā)板裸機(jī)開發(fā)之壞境搭建

    的DongshanPI-D1S 開發(fā)板。 DongshanPI-D1S 是百問網(wǎng)推出的一款基于 RISC-V 架構(gòu)的學(xué)習(xí)裸機(jī)、 RTOS 的
    發(fā)表于 03-06 13:54

    RISC-V SoC + AI | 在全志 D1「哪吒」開發(fā)板上,跑個(gè) ncnn 神經(jīng)網(wǎng)絡(luò)推理框架的 demo

    的為 RISC-V 架構(gòu)做過適配和優(yōu)化的神經(jīng)網(wǎng)絡(luò)框架。 本文 是一份教程,步驟騎著步驟 (step by step) 地展示了如何在一塊全新的全志 D1「哪吒」開發(fā)板上,跑個(gè) ncnn
    發(fā)表于 02-26 10:51

    香蕉派發(fā)布RISC-V架構(gòu)BPI-F3開發(fā)板

    2 月 3 日,香蕉派發(fā)布了基于 RISC-V 架構(gòu)處理器的開發(fā)板 BPI-F3。該產(chǎn)品配備了由進(jìn)迭時(shí)空研發(fā)的八核 K1 CPU 芯片,這是全球第一款達(dá)到
    的頭像 發(fā)表于 02-03 16:17 ?1214次閱讀
    主站蜘蛛池模板: japan高清视频乱xxxxx| 69视屏| 日本免费精品视频| 全国最大色成免费网站| 欧美巨大bbbb动漫| 黄色一级片毛片| www.色播.com| 天天爱天天干天天| 久久久午夜精品理论片| riav久久中文一区二区| 69日本xxxxxxxxx13| xxxx性xx另类| 色婷婷成人网| 精品色| 91青草视频| 男人的网址| h国产| 伊人久久大香线蕉资源| 涩涩高清无乱码在线观看| 免费大秀视频在线播放| 国产va在线| 天天操天天艹| 亚洲综合校园春色| 欧美色亚洲图| 四虎国产成人亚洲精品| 精品伊人久久香线蕉| 亚洲播播| 完全免费在线视频| 二区三区| 欧美大全| 亚洲人成网站999久久久综合| 狠狠色综合色综合网络| 亚洲一区区| 四虎精品影院在线观看视频| 精品三级国产精品经典三| 午夜精品网站| 免费在线播放视频| 亚洲国产精品乱码一区二区三区 | 男女性生动态免费视频| 婷婷久| 狠狠色丁香婷婷综合橹不卡|