目录
Ⅰ、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);
PHY6222-simpleBLEPeripheral的基本介绍[蓝牙篇]
1、串口的开发思路
串口也是基础外设,很多模块中都有此外设。如果曾使用别的包含串口的模块,用通俗的说法描述就是,换汤不换药。开发思路:①串口初始化 ②编写串口中断回调函数 ③对数据进行处理
2、关于中断函数、中断回调函数的个人理解
此处简单说一下我对中断函数以及中断回调函数的理解。最开始接触的是标准库的中断函数,直接在中断函数处理部分代码(中断函数中不宜处理过多代码,容易对程序整体运行造成影响)。然后接触了HAL库,在HAL库中有中断回调函数,起初我认为中断函数、中断回调函数本质是一样的,都是处理中断事件,那为什么需要写两个函数呢?现在我逐渐明白,中断函数包含在底层驱动当中,一般是封装起来的,而中断回调函数相当于中断函数引申出来的一个接口,用户可以依据需求,在中断回调函数里面处理事件。不轻易去修改底层驱动函数,可提高程序的可移植性。
3、串口uart的基本介绍
①相关函数介绍
Ⅰ、i
nt 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 );//触发事件
}
Ⅲ、对数据进行处理
此处我所实现的基础功能是:判断包内是否有正确数据,并进行解析。
- 多包完整数据
- 包前有异常数据
- 包尾有异常数据
- 多包数据之间有异常数据
- 带有头的异常数据
4、总结
随着开发的模块越多,对基础的外设了解越来越深刻。期间也面临了不少的问题,但随着问题的解决,突然有种豁然开朗的感觉,正如前文所说对中断函数、中断回调函数的理解一般,形成了一个闭环,似乎在与平行时空的自己对话。
如果这篇文章,你看到了这里,感谢与你的相遇。文章有什么问题,表述不清楚的,还请批评指正!