一.硬件设计
外部中断实验用到的资源有:
①usb线
②精英版
③串口1
硬件连接
二.软件设计
1.STM32CubeMx配置中断
①新建工程
选择使用的芯片型号。
②时钟源配置
根据使用芯片的最大主频进行配置。具体参考上一篇点灯的新建工程。点灯(入口)
③串口配置
将PA9、PA10分别设置为USART_Tx和USART_Rx。
波特率设置为115200,传输数据长度为8 Bit。奇偶检验无,停止位为1 ,接收发送使能开启,开启接受中断。
④生成工程
2.Keil
在usart.c文件里添加串口初始化函数MX_USART1_UART_Init()里面添加 中断接受中断函数HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1)。
在stm32f1xx_hal.c中添加
#define RXBUFFERSIZE 256 接受数据的最大长度
char RxBuffer[RXBUFFERSIZE]; //数据存放数组
uint8_t aRxBuffer; //中间变量
uint8_t Uart1_Rx_Cnt = 0; //计数变量
在 stm32f1xx_hal.c 中添加重写fget和fput函数和串口回调函数
/* USER CODE BEGIN 1 */
/**
* 函数功能: 重定向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;
}
/* USER CODE END 1 */
/* USER CODE BEGIN USART1_Init 2 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_UART_TxCpltCallback could be implemented in the user file
*/
if(Uart1_Rx_Cnt >= 255) //溢出判断
{
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
HAL_UART_Transmit(&huart1, (uint8_t *)"溢出", 10,0xFFFF);
}
else
{
RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;
if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D))
{
HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF);
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
}
在main.c的while语句里面添加
printf("test\n");
HAL_Delay(1000);
3.结果
完工!!!
学习于【STM32】HAL库 STM32CubeMX教程四---UART串口通信详解_Z小旋-CSDN博客_hal_uart_transmit