本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发
在适配UART硬件时,先学习Aworks UART编程的接口,查看Aworks提供的测试demo,才知道其导出什么样的接口供应用层使用。只要在注册UART时,确认其对应的串口的COMID号,编程起来就很轻松了。
1. 首先阅读原理图
2. 设备资源及驱动适配
2.1 设备资源的注册
其设备资源在awbl_hwconf_imx1050_lpuart6.h注册
所以需要先确认硬件设计上对应的UART引脚,GPIO1_2和GPIO1_3当作UART6使用,在如下函数当中设置即可。
aw_local void __imx1050_lpuart6_plat_init (void)
{
aw_clk_enable(IMX1050_CLK_CG_LPUART6);
int lpuart6_gpios[] = {GPIO1_2, GPIO1_3};
if (aw_gpio_pin_request("lpuart6_gpios",
lpuart6_gpios,
AW_NELEMENTS(lpuart6_gpios)) == AW_OK) {
}
aw_gpio_pin_cfg(GPIO1_2, GPIO1_2_LPUART6_TX);
aw_gpio_pin_cfg(GPIO1_3, GPIO1_3_LPUART6_RX);
}
2.2 设备驱动的注册
在aw_prj_config.c文件当中
#ifdef AW_DRV_IMX1050_LPUART
awbl_imx10xx_lpuart_drv_register();
#endif
2.3 设备宏开关
在aw_prj_param_auto_cfg.h文件当中,AW_DEV_IMX1050_LPUART6 如果被定义之后,对应的宏AW_DRV_IMX1050_LPUART就会被定义,UART驱动就会被注册。所以我们只需要在aw_prj_params.h中打开如下宏. 至此BSP适配完毕,可以通过Awork标准接口进行访问。
aw_prj_params.h
AW_DEV_IMX1050_LPUART6
aw_prj_param_auto_cfg.h
/**
*
ame LPUART
* @{
*/
#if defined AW_DEV_IMX1050_LPUART1 ||
defined AW_DEV_IMX1050_LPUART2 ||
defined AW_DEV_IMX1050_LPUART3 ||
defined AW_DEV_IMX1050_LPUART4 ||
defined AW_DEV_IMX1050_LPUART5 ||
defined AW_DEV_IMX1050_LPUART6 ||
defined AW_DEV_IMX1050_LPUART7 ||
defined AW_DEV_IMX1050_LPUART8
#ifndef AW_COM_SERIAL
#define AW_COM_SERIAL
#endif
#define AW_DRV_IMX1050_LPUART
#endif
/** @} */
3. 如何测式
#include "aworks.h"
#include "aw_delay.h"
#include "aw_serial.h"
#include "aw_ioctl.h"
#define TEST_SERIAL_NUM COM4
/**
* rief 串口 demo
*
eturn 无
*/
aw_local void* __task_handle (void *parg)
{
char buf[32];
int len = 0;
struct aw_serial_dcb dcb;
aw_err_t ret;
struct aw_serial_timeout timeout;
/* 获取dcb的默认配置 */
ret = aw_serial_dcb_get(TEST_SERIAL_NUM, &dcb);
if (AW_OK != ret) {
return 0;
}
/* 配置串口波特率为115200,8个数据位,1位停止位,无奇偶校验 */
dcb.baud_rate = 115200;
dcb.byte_size = 8;
dcb.stop_bits = AW_SERIAL_ONESTOPBIT;
dcb.f_parity = AW_FALSE;
ret = aw_serial_dcb_set(TEST_SERIAL_NUM, &dcb);
if (AW_OK != ret) {
return 0;
}
/* 配置串口超时 */
ret = aw_serial_timeout_get(TEST_SERIAL_NUM, &timeout);
if (AW_OK != ret) {
return 0;
}
timeout.rd_timeout = 1000; /* 读总超时为1s */
timeout.rd_interval_timeout = 50; /* 码间超时为50ms */
ret = aw_serial_timeout_set(TEST_SERIAL_NUM, &timeout);
if (AW_OK != ret) {
return 0;
}
/* 收到什么数据就发送什么数据 */
AW_FOREVER {
/* 读取数据 */
len = aw_serial_read(TEST_SERIAL_NUM, buf, sizeof(buf));
if (len > 0) {
aw_serial_write(TEST_SERIAL_NUM, buf, len);
}
}
return 0;
}
4. 总结
此次针对UART的配置非常的简单,上层的接口简单易用。前提条件还是得学习Aworks的框架。需要注意的就是注册串口时,其应对的COMID.