实验内容:上位机向串口发送一个字符,进入接收中断,在接收中断函数内接收数据,LED1闪烁一下,紧接着接收到的数据发送回上位机,发送完成LED3闪烁一下。
实验目的:进一步熟悉串口应用。
源代码奉上
串口初始化:
#include "stm32f10x.h"
void Uart1_Init(void)
{
//uart 的GPIO管脚初始化 PA9 usart1_TX PA10 USART_RX
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//悬空输入
GPIO_Init(GPIOA,&GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//只有串口1 使用72M,其他串口使用36M
USART_InitTypeDef USART_InitStructure;
//串口参数配置:115200,8,1,无奇偶校验,无硬流量控制 ,使能发送和接收 
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //接收中断
USART_Cmd(USART1, ENABLE); 
}
/*发送字符是通过查询字符串的状态来来不断的发送下一个数据。接受数据是通过中断来实现的,把接受的数据放入缓冲区,来实现。*/
//发送一个字符
void Usart_SendData(unsigned char x) 
{ 
USART_SendData(USART1,x);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!=SET);//查询发送数据寄存器空标志,等待发送完毕
}
//发送字符串
void Usart_SendStr(unsigned char *Str) 
{ while(*Str) 
{ 
USART_SendData(USART1, (unsigned char)*Str++); 
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
} 
}
NVIC初始化:
#include "stm32f10x.h"
void Nvic_Init(void)
{
//使能串口中断,并设置优先级 
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//先占优先级2位从2位
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//USART1_IRQChannel_Priority; 
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure); 
}
main()函数:
#include "stm32f10x.h"
#include "led.h"
#include "uart.h"
#include "nvic.h"
int main(void)
{
Uart1_Init();
Nvic_Init();
while (1)
{ 
}
}
中断函数(位于stm32f10x_it.c中)
void USART1_IRQHandler(void)
{
  unsigned char temp_trx;
  if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
  {
    
    temp_trx=USART_ReceiveData(USART1);
    LedBlink(1);
    Delay();
    USART_SendData(USART1,temp_trx);
    LedBlink(3);
    Delay();
  }
另外请教一个问题:在中断函数内是否需要清除接收完成中断标志?我没有找到相关的清中断的函数。多谢各位看官。。。										
					
					
							
					
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |

 
					
				
 
			
			
			
						
			 
					
				 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

