高级会员
- 积分
- 985
- 金钱
- 985
- 注册时间
- 2017-8-11
- 在线时间
- 136 小时
|
有几个月没上论坛逛逛了,刚好最近刚完成了一个项目,用的是HAL库,同时搭载FreeRTOS系统
本人用的是STM32CubeMX来构建工程的,如果是用HAL库,基本用这个软件去构建工程,通用性强,便捷,其实主要是代码规范化
在这里,不得不吐槽一下,STM32CubeMX里用HAL库如果是运用在串口接收这一块,用官方的demo,收发的串口中断方式函数需要填入长度
那问题来了,在接收过程中,我哪知道接收到多长的数据,毕竟长度未知,所以只能选择DMA串口收发方式了
然而,网上在基于HAL库的DMA中断收发的资料是真的少(因为HAL库的DMA串口收发,是真的鸡肋,个人感觉用以前的标准库会顺手多了.......)
我是参考这个大牛去自己修改了一个demo
https://blog.csdn.net/youmeichifan/article/details/51750435
主函数功能:把接收到的数据,打印出来。用的是串口2
[mw_shl_code=applescript,true] while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin); //闪烁运行红灯
if(UsartType2.receive_flag)//如果产生了空闲中断
{
UsartType2.receive_flag=0;//清零标记
Usart2SendData_DMA(UsartType2.usartDMA_rxBuf,UsartType2.rx_len);//串口打印收到的数据0。
}
HAL_Delay(300);
}[/mw_shl_code]
如果想发送的话,可以添加以下
[mw_shl_code=applescript,true]UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart1_rx;
DMA_HandleTypeDef hdma_usart1_tx;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;
//串口1 DMA发送函数
void Usart1SendData_DMA(uint8_t *pdata, uint16_t Length)
{
while(UsartType1.dmaSend_flag == USART_DMA_SENDING);
UsartType1.dmaSend_flag = USART_DMA_SENDING;
HAL_UART_Transmit_DMA(&huart1, pdata, Length);
}
//串口2 DMA发送函数
void Usart2SendData_DMA(uint8_t *pdata, uint16_t Length)
{
while(UsartType2.dmaSend_flag == USART_DMA_SENDING);
UsartType2.dmaSend_flag = USART_DMA_SENDING;
HAL_UART_Transmit_DMA(&huart2, pdata, Length);
}
[/mw_shl_code]
在串口接收中断的回调函数中,可以进行数据解析处理或者打印,看个人需求吧
|
|