stm32串口的中断接收

一,ustart.c函数

(一)结构体的配置

1.GPIO口的配置

PA9与PA10串口的配置----输出输入引脚

2.USART,收发器结构体的配置

3.NVIC,中断控制器结构体的配置

(二)串口的中断配置

USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);//USART_IT_RXNE接收数据寄存器非空标志位;因为使用的是中断接收作用,所以来判断接收数据寄存器是否为空

 

(三)中断优先级的配置

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//在设置“抢占优先级”和“子优先级”之前,要配置好优先级组,即这个函数

二,main.c

编写中断服务函数,使用了USART1就用1的函数,定义为void类型

→→stm32串口的中断接收_第1张图片

 

    USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);//得到中断标志函数
 

    USART_ReceiveData(USART1);//串口数据接收函数

#include "stm32f10x.h"
#include "usart.h"
#include 
void usart_demo(void)
{
	GPIO_InitTypeDef  GPIOinitStruct;
	USART_InitTypeDef USARTinitStruct;
	
	NVIC_InitTypeDef nvic_init;//配置中断控制器的结构体
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断优先级组的配置
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

	//PA9 
	GPIOinitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIOinitStruct.GPIO_Pin=GPIO_Pin_9;
	GPIOinitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIOinitStruct);

	//PA10 
	GPIOinitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIOinitStruct.GPIO_Pin=GPIO_Pin_10;
	GPIO_Init(GPIOA, &GPIOinitStruct);
	
	//串口配置
	USARTinitStruct.USART_BaudRate=115200;
	USARTinitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USARTinitStruct.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
	USARTinitStruct.USART_Parity=USART_Parity_No;
	USARTinitStruct.USART_StopBits=USART_StopBits_1;
	USARTinitStruct.USART_WordLength=USART_WordLength_8b;
	USART_Init(USART1, &USARTinitStruct);
	USART_Cmd(USART1,ENABLE);


	//中断配置,ITConfig
	USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);
    //USART_IT_RXNE接收数据寄存器非空标志位

	//串口中断配置
	nvic_init.NVIC_IRQChannel=USART1_IRQn;//通道
	nvic_init.NVIC_IRQChannelCmd=ENABLE;//
	nvic_init.NVIC_IRQChannelPreemptionPriority=1;//
	nvic_init.NVIC_IRQChannelSubPriority=1;

	NVIC_Init(&nvic_init);//初始化函数


}






void USART_SendByte(USART_TypeDef* USARTx, uint16_t data)
{
	USART_SendData(USARTx, data);
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);
}



void USART_SendStr(USART_TypeDef* USARTx, char *str)//定义的输出字符串的函数
	uint16_t i=0;
	do
	{
		USART_SendByte(USARTx, *(str + i));
		i++;
	}
	while(*(str + i) != '\0');
	
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
	
	
}
/*【见七.3 https://blog.csdn.net/weixin_46965692/article/details/115250655】*/

int fputc(int num,FILE *f)//ÖØ¶¨ÏòÊä³öº¯Êý
{
	USART_SendData(USART1, (uint8_t)num);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
	
	return (num);

}	
#include "stm32f10x.h"
#include "led.h"
#include "shakeLight.h"
#include "exti.h"
#include "usart.h"
#include 
void delay(uint16_t time)
{
	uint16_t x;
	while(time --)
	{
		x=1200;
		while(x--);
	}
}

int main()
{
	
	LED_demo();
	usart_demo();
	GPIO_SetBits(GPIOC, GPIO_Pin_13);
	while(1)
	{
	}
	
	
  
}
void USART1_IRQHandler(void)
{
	char temp;//定义一个char类型,用来接收串口发送过来的字符数据
	if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//等于RESET的时候是没有发生中断;不等于RESRT就是发生了中断
	{
		temp=USART_ReceiveData(USART1);//接收数据
		if(temp=='K')
		{
			GPIO_ResetBits(GPIOC, GPIO_Pin_13);//开灯
			USART_SendStr(USART1,"deng kai le");//串口输出东西
		}
		if(temp=='G')
		{
			GPIO_SetBits(GPIOC, GPIO_Pin_13);
			USART_SendStr(USART1,"deng guang ba");
		}
	}

}

 

你可能感兴趣的:(stm32,stm32,串口通信,单片机,嵌入式)