本次实验用到嵌入式仿真教学实验平台:嵌入式仿真实验教学平台
USART原理介绍传送门:21. USART—串口通讯 — [野火]STM32库开发实战指南——基于野火指南者开发板 文档
实验目的:模拟平台使用中断来完成串口数据的发送和接受
中断控制
USART有多个中断请求事件,具体见表 USART中断请求 。(来源:野火串口文档)

模拟电路搭建:

上期的代码添加NVIC控制器的代码
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);
配置中断函数的代码
void USART1_IRQHandler(void) //串口1中断服务程序
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
sbuffer = USART_ReceiveData(USART1);//接受发送数据到缓存区
Usart_SendByte(USART1, (uint8_t)sbuffer);//发送接受到的数据
Usart_SendByte(USART1, '\\n');//换行
USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清楚中断标志位
}
}
主函数
#include "stm32f10x_usart.h"
#include "sys.h"
#include "stm32f10x_conf.h"
#include "delay.h"
#include "usart.h"
#include <stdint.h>
#include <stdio.h>
uint16_t sbuffer;
int main(void)
{
uart_init(115200);
while(1)
{
}
}
void USART1_IRQHandler(void) //串口1中断服务程序
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
sbuffer = USART_ReceiveData(USART1);
Usart_SendByte(USART1, (uint8_t)sbuffer);
Usart_SendByte(USART1, '\\n');
//Usart_SendString(USART1, "\\nHELLO CSDN");
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
编译 运行

这里我们只展示了单字节的发送以及接收 多字节发送的希望大家自己动手实现以下 嘿嘿



