一,打开cubemx,配置时钟等参数,具体操作方法和上一节一样
二,配置串口1
在cubemx上打开串口1,并设置波特率,其他参数保持默认,配置完成如下图所示:
三,打开串口中断
点击NVIC SETTING,勾选相应选项如下图
四、生成代码,具体方法与上节一样
1、在usart.c中添加如下代码:
uint8_t aRecBuff[1];
uint8_t Uart1Buff[REC_LEN];
uint16_t USART_RX_STA=0;
int fputc(int ch, FILE *f)//printf的重映射
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
2、 添加中断回调函数(参考正点原子函数接收方法)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(aRecBuff[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(aRecBuff[0]==0x0d)USART_RX_STA|=0x4000;
else
{
Uart1Buff[USART_RX_STA&0X3FFF]=aRecBuff[0] ;
USART_RX_STA++;
if(USART_RX_STA>(REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
3、在stm32f7xx_it.c文件中的void USART1_IRQHandler(void)函数中添加如下代码,以保证进入串口中断后再次开启接收中断,添加完成的代码如下:
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
HAL_UART_Receive_IT(&huart1,aRecBuff,1);
/* USER CODE END USART1_IRQn 1 */
}
4、在主函数中添加代码开启串口接收中断
HAL_UART_Receive_IT(&huart1,aRecBuff,1);
5、在主循环添加代码,串口接收完成后,打印接收的内容(注;串口发送的内容需以换行符结尾),更改完成的主函数如下所示:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* Enable I-Cache---------------------------------------------------------*/
SCB_EnableICache();
/* Enable D-Cache---------------------------------------------------------*/
SCB_EnableDCache();
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1,aRecBuff,1);
printf("uart test is run!!!\r\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(USART_RX_STA&0x8000)
{
printf("recdata is :%s\r\n",Uart1Buff);
USART_RX_STA=0;
memset(Uart1Buff,0,REC_LEN);
}
}
/* USER CODE END 3 */
}
如果编译memset出错,则添加string.h头文件即可。
五,编译下载,打开串口调试助手观察现象
开机系统打印uart test is run!!!,向串口发送“这是一个串口实验”,则在串口就会显示“recdata is :这是一个串口实验":(注:发送新行需要勾选)