PHY6222-串口的基本介绍[串口篇]

目录

1、串口的开发思路

2、关于函数、中断回调函数的个人理解

3、串口uart的基本介绍

①相关函数介绍

Ⅰ、int hal_uart_init(uart_Cfg_t cfg, UART_INDEX_e uart_index);

Ⅱ、int hal_uart_deinit(UART_INDEX_e uart_index);

Ⅲ、int hal_uart_set_tx_buf(UART_INDEX_e uart_index, uint8_t* buf, uint16_t size);

Ⅳ、int hal_uart_get_tx_ready(UART_INDEX_e uart_index);

Ⅴ、int hal_uart_send_buff(UART_INDEX_e uart_index, uint8_t* buff, uint16_t len);

Ⅵ、int hal_uart_send_byte(UART_INDEX_e uart_index, unsigned char data);

Ⅶ、int hal_uart_get_parity_plan(UART_INDEX_e uart_index);

Ⅷ、int hal_uart_set_parity_plan(UART_INDEX_e uart_index, bool even_parity);

②串口的基本实现

Ⅰ、串口的初始化

Ⅱ、串口的回调函数

Ⅲ、对数据进行处理

4、总结


奉微加PHY6222的代码烧录

PHY6222-simpleBLEPeripheral的基本介绍[蓝牙篇]

1、串口的开发思路

串口也是基础外设,很多模块中都有此外设。如果曾使用别的包含串口的模块,用通俗的说法描述就是,换汤不换药。开发思路:①串口初始化 ②编写串口中断回调函数 ③对数据进行处理 

2、关于函数、中断回调函数的个人理解

此处简单说一下我对中断函数以及中断回调函数的理解。最开始接触的是标准库的中断函数,直接在中断函数处理部分代码(中断函数中不宜处理过多代码,容易对程序整体运行造成影响)。然后接触了HAL库,在HAL库中有中断回调函数,起初我认为中断函数、中断回调函数本质是一样的,都是处理中断事件,那为什么需要写两个函数呢?现在我逐渐明白,中断函数包含在底层驱动当中,一般是封装起来的,而中断回调函数相当于中断函数引申出来的一个接口,用户可以依据需求,在中断回调函数里面处理事件。不轻易去修改底层驱动函数,可提高程序的可移植性

3、串口uart的基本介绍

①相关函数介绍

Ⅰ、int hal_uart_init(uart_Cfg_t cfg, UART_INDEX_e uart_index);

  • 功能:初始化UART配置。

  • 参数:
    • cfg:UART配置结构体。
    • uart_index:UART索引或标识符,指示要初始化的特定UART设备。
  • 返回值:整数,表示初始化成功或失败。

Ⅱ、int hal_uart_deinit(UART_INDEX_e uart_index);

  • 功能:反初始化(去初始化)UART设备。(可降低能耗)
  • 参数:
    • uart_index:UART索引或标识符,指示要去初始化的特定UART设备。
  • 返回值:整数,表示反初始化成功或失败。

Ⅲ、int hal_uart_set_tx_buf(UART_INDEX_e uart_index, uint8_t* buf, uint16_t size);

  • 功能:设置UART发送缓冲区。
  • 参数:
    • uart_index:UART索引或标识符,指示要设置的特定UART设备。
    • buf:指向发送缓冲区的指针。
    • size:发送缓冲区的大小。
  • 返回值:整数,表示设置操作成功或失败。

Ⅳ、int hal_uart_get_tx_ready(UART_INDEX_e uart_index);

  • 功能:获取UART发送准备就绪状态。
  • 参数:
    • uart_index:UART索引或标识符,指示要查询的特定UART设备。
  • 返回值:整数,表示发送准备就绪或未准备好。

Ⅴ、int hal_uart_send_buff(UART_INDEX_e uart_index, uint8_t* buff, uint16_t len);

  • 功能:发送数据到UART设备。
  • 参数:
    • uart_index:UART索引或标识符,指示要发送数据的特定UART设备。
    • buff:指向要发送数据的缓冲区的指针。
    • len:要发送的数据长度。
  • 返回值:整数,表示发送操作成功或失败。

Ⅵ、int hal_uart_send_byte(UART_INDEX_e uart_index, unsigned char data);

  • 功能:发送单个字节到UART设备。
  • 参数:
    • uart_index:UART索引或标识符,指示要发送数据的特定UART设备。
    • data:要发送的单个字节数据。
  • 返回值:整数,表示发送操作成功或失败。

Ⅶ、int hal_uart_get_parity_plan(UART_INDEX_e uart_index);

  • 功能:获取UART的奇偶校验方案。
  • 参数:
    • uart_index:UART索引或标识符,指示要查询的特定UART设备。
  • 返回值:整数,表示当前的奇偶校验方案。

Ⅷ、int hal_uart_set_parity_plan(UART_INDEX_e uart_index, bool even_parity);

  • 功能:设置UART的奇偶校验方案。
  • 参数:
    • uart_index:UART索引或标识符,指示要设置的特定UART设备。
    • even_parity:布尔值,表示是否设置为偶校验。
  • 返回值:整数,表示设置操作成功或失败。

②串口的基本实现

Ⅰ、串口的初始化

void dbg_uart_init(void)
{
    uart_Cfg_t cfg =
    {
        .tx_pin = P2,
        .rx_pin = P3,
        .rts_pin = GPIO_DUMMY,
        .cts_pin = GPIO_DUMMY,
        .baudrate = 115200,
        .use_fifo = TRUE,
        .hw_fwctrl = FALSE,
        .use_tx_buf = FALSE,
        .parity     = FALSE,
        .evt_handler =  recv_uart1_data,//串口回调函数
    };
    hal_uart_init(cfg, UART1);//uart init
}

Ⅱ、串口的回调函数

static void recv_uart1_data(uart_Evt_t* evt)
{	
	memcpy(DATA_X + flag_x,evt->data,evt->len);//复制数据
	
	LEN_X = evt->len + LEN_X;
	flag_x += evt->len;
	
//	测试使用的打印函数
//LOG("t:%d,l:%d\n",evt->type,evt->len);
	
	osal_set_event( messageBLEPeripheral_TaskID, SBP_ANALYSIS_MESSAGE_EVT );//触发事件
}

Ⅲ、对数据进行处理

此处我所实现的基础功能是:判断包内是否有正确数据,并进行解析。

  1. 多包完整数据
  2. 包前有异常数据
  3. 包尾有异常数据
  4. 多包数据之间有异常数据
  5. 带有头的异常数据

4、总结

        随着开发的模块越多,对基础的外设了解越来越深刻。期间也面临了不少的问题,但随着问题的解决,突然有种豁然开朗的感觉,正如前文所说对中断函数、中断回调函数的理解一般,形成了一个闭环,似乎在与平行时空的自己对话。

        如果这篇文章,你看到了这里,感谢与你的相遇。文章有什么问题,表述不清楚的,还请批评指正!

  • 18
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值