[feat] update peripheral api and demo

This commit is contained in:
jzlv 2021-06-04 17:40:12 +08:00
parent 658b0761db
commit a11dcbed30
341 changed files with 26075 additions and 2575 deletions

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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 !"``

View file

@ -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``

View file

@ -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

View file

@ -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并通过串口打印。

View file

@ -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`
实验现象
-----------------------------

View file

@ -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>