STM32CubeMX——串口
STM32CubeMX配置
首先打开STM32CubeMX选择你开发的芯片型号,这里我选择的是F103R6Tx的芯片。然后第一步选择SYS里面的debug模式,如果用HAL库不进行SWD或JTAG配置,单片机只能进行下载一次程序,要进行第二次或更多次程序下载,需要按复位键(如果你的单片机有复位按键的话),或者用镊子夹住复位线路上的电容使其短路,点击Keil下载,再松开镊子。
然后RCC时钟源选择外部高速时钟,自接外部晶振
然后配置时钟树
然后打开USART1选择异步通讯模式
打开DMA添加,注意RX的DMA传输模式选择为循环模式circular,不然只会接受一次。
如果用DMA方式发送,则需要使能USART1的中断,注意:如果不开启串口中断,则程序只能发送一次数据,程序不能判断DMA传输是否完成,USART一直处于busy状态
这里注意选择环境,且路径不要出现中文名
相关函数
HAL_UART_Transmit();串口轮询发送数据,使用超时管理机制
HAL_UART_Receive();串口轮询接收数据,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Receive_DMA();串口DMA模式接收
HAL_UART_DMAPause() 暂停串口DMA
HAL_UART_DMAResume(); 恢复串口DMA
HAL_UART_DMAStop(); 结束串口DMA
重新配置printf与scanf
在 stm32f1xx_hal.c中包含#include <stdio.h>
#include "stm32f1xx_hal.h"
#include <stdio.h>
extern UART_HandleTypeDef huart1; //声明串口
在 stm32f1xx_hal.c 中重写fget和fput函数
/**
* 函数功能: 重定向c库函数printf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/**
* 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
配置代码
在主函数内添加代码
uint8_t buffer[20];
HAL_UART_Transmit_DMA(&huart1,buffer,20);
开启DMA接受,然后在回调函数里面写接受完后需要的操作,例如用DMA发送接收到的数据
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1) //判断是否是串口1接受中断
{
HAL_UART_Transmit_DMA(&huart1,buffer,20);
}
}