mirror of
https://github.com/Fishwaldo/bl_mcu_sdk.git
synced 2025-07-17 02:08:36 +00:00
[feat] update peripheral api and demo
This commit is contained in:
parent
658b0761db
commit
a11dcbed30
341 changed files with 26075 additions and 2575 deletions
|
@ -0,0 +1,143 @@
|
|||
ADC - 按键检测电压
|
||||
====================
|
||||
|
||||
本demo基于ADC,使用按键的方式检测外部输入引脚的电压值。
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
本demo基于BL706_AVB开发板:
|
||||
|
||||
::
|
||||
|
||||
GPIO function GPIO pin
|
||||
----------------------------------
|
||||
ADC CH8 <--> GPIO18
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
- 软件代码见 ``examples/adc/adc_key``
|
||||
|
||||
- ``ADC`` 设备的时钟源由板级描述文件 ``bsp/board/bl706_iot/clock_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_ADC_CLOCK_SOURCE ROOT_CLOCK_SOURCE_XCLK
|
||||
#define BSP_ADC_CLOCK_DIV 0
|
||||
|
||||
- ``ADC`` 设备的复用引脚由板级描述文件 ``bsp/board/bl706_iot/pinmux_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define CONFIG_GPIO18_FUNC GPIO_FUN_ADC
|
||||
|
||||
- ``ADC`` 设备配置由板级描述文件 ``bsp/board/bl706_iot/peripheral_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_USING_ADC0
|
||||
|
||||
#if defined(BSP_USING_ADC0)
|
||||
#ifndef ADC0_CONFIG
|
||||
#define ADC0_CONFIG \
|
||||
{ \
|
||||
.clk_div = ADC_CLOCK_DIV_32,\
|
||||
.vref = ADC_VREF_3P2V,\
|
||||
.continuous_conv_mode = DISABLE,\
|
||||
.differential_mode = DISABLE,\
|
||||
.data_width = ADC_DATA_WIDTH_16B_WITH_256_AVERAGE,\
|
||||
.fifo_threshold = ADC_FIFO_THRESHOLD_1BYTE,\
|
||||
.gain = ADC_GAIN_1\
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
adc_channel_cfg_t adc_channel_cfg;
|
||||
adc_channel_cfg.pos_channel = posChList;
|
||||
adc_channel_cfg.neg_channel = negChList;
|
||||
|
||||
adc_register(ADC0_INDEX, "adc_key", DEVICE_OFLAG_STREAM_RX);
|
||||
|
||||
adc_key = device_find("adc_key");
|
||||
|
||||
if(adc_key)
|
||||
{
|
||||
ADC_DEV(adc_key)->continuous_conv_mode = ENABLE;
|
||||
device_open(adc_key, DEVICE_OFLAG_STREAM_RX);
|
||||
device_control(adc_key,DEVICE_CTRL_ADC_CHANNEL_CONFIG,&adc_channel_cfg);
|
||||
|
||||
}else{
|
||||
MSG("device open failed\r\n");
|
||||
}
|
||||
|
||||
adc_channel_start(adc_key);
|
||||
|
||||
- 首先调用 ``adc_register`` 函数注册 ``adc_key`` 设备,当前注册为ADC0
|
||||
- 然后通过 ``find`` 函数找到设备对应的句柄,保存于 ``adc_key`` 句柄中
|
||||
- 然后使用 ``device_open`` 以轮询模式来打开 ``adc_key`` 设备,调用 ``device_control`` 完成ADC相关的配置
|
||||
- 最后调用 ``adc_channel_start`` 启用ADC的转换
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
device_read(adc_key,0,(void *)&result_val,1);
|
||||
keyValue = get_adc_key_value(result_val.volt * 1000);
|
||||
if( keyValue!=KEY_NO_VALUE){
|
||||
|
||||
MSG("key %d pressed\r\n",keyValue);
|
||||
MSG("result_val.volt: %0.2f mv\n", (result_val.volt * 1000));
|
||||
}
|
||||
|
||||
- 调用 ``device_read`` 读取 ``adc_key`` 设备信息保存到 ``result_val`` 结构体中
|
||||
- 调用 ``get_adc_key_value`` 函数获取当前的键值和电压值
|
||||
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
- **CDK工具编译**
|
||||
|
||||
打开项目中提供的工程文件:adc_key.cdkproj
|
||||
|
||||
参照 :ref:`windows_cdk_quick_start` 的步骤编译下载即可
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_avb APP=adc_key
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
本实验依次按下开发板上的SW1 ~ SW5会得到不同的电压值:
|
||||
|
||||
- key 0: 0V左右
|
||||
- key 1: 0.1V左右
|
||||
- key 2: 0.2V左右
|
||||
- key 3: 0.3V左右
|
||||
- key 4: 0.43V左右
|
||||
|
||||
实际运行结果如下图所示:
|
||||
|
||||
.. figure:: img/adc_key_result.png
|
||||
|
||||
|
||||
见视频展示:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<iframe src="//player.bilibili.com/player.html?aid=887712205&bvid=BV1xK4y1P7ur&cid=330261457&page=5" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
GPIO 输出 - 流水灯
|
||||
====================
|
||||
|
||||
本demo基于GPIO外设的输出模式编写。
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
本 demo 基于BL706_IOT开发板,连接方式如下
|
||||
|
||||
::
|
||||
|
||||
GPIO function GPIO pin
|
||||
----------------------------------
|
||||
D0 <--> GPIO22
|
||||
D1 <--> GPIO29
|
||||
D2 <--> GPIO30
|
||||
D3 <--> GPIO31
|
||||
|
||||
|
||||
.. figure:: img/blink_breath_sch.png
|
||||
:alt:
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
- 软件代码见 ``examples/gpio/gpio_blink``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
gpio_set_mode(GPIO_PIN_22, GPIO_OUTPUT_PP_MODE);
|
||||
gpio_set_mode(GPIO_PIN_29, GPIO_OUTPUT_PP_MODE);
|
||||
gpio_set_mode(GPIO_PIN_30, GPIO_OUTPUT_PP_MODE);
|
||||
gpio_set_mode(GPIO_PIN_31, GPIO_OUTPUT_PP_MODE);
|
||||
|
||||
- 使用上述代码将 ``GPIO22`` ``GPIO29`` ``GPIO30`` ``GPIO31`` 配置为输出上拉模式。
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
gpio_write(GPIO_PIN_22, 0);
|
||||
|
||||
- 使用上述代码修改输出的电平值。
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
- **CDK 编译**
|
||||
|
||||
打开项目中提供的工程文件:gpio_blink.cdkproj
|
||||
|
||||
参照 :ref:`windows_cdk_quick_start` 的步骤编译下载即可
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_iot APP=gpio_blink
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
见视频展示:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<iframe src="//player.bilibili.com/player.html?aid=887712205&bvid=BV1xK4y1P7ur&cid=326226616&page=3" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
|
|
@ -0,0 +1,110 @@
|
|||
PWM - 呼吸灯
|
||||
====================
|
||||
|
||||
本demo基于PWM外设轮询模式编写。
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
本 demo 基于BL706_IOT开发板,连接方式如下
|
||||
|
||||
::
|
||||
|
||||
GPIO function GPIO pin
|
||||
----------------------------------
|
||||
PWM_CH2 <--> GPIO22
|
||||
|
||||
.. figure:: img/blink_breath_sch.png
|
||||
:alt:
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
- 软件代码见 ``examples/pwm/pwm_breath_led``
|
||||
|
||||
- ``PWM`` 复用引脚由板级描述文件 ``bsp/board/bl706_iot/pinmux_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define CONFIG_GPIO22_FUNC GPIO_FUN_PWM
|
||||
|
||||
- ``PWM`` 设备配置由板级描述文件 ``bsp/board/bl706_iot/peripheral_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_USING_PWM_CH2
|
||||
|
||||
#if defined(BSP_USING_PWM_CH2)
|
||||
#ifndef PWM_CH2_CONFIG
|
||||
#define PWM_CH2_CONFIG \
|
||||
{ \
|
||||
.ch = 2, \
|
||||
.frequency = 1000000, \
|
||||
.dutycycle = 0, \
|
||||
.it_pulse_count = 0,\
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
pwm_register(PWM_CH2_INDEX, "led_breath", DEVICE_OFLAG_RDWR);
|
||||
|
||||
struct device *led_breath = device_find("led_breath");
|
||||
|
||||
if (led_breath)
|
||||
{
|
||||
device_open(led_breath, DEVICE_OFLAG_STREAM_TX);
|
||||
pwm_channel_start(led_breath);
|
||||
}
|
||||
|
||||
|
||||
- 首先调用 ``pwm_register`` 函数注册 ``PWM`` 设备的一个通道,当前注册 ``PWM_CH2``
|
||||
- 然后通过 ``find`` 函数找到设备对应的句柄,保存于 ``led_breath`` 句柄中
|
||||
- 使用 ``device_open`` 以轮询模式来打开 ``led_breath`` 设备
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
pwm_config_t pwm_cfg = {
|
||||
1000000,
|
||||
0,
|
||||
};
|
||||
|
||||
device_control(led_breath, DEVICE_CTRL_CONFIG, &pwm_cfg);
|
||||
|
||||
- 使用 ``device_contorl`` 函数,配合 ``DEVICE_CTRL_CONFIG`` 指令,可以修改当前PWM通道的频率和占空比。
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
- **CDK 编译**
|
||||
|
||||
打开项目中提供的工程文件:pwm_breath_led.cdkproj
|
||||
|
||||
参照 :ref:`windows_cdk_quick_start` 的步骤编译下载即可
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_iot APP=pwm_breath_led
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
见视频展示:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<iframe src="//player.bilibili.com/player.html?aid=887712205&bvid=BV1xK4y1P7ur&cid=326227924&page=4" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
|
|
@ -0,0 +1,64 @@
|
|||
GPIO 中断 - 按键检测
|
||||
====================
|
||||
|
||||
本demo基于GPIO外设外部中断模式编写。
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
本 demo 基于BL706_IOT开发板,自行添加按键电路,连接方式如下
|
||||
|
||||
::
|
||||
|
||||
GPIO function GPIO pin
|
||||
----------------------------------
|
||||
SW1 <--> GPIO11
|
||||
|
||||
.. figure:: img/button_sch.png
|
||||
:alt:
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
- 软件代码见 ``examples/gpio/gpio_int``
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
static void gpio11_int_callback(uint32_t pin)
|
||||
{
|
||||
MSG("gpio rising trigger !\r\n");
|
||||
}
|
||||
|
||||
gpio_set_mode(GPIO_PIN_11,GPIO_SYNC_RISING_TRIGER_INT_MODE);
|
||||
gpio_attach_irq(GPIO_PIN_11,gpio11_int_callback);
|
||||
gpio_irq_enable(GPIO_PIN_11,ENABLE);
|
||||
|
||||
- 使用上述代码将 ``GPIO11`` 配置为GPIO上升沿中断触发模式,并注册中断回调函数。
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
- **CDK 编译**
|
||||
|
||||
打开项目中提供的工程文件:gpio_int.cdkproj
|
||||
|
||||
参照 :ref:`windows_cdk_quick_start` 的步骤编译下载即可
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_iot APP=gpio_int
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
当按键按下时,串口会打印 ``"gpio rising trigger !"``
|
|
@ -0,0 +1,113 @@
|
|||
DMA - RAM间数据搬运
|
||||
====================
|
||||
|
||||
本demo基于DMA,方向为memory to memory 模式,进行数据的搬运。
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
无
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
- 软件代码见 ``examples/dma/dma_m2m``
|
||||
|
||||
- ``DMA`` 设备配置由板级描述文件 ``bsp/board/bl706_iot/peripheral_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_USING_DMA0_CH0
|
||||
|
||||
#if defined(BSP_USING_DMA0_CH0)
|
||||
#ifndef DMA0_CH0_CONFIG
|
||||
#define DMA0_CH0_CONFIG \
|
||||
{ \
|
||||
.id = 0, \
|
||||
.ch = 0,\
|
||||
.direction = DMA_MEMORY_TO_MEMORY,\
|
||||
.transfer_mode = DMA_LLI_ONCE_MODE, \
|
||||
.src_req = DMA_REQUEST_NONE, \
|
||||
.dst_req = DMA_REQUEST_NONE, \
|
||||
.src_width = DMA_TRANSFER_WIDTH_32BIT , \
|
||||
.dst_width = DMA_TRANSFER_WIDTH_32BIT , \
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
dma_register(DMA0_CH0_INDEX, "DMA", DEVICE_OFLAG_RDWR);
|
||||
|
||||
struct device *dma = device_find("DMA");
|
||||
|
||||
if (dma)
|
||||
{
|
||||
device_open(dma, 0);
|
||||
device_set_callback(dma, dma_transfer_done);
|
||||
device_control(dma, DEVICE_CTRL_SET_INT, NULL);
|
||||
}
|
||||
|
||||
- 首先调用 ``dma_register`` 函数注册 ``DMA`` 设备的一个通道,当前注册 ``DMA_CH0``
|
||||
- 然后通过 ``find`` 函数找到设备对应的句柄,保存于 ``dma`` 句柄中
|
||||
- 最后使用 ``device_open`` 以默认模式来打开 ``dma`` 设备,调用 ``device_set_callback`` 注册一个dma通道0中断回调函数,调用 ``device_control`` 开启dma传输完成中断
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
dma_reload(dma,(uint32_t)dma_src_buffer,(uint32_t)dma_dst_buffer,8000);
|
||||
dma_channel_start(dma);
|
||||
|
||||
- 调用 ``dma_reload`` 函数对dma 通道0的配置进行补充,``DMA0_CH0_CONFIG`` 中已经补充了一部分配置,这边主要补充源数据地址和目标数据地址以及传输总长度
|
||||
- 调用 ``dma_channel_start`` 开启dma传输
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
void dma_transfer_done(struct device *dev, void *args, uint32_t size, uint32_t state)
|
||||
{
|
||||
uint32_t index=0;
|
||||
|
||||
if(!state)
|
||||
{
|
||||
MSG("dma transfer task done\r\n");
|
||||
|
||||
for(index=0;index<8000;index++){
|
||||
if(dma_dst_buffer[index]!=0xff){
|
||||
MSG("dma transfer error\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
MSG("dma transfer success\r\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
- 在中断函数中判断数据传输是否正确
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
- **CDK 编译**
|
||||
|
||||
打开项目中提供的工程文件:dma_m2m.cdkproj
|
||||
|
||||
参照 :ref:`windows_cdk_quick_start` 的步骤编译下载即可
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_iot APP=dma_m2m
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
``dma_src_buffer`` 数组中的数据通过DMA 通道0 ,以源32位宽、目标32位宽传输到 ``dma_dst_buffer`` 数组中,数据传输完成并完整,串口打印 ``dma transfer success``。
|
|
@ -0,0 +1,117 @@
|
|||
I2C - AT24CXX 读写
|
||||
====================
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
本 demo 基于BL706_IOT开发板,自行添加 AT24CXX 电路,连接方式如下
|
||||
|
||||
::
|
||||
|
||||
GPIO function GPIO pin
|
||||
----------------------------------
|
||||
I2C_SCL <--> GPIO11
|
||||
I2C_SDA <--> GPIO16
|
||||
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
- 软件代码见 ``examples/i2c/i2c_at24cxx``
|
||||
|
||||
- ``I2C`` 设备的时钟源由板级描述文件 ``bsp/board/bl706_iot/clock_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_I2C_CLOCK_SOURCE ROOT_CLOCK_SOURCE_BCLK
|
||||
#define BSP_I2C_CLOCK_DIV 0
|
||||
|
||||
- ``I2C`` 设备的复用引脚由板级描述文件 ``bsp/board/bl706_iot/pinmux_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define CONFIG_GPIO11_FUNC GPIO_FUN_I2C
|
||||
#define CONFIG_GPIO16_FUNC GPIO_FUN_I2C
|
||||
|
||||
|
||||
- ``I2C`` 设备配置由板级描述文件 ``bsp/board/bl706_iot/peripheral_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_USING_I2C0
|
||||
|
||||
#if defined(BSP_USING_I2C0)
|
||||
#ifndef I2C0_CONFIG
|
||||
#define I2C0_CONFIG \
|
||||
{ \
|
||||
.id = 0, \
|
||||
.mode = I2C_HW_MODE,\
|
||||
.phase = 15, \
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
i2c_register(I2C0_INDEX, "i2c", DEVICE_OFLAG_RDWR);
|
||||
struct device *i2c0 = device_find("i2c");
|
||||
|
||||
if (i2c0)
|
||||
{
|
||||
MSG("device find success\r\n");
|
||||
device_open(i2c0, 0);
|
||||
}
|
||||
|
||||
- 首先调用 ``i2c_register`` 函数注册 ``I2C`` 设备,当前注册 ``I2C0``
|
||||
- 然后通过 ``find`` 函数找到设备对应的句柄,保存于 ``i2c0`` 句柄中
|
||||
- 最后使用 ``device_open`` 以默认模式来打开 ``I2C0`` 设备
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
i2c_msg_t msg[2];
|
||||
uint8_t buf[8] = {0};
|
||||
|
||||
msg[0].buf = buf;
|
||||
msg[0].flags = SUB_ADDR_1BYTE | I2C_WR;
|
||||
msg[0].len = 8;
|
||||
msg[0].slaveaddr = 0x50;
|
||||
msg[0].subaddr = 0x00;
|
||||
|
||||
msg[1].buf = buf;
|
||||
msg[1].flags = SUB_ADDR_1BYTE | I2C_RD;
|
||||
msg[1].len = 8;
|
||||
msg[1].slaveaddr = 0x50;
|
||||
msg[1].subaddr = 0x00;
|
||||
if (i2c_transfer(i2c0, &msg[0], 2) == 0)
|
||||
MSG("\r\n read:%0x\r\n", msg[1].buf[0] << 8 | msg[1].buf[1]);
|
||||
|
||||
- 调用 ``i2c_transfer`` 传输两个 ``msg``,一个 ``msg`` 代表向 eeprom 写入8字节数据,一个 ``msg`` 代表从 eeprom 读取8字节数据,
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
- **CDK 编译**
|
||||
|
||||
打开项目中提供的工程文件:i2c_at24cxx.cdkproj
|
||||
|
||||
参照 :ref:`windows_cdk_quick_start` 的步骤编译下载即可
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_iot APP=i2c_at24cxx
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
Binary file not shown.
After Width: | Height: | Size: 8.3 KiB |
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
|
@ -0,0 +1,55 @@
|
|||
MTIMER - 内核定时器
|
||||
====================
|
||||
|
||||
本demo基于 risc-v 内核自带的一个64位定时器(MTIMER)编写。MTIMER最大可以定时500年,本demo可以为后面os tick提供参考。
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
无
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
- 软件代码见 ``examples/systick``
|
||||
|
||||
- ``mtimer`` 时钟默认经过分频以后为 1M,方便后面使用,减少计算时间。
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
void systick_isr()
|
||||
{
|
||||
static uint32_t tick=0;
|
||||
tick++;
|
||||
MSG("tick:%d\r\n",tick);
|
||||
}
|
||||
|
||||
bflb_platform_set_alarm_time(1000000,systick_isr);
|
||||
|
||||
- 使用上述代码设置mtimer定时时间为1s,并且注册中断回调函数。
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
- **CDK 编译**
|
||||
|
||||
打开项目中提供的工程文件:systick.cdkproj
|
||||
|
||||
参照 :ref:`windows_cdk_quick_start` 的步骤编译下载即可
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_iot APP=systick
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
``tick`` 值每秒自增1并通过串口打印。
|
|
@ -0,0 +1,145 @@
|
|||
SPI - TFT LCD 显示
|
||||
====================
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
本 demo 基于BL706_AVB开发板,**其中 MISO 和MOSI 默认进行了调换**,连接方式如下
|
||||
|
||||
::
|
||||
|
||||
GPIO function GPIO pin
|
||||
----------------------------------
|
||||
LCD_CS <--> GPIO10
|
||||
LCD_DC <--> GPIO22
|
||||
SPI_SCK <--> GPIO19
|
||||
SPI_MISO <--> GPIO20
|
||||
SPI_MOSI <--> GPIO21
|
||||
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
- 软件代码见 ``examples/spi/spi_lcd``
|
||||
|
||||
- ``SPI`` 设备的时钟源由板级描述文件 ``bsp/board/bl706_avb/clock_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_SPI_CLOCK_SOURCE ROOT_CLOCK_SOURCE_BCLK
|
||||
#define BSP_SPI_CLOCK_DIV 0
|
||||
|
||||
- ``SPI`` 设备的复用引脚由板级描述文件 ``bsp/board/bl706_avb/pinmux_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define CONFIG_GPIO19_FUNC GPIO_FUN_SPI
|
||||
#define CONFIG_GPIO20_FUNC GPIO_FUN_SPI
|
||||
#define CONFIG_GPIO21_FUNC GPIO_FUN_SPI
|
||||
|
||||
|
||||
- ``SPI`` 设备配置由板级描述文件 ``bsp/board/bl706_avb/peripheral_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_USING_SPI0
|
||||
|
||||
#if defined(BSP_USING_SPI0)
|
||||
#ifndef SPI0_CONFIG
|
||||
#define SPI0_CONFIG \
|
||||
{ \
|
||||
.id = 0, \
|
||||
.clk = 36000000,\
|
||||
.mode = SPI_MASTER_MODE, \
|
||||
.direction = SPI_MSB_BYTE0_DIRECTION_FIRST, \
|
||||
.clk_polaraity = SPI_POLARITY_LOW, \
|
||||
.clk_phase = SPI_PHASE_1EDGE, \
|
||||
.datasize = SPI_DATASIZE_8BIT, \
|
||||
.fifo_threshold = 4, \
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
gpio_set_mode(LCD_CS_PIN,GPIO_OUTPUT_MODE);
|
||||
gpio_set_mode(LCD_DC_PIN,GPIO_OUTPUT_MODE);
|
||||
gpio_write(LCD_CS_PIN,1); //CS1
|
||||
gpio_write(LCD_DC_PIN,1); //DC
|
||||
|
||||
spi0 = device_find("spi0");
|
||||
if(spi0)
|
||||
{
|
||||
device_close(spi0);
|
||||
}
|
||||
else{
|
||||
spi_register(SPI0_INDEX,"spi0",DEVICE_OFLAG_RDWR);
|
||||
spi0 = device_find("spi0");
|
||||
}
|
||||
if(spi0)
|
||||
{
|
||||
device_open(spi0,DEVICE_OFLAG_STREAM_TX|DEVICE_OFLAG_STREAM_RX);
|
||||
}
|
||||
|
||||
- 配置 ``LCD_CS`` 和 ``LCD_DC`` 引脚为输出模式并拉高
|
||||
- 调用 ``spi_register`` 函数注册 ``SPI`` 设备,当前注册 ``SPI0``
|
||||
- 然后通过 ``find`` 函数找到设备对应的句柄,保存于 ``spi0`` 句柄中
|
||||
- 最后使用 ``device_open`` 以轮询发送模式来打开 ``spi0`` 设备
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
void LCD_WR_Byte(uint8_t data)
|
||||
{
|
||||
CS1_LOW;
|
||||
DC_HIGH;
|
||||
spi_transmit(spi0,&data,1,SPI_TRANSFER_TYPE_8BIT);
|
||||
CS1_HIGH;
|
||||
}
|
||||
|
||||
void LCD_WR_HalfWord(uint16_t data)
|
||||
{
|
||||
CS1_LOW;
|
||||
DC_HIGH;
|
||||
spi_transmit(spi0,&data,1,SPI_TRANSFER_TYPE_16BIT);
|
||||
CS1_HIGH;
|
||||
}
|
||||
|
||||
void LCD_WR_Word(uint32_t data)
|
||||
{
|
||||
CS1_LOW;
|
||||
DC_HIGH;
|
||||
spi_transmit(spi0,&data,1,SPI_TRANSFER_TYPE_32BIT);
|
||||
CS1_HIGH;
|
||||
}
|
||||
|
||||
- 为 LCD 显示驱动提供接口
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
- **CDK 编译**
|
||||
|
||||
打开项目中提供的工程文件:spi_lcd.cdkproj
|
||||
|
||||
参照 :ref:`windows_cdk_quick_start` 的步骤编译下载即可
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_avb APP=spi_lcd
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
|
@ -0,0 +1,151 @@
|
|||
UART - 数据自收发
|
||||
====================
|
||||
|
||||
本demo基于 UART 外设轮询发送、接收FIFO中断模式编写。
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
本 demo 基于BL706_IOT开发板,连接方式如下
|
||||
|
||||
::
|
||||
|
||||
GPIO function GPIO pin
|
||||
----------------------------------
|
||||
UART0_TX <--> GPIO14
|
||||
UART0_RX <--> GPIO15
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
- 软件代码见 ``examples/uart/uart_echo``
|
||||
|
||||
- ``UART`` 设备的时钟源由板级描述文件 ``bsp/board/bl706_iot/clock_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_UART_CLOCK_SOURCE ROOT_CLOCK_SOURCE_PLL_96M
|
||||
#define BSP_UART_CLOCK_DIV 0
|
||||
|
||||
- ``UART`` 设备的复用引脚由板级描述文件 ``bsp/board/bl706_iot/pinmux_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define CONFIG_GPIO14_FUNC GPIO_FUN_UART0_TX
|
||||
#define CONFIG_GPIO15_FUNC GPIO_FUN_UART0_RX
|
||||
|
||||
- ``UART`` 设备配置由板级描述文件 ``bsp/board/bl706_iot/peripheral_config.h`` 来配置
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
#define BSP_USING_UART0
|
||||
|
||||
#if defined(BSP_USING_UART0)
|
||||
#ifndef UART0_CONFIG
|
||||
#define UART0_CONFIG \
|
||||
{ \
|
||||
.id = 0, \
|
||||
.baudrate = 2000000,\
|
||||
.databits = UART_DATA_LEN_8, \
|
||||
.stopbits = UART_STOP_ONE, \
|
||||
.parity = UART_PAR_NONE, \
|
||||
.fifo_threshold = 1, \
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
bflb_platform_init();
|
||||
|
||||
- 在 ``bflb_platform_init`` 函数中,我们已经注册并且打开了一个调试用的串口设备,给用户实现一个 ``MSG`` 的基本功能用作打印输出报文。具体实现如下
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
uart_register(board_get_debug_uart_index(), "debug_log", DEVICE_OFLAG_RDWR);
|
||||
struct device *uart = device_find("debug_log");
|
||||
|
||||
if (uart)
|
||||
{
|
||||
device_open(uart, DEVICE_OFLAG_STREAM_TX | DEVICE_OFLAG_INT_RX);
|
||||
device_set_callback(uart, uart_iqr_callback);
|
||||
device_control(uart, DEVICE_CTRL_SET_INT, (void *)(UART_RX_FIFO_IT));
|
||||
}
|
||||
|
||||
- 首先调用 ``uart_register`` 函数注册 ``UART`` 设备,当前注册 ``UART0``
|
||||
- 然后通过 ``find`` 函数找到设备对应的句柄,保存于 ``uart`` 句柄中
|
||||
- 最后使用 ``device_open`` 以轮询发送和中断接收来打开 ``uart`` 设备,调用 ``device_set_callback`` 注册一个 ``UART0`` 中断回调函数,调用 ``device_control`` 开启 ``UART RX FIFO`` 中断
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
if (uart)
|
||||
{
|
||||
device_set_callback(uart, uart_irq_callback);
|
||||
device_control(uart, DEVICE_CTRL_SET_INT, (void *)(UART_RX_FIFO_IT|UART_RTO_IT));
|
||||
}
|
||||
|
||||
- 通过 ``device_set_callback`` 函数,注册用户指定的中断服务函数。通过 ``device_control`` 函数打开 ``RX FIFO`` 和 ``RTO`` 中断
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
void uart_irq_callback(struct device *dev, void *args, uint32_t size, uint32_t state)
|
||||
{
|
||||
if (state == UART_EVENT_RX_FIFO)
|
||||
{
|
||||
device_write(dev,0,(uint8_t *)args,size);
|
||||
}
|
||||
else if (state == UART_EVENT_RTO)
|
||||
{
|
||||
device_write(dev,0,(uint8_t *)args,size);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- 此函数是示例的中断服务函数,作用是将接受到的数据原封不动的发送出去。
|
||||
|
||||
- ``state`` 会返回 ``UART`` 设备的中断类型
|
||||
- ``args`` 包含了返回数据指针
|
||||
- ``size`` 包含返回数据的长度
|
||||
- ``dev`` 为中断的 ``uart`` 设备句柄
|
||||
|
||||
- 当中断产生,将会调用 ``device_write`` 函数将接受到的数据发送回去。
|
||||
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
- **CDK 编译**
|
||||
|
||||
打开项目中提供的工程文件:uart_echo.cdkproj
|
||||
|
||||
参照 :ref:`windows_cdk_quick_start` 的步骤编译下载即可
|
||||
|
||||
- **命令行编译**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd <sdk_path>/bl_mcu_sdk
|
||||
$ make BOARD=bl706_iot APP=uart_echo
|
||||
|
||||
- **烧录**
|
||||
|
||||
详见 :ref:`bl_dev_cube`
|
||||
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
见视频展示:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<iframe src="//player.bilibili.com/player.html?aid=887712205&bvid=BV1xK4y1P7ur&cid=330261457&page=5" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue