STM32串口USART用法的进阶(HAL库版本)

基础发送:

uint8_t ch=0xAb;//1

uint8_t aRxBuffer[]="hello GKoSon ";//2

HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);//3

HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);//4

此后不再讨论发送,毕竟这个不是重难点,接受才是。

基础接受:

//HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);//可以发也可以不发 //HAL_UART_Transmit_IT(&huart1, (uint8_t *)aRxBuffer, sizeof(aRxBuffer));//可以发也可以不发 HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10);//必须有这句话,貌似用了里面的代码,使能了中断!

重写接受函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{
    HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);

}

此时问题:1只能接受一次,以后中断不来了。2必须接受10个数才能进中断

优化如下:1每次接收以后再次开启接收中断,这样下次还可以进来啦 2修改为1个数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 1,0xFFFF); HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1); }

DMA版本:

#define RECEIVELEN 100 uint8_t usartDMA_rxBuf[RECEIVELEN];

HAL_UART_Receive_DMA(&huart1, usartDMA_rxBuf, RECEIVELEN); /*使能DMA接收*/

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); /*使能串口空闲中断*/

现在上电就没有提示了,可以自己写个发送玩玩

第二句是打开空闲中断

it.c里面找到

void USART1_IRQHandler(void)

{

UsartReceive_IDLE(&huart1);//自己添加一个函数,这就是中断,搬完以后,空闲中断 自己完成它

  HAL_UART_IRQHandler(&huart1);
}

void UsartReceive_IDLE(UART_HandleTypeDef *huart) { uint32_t temp; if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET)) { __HAL_UART_CLEAR_IDLEFLAG(&huart1); HAL_UART_DMAStop(&huart1); temp = huart1.hdmarx->Instance->CNDTR; rx_len = RECEIVELEN - temp; HAL_UART_Receive_DMA(&huart1,usartDMA_rxBuf,RECEIVELEN); HAL_UART_Transmit(&huart1, (uint8_t *)usartDMA_rxBuf, 10,0xFFFF);//4 收到就发挥了了 }

}

代码:https://pan.baidu.com/s/1Lon6RrSZH0NagypjbAeQRw

BBS的比较复杂,接收发送都是DMA

经验分享 程序员 微信小程序 职场和发展