串口 stm32 实现中断接收 打开板子上的led灯

在usart.c上增加配置NVIC优先级中断控制器

	NVIC_InitTypeDef Nvic_init;	 //misc.h
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //配置NVIC中断组
//3.配置NVIC中断控制器  在misc.h里
	Nvic_init.NVIC_IRQChannel = EXTI1_IRQn;     //= 配置在启动文件里                     //中断通道
	Nvic_init.NVIC_IRQChannelCmd = ENABLE;      //使能  找到FunctionalState字眼 右键goto
	Nvic_init.NVIC_IRQChannelPreemptionPriority = 1;   //因为只配置了一个中断  不考虑优先级 所以只有1个
	Nvic_init.NVIC_IRQChannelSubPriority = 1;
	
	NVIC_Init(&NvicInitStructure);
usart.c
#include "stm32f10x.h"                  // Device header
#include "usart.h"
//#include "stdio.h"

void Usart_Init(void)
{
	//2. 配置GPIO的结构体
	GPIO_InitTypeDef GpioInitStructure; //初始化GPIO结构体命名
	USART_InitTypeDef UsartInitStructure;//初始化USART结构体命名
	//加入
	NVIC_InitTypeDef	NvicInitStructure;  //初始化USART结构体命名 
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置NVIC中断组

	
	//1. 配置时钟:GPIO口的时钟,引脚复用的时钟,串口的时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

	
	//2.1 配置PA9 TX
	GpioInitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;//复用推挽输出
	GpioInitStructure.GPIO_Pin   = GPIO_Pin_9;
	GpioInitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GpioInitStructure);
	
	//2.2 配置PA10 RX
	GpioInitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入
	GpioInitStructure.GPIO_Pin   = GPIO_Pin_10;
	GPIO_Init(GPIOA,&GpioInitStructure);
	
	//3.配置串口结构体
	UsartInitStructure.USART_BaudRate =   115200;        //波特率
	UsartInitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //硬件流
	UsartInitStructure.USART_Mode = USART_Mode_Rx| USART_Mode_Tx;					//模式
	UsartInitStructure.USART_Parity = USART_Parity_No;						//校验位
	UsartInitStructure.USART_StopBits =	USART_StopBits_1;					//停止位
	UsartInitStructure.USART_WordLength =	USART_WordLength_8b;				//字节长度
	
	USART_Init(USART1, &UsartInitStructure);
	USART_ITConfig( USART1,  USART_IT_RXNE, ENABLE ); //中断标志位

	USART_Cmd(USART1, ENABLE);//打开串口 比配置GPIO多这一步

	NvicInitStructure.NVIC_IRQChannel = USART1_IRQn;
	NvicInitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NvicInitStructure.NVIC_IRQChannelSubPriority = 1;
	NvicInitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NvicInitStructure);

	
}
//发送字符
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)
{
		USART_SendData( USARTx,  Data);
		while( USART_GetFlagStatus( USARTx,  USART_FLAG_TXE) == RESET);//USART_GetFlagStatus是判断标志位 USART_FLAG_TXE 去usart.h  FLAG找
}
//发送字符串
void USARTSendString( USART_TypeDef* USARTx, char *str)
{
		uint16_t i = 0;
		do{
			USARTSendByte(USART1,*(str+i));
			i++;
		}while(*(str+i) != '\0');
		
		while( USART_GetFlagStatus( USARTx,  USART_FLAG_TC) == RESET);//USART_GetFlagStatus是判断标志位 USART_FLAG_TC(这是判断字符串) 去usart.h  FLAG找

}
重写Printf
//int fputc(int ch, FILE *f)
//{
//		USARTSendByte( USART1,  (uint8_t)ch);
//		while( USART_GetFlagStatus( USART1,  USART_FLAG_TXE) == RESET);
//		return (ch);
//}
//int fgetc(FILE *f)
//{
//		
//		while( USART_GetFlagStatus( USART1,  USART_FLAG_RXNE) == RESET);
//		
//		return (int) USART_ReceiveData(USART1);

//}
main.c
#include "stm32f10x.h"                  // Device header
#include "usart.h"
#include "led.h"
#include "exti.h"

void delay(uint16_t time)
{
		uint16_t i = 0;
		while(time--)
		{
			i=12000;
			while(i--);
		}
}

int main(void)
{

		Usart_Init();
		LED_Init();
//		USARTSendByte(USART1,'O');
//		USARTSendByte(USART1,'K');
	
//		USARTSendString( USART1, "甘boss");
//		printf("甘boss");
//		putchar('X');
		GPIO_SetBits( GPIOC,  GPIO_Pin_13);

		while(1)
		{
			
			
			
		}
}
//4. 中断服务函数
void USART1_IRQHandler(void)
{
		char temp;
		if( USART_GetITStatus( USART1,  USART_IT_RXNE) != RESET)
		{
			 
			temp = USART_ReceiveData( USART1);
			
			if(temp == 'O')
			{
				 GPIO_ResetBits( GPIOC,  GPIO_Pin_13);
				 USARTSendString(  USART1, "LED IS OK");

			
			}
			if(temp == 'C')
			{
				 GPIO_SetBits( GPIOC,  GPIO_Pin_13);
				 USARTSendString(  USART1, "LED IS DOWN");

			}
		
		}


}
			

猜你喜欢

转载自blog.csdn.net/weixin_46016743/article/details/114481125