STM32-CubeIDE用串口通讯
USART串口通讯
一、轮询模式
1.设置所接引脚为UART异步模式
2.编写测试代码(自动发送hello world)




3.编写接收数据的代码

二、中断模式收发
1.打开URAT的中断功能,然后保存自动生成代码
2.使用中断发送数据
3.使用中断接收数据

- 将定义的数组改成全局变量
/* USER CODE BEGIN PV */
uint8_t receiveData[2];
/* USER CODE END PV */
- 复制回调函数到main.c文件中,重新定义回调函数
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
HAL_UART_Transmit_IT(&huart1, receiveData, 2);
GPIO_PinState state = GPIO_PIN_SET;
if (receiveData[1] == '1') {
state = GPIO_PIN_RESET;
if (receiveData[0] == 'L') {
HAL_GPIO_WritePin(GPIOB, LED_MCU_Pin, state);
}
}
if (receiveData[1] == '0') {
state = GPIO_PIN_SET;
if (receiveData[0] == 'L') {
HAL_GPIO_WritePin(GPIOB, LED_MCU_Pin, state);
}
}
HAL_UART_Receive_IT(&huart1, receiveData, 2); //每次执行完回调函数内容后,要继续为下次接收开启串口接收数据
}
/* USER CODE END 0 */
3.串口使用DMA模式接收发送数据
- 开启DMA功能。
- 将串口中断函数改成DMA函数,修改其后缀即可,其他不变。
- 下载调试发现程序正常,正常接收发送数据。
4.串口接收不定长数据
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));
/* 接收空闲中断,接收长度是最大长度。而不是接收数据的长度。可以设置为数组的长度。而数组的长度要尽量大。不至于溢出 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
if (huart == &huart1) { //判断触发的中断是哪个中断
HAL_UART_Transmit_DMA(huart, receiveData, Size); //将接收的数据发送回去
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData)); //重新启动接收函数
}
}
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));
/* 接收空闲中断,接收长度是最大长度。而不是接收数据的长度。可以设置为数组的长度。而数组的长度要尽量大。不至于溢出 */
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
5.蓝牙透传模块BT24
- BT24蓝牙透传模块可以通过串口收发数据,BT24蓝牙模块默认波特率为9600,所以需要将波特率设置为9600,手机可以下载DX-SMART这个APP连接蓝牙模块,并且进行数据的收发。
- 添加DMA通道:在 USART1 -> Configuration -> DMA Settings 标签卡中,点击 Add 按钮,分别添加 USART3_RX 和 USART3_TX 的 DMA 通道
- 使能串口中断:在 USART1 -> Configuration -> NVIC Settings 标签卡中,勾选 USART1 global interrupt 的 Enable
- 代码部分
/* USER CODE BEGIN PV */
uint8_t receiveData[50];
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData)); //通过DMA将数据接收并存到receiveData数组中
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT); //关闭DMA传输过半中断,只需要接收完成中断。
/* USER CODE END 2 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
if (huart == &huart1) {
HAL_UART_Transmit_DMA(&huart1, receiveData, Size);
if (receiveData[0] == 0xAA) {
if (receiveData[1] == Size) {
uint8_t sum = 0;
for (uint8_t i = 0; i < Size - 1; i++) {
sum = sum + receiveData[i];
}
if (sum == receiveData[Size - 1]) {
for (uint8_t i = 2; i < Size - 1; i += 2) {
GPIO_PinState state = GPIO_PIN_SET;
if (receiveData[i + 1] == 0x00) {
state = GPIO_PIN_RESET;
} else {
state = GPIO_PIN_SET;
}
if (receiveData[i] == 0x01) {
HAL_GPIO_WritePin(GPIOA, LED1_Pin, state);
} else if (receiveData[i] == 0x02) {
HAL_GPIO_WritePin(GPIOA, LED2_Pin, state);
} else if (receiveData[i] == 0x03) {
HAL_GPIO_WritePin(GPIOA, LED3_Pin, state);
}
}
}
}
}
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
}
}

作者:人生若只如初见645