返回

BouffaloSDK笔记

目录

BouffaloSDK 使用指南
SDK Doxygen Docs 野火lwip开发文档

SDK 安装

Win

官方的SDK我不知道为什么无法编译,使用 VeriMake 的可以正常使用

1
git clone https://gitee.com/verimaker/bouffalo_sdk_vmg0.git

配置环境变量

SDK目录下的make、ninja、gcc添加到环境变量中,放最下面即可

Check

1
2
make -v
riscv64-unknown-elf-gcc -v

编译

1
2
3
4
5
6
## chip_name 为芯片型号,可以填写 bl702、bl616、bl808、bl606p, board_name 为开发板名称,详见 bsp/board 目录
 cd examples/helloworld
 make CHIP=chip_name BOARD=board_name

 # 使用 ninja 编译 
 make ninja CHIP=chip_name BOARD=board_name

烧录

1
2
cd examples/helloworld
make flash CHIP=chip_name COMX=port_name ## port_name 为串口号名称

常用命令

1
2
3
4
5
6
7
# 查看所有命令
help
# 连接wifi
wifi_sta_connet "ssid" "pswd"
ping www.baidu.com
# 可以查看ip地址
wifi_sta_info

添加新的工程

引脚定义

芯片定义

M0Pdock定义

  • GPIO20:MIC_IN

例程

uart(printf)

点开helloworld工程

1
2
make BOARD=m0pdock
make flash COMX=COM17

将UART0(TX:IO21;RX:IO22)连接电脑,可以看到打印信息,推荐使用的xshell软件进行连接,因为官方这个串口log库实现了彩色打印。 注意:set(CONFIG_BFLOG 0)时才能在串口看到打印信息,这有点反直觉,其实是0时将调试信息打印到环形缓冲区,方便调试器查看,1时使用串口发送

常用

1
2
#include "bflb_mtimer.h"
bflb_mtimer_delay_ms(1000);

DMA LLI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
static void dma0_ch0_isr(void *arg);

static void adc_init(void)
{
    struct bflb_adc_channel_s chan[] = {
        { .pos_chan = ADC_CHANNEL_0,
          .neg_chan = ADC_CHANNEL_GND },
        { .pos_chan = ADC_CHANNEL_3,
          .neg_chan = ADC_CHANNEL_GND },
    };

    adc = bflb_device_get_by_name("adc");

    /**
     *  adc clock = XCLK / 2 / 20 / 64(14B) = 15.625K
     */
    struct bflb_adc_config_s cfg;
    cfg.clk_div = ADC_CLK_DIV_20;
    cfg.scan_conv_mode = true;
    cfg.continuous_conv_mode = true;
    cfg.differential_mode = false;
    cfg.resolution = ADC_RESOLUTION_14B;
    cfg.vref = ADC_VREF_2P0V;

    bflb_adc_init(adc, &cfg);
    bflb_adc_channel_config(adc, chan, sizeof(chan) / sizeof(chan[0]));
    bflb_adc_link_rxdma(adc, true);

    struct bflb_device_s *dma0_ch0;
    dma0_ch0 = bflb_device_get_by_name("dma0_ch0");

    struct bflb_dma_channel_config_s config;

    config.direction = DMA_PERIPH_TO_MEMORY;
    config.src_req = DMA_REQUEST_ADC;
    config.dst_req = DMA_REQUEST_NONE;
    config.src_addr_inc = DMA_ADDR_INCREMENT_DISABLE;
    config.dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE;
    config.src_burst_count = DMA_BURST_INCR1;
    config.dst_burst_count = DMA_BURST_INCR1;
    config.src_width = DMA_DATA_WIDTH_32BIT;
    config.dst_width = DMA_DATA_WIDTH_32BIT;
    bflb_dma_channel_init(dma0_ch0, &config);

    bflb_dma_channel_irq_attach(dma0_ch0, dma0_ch0_isr, NULL);

    static struct bflb_dma_channel_lli_pool_s lli[20]; /* max trasnfer size 4064 * 20 */
    static struct bflb_dma_channel_lli_transfer_s transfers[2];

    transfers[0].src_addr = (uint32_t)DMA_ADDR_ADC_RDR;
    transfers[0].dst_addr = (uint32_t)adc_raw_data[0];
    transfers[0].nbytes = sizeof(adc_raw_data[0]);

    transfers[1].src_addr = (uint32_t)DMA_ADDR_ADC_RDR;
    transfers[1].dst_addr = (uint32_t)adc_raw_data[1];
    transfers[1].nbytes = sizeof(adc_raw_data[1]);

    int used_count = bflb_dma_channel_lli_reload(dma0_ch0, lli, 20, transfers, 2);
    bflb_dma_channel_lli_link_head(dma0_ch0, lli, used_count);
    bflb_dma_channel_start(dma0_ch0);

    // bflb_adc_start_conversion(adc);

    bflb_adc_stop_conversion(adc);
}

L1 cache

1
#include "bflb_l1c.h"
Licensed under CC BY-NC-SA 4.0