STM32第15天串口中断接收

一:库函数实现串口接收
软件流程设计
初始化系统
初始化GPIO、串口外设、LED时钟
初始化串口和LED引脚
串口发送控制LED
usart.c

 

#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"



void my_usart_Init()//千万不要和32库里面串口定于的名字一样,不然会报错
{
	GPIO_InitTypeDef Usart_Initstruct;
	USART_InitTypeDef My_usart_Initstruct;
	NVIC_InitTypeDef NVIC_Initstruct;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
	

    
	
	
	Usart_Initstruct.GPIO_Pin=GPIO_Pin_9 ;
	Usart_Initstruct.GPIO_Mode=GPIO_Mode_AF_PP;
	Usart_Initstruct.GPIO_Speed= GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&Usart_Initstruct);
	
	Usart_Initstruct.GPIO_Pin=GPIO_Pin_10;
	Usart_Initstruct.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_Init(GPIOA,&Usart_Initstruct);
	
	My_usart_Initstruct.USART_BaudRate=115200;
	My_usart_Initstruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	My_usart_Initstruct.USART_Mode= USART_Mode_Rx | USART_Mode_Tx ;
	My_usart_Initstruct.USART_Parity=USART_Parity_No ;
	My_usart_Initstruct.USART_StopBits=USART_StopBits_1 ;
	My_usart_Initstruct.USART_WordLength=USART_WordLength_8b ;
	USART_Init(USART1, &My_usart_Initstruct);
	USART_Cmd(USART1,ENABLE);
	USART_ITConfig( USART1,USART_IT_RXNE, ENABLE);
	
	
	NVIC_Initstruct.NVIC_IRQChannel= USART1_IRQn;
	NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_Initstruct.NVIC_IRQChannelSubPriority=0;
	NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_Initstruct);
	
	
	
}


void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint16_t Data)
{
	USART_SendData(USARTx,  Data);
	while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);




}

void My_Usart_Send_Sting(USART_TypeDef* USARTx, char * str)
{
	uint16_t i=0;
	do
	{
		My_Usart_Send_Byte(USARTx,  * (str+i));
		i++;
	}while(* (str+i) != '\0');
	
	while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);


}


int fputc(int ch, FILE * p)
{
	USART_SendData(USART1, (u8)ch );
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
	return ch;

}

void USART1_IRQHandler()
{
	char str;
	if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
	{
		str=USART_ReceiveData(USART1);
		printf("receive date: %c \r\n",str);
		
		
		if(str == '0')
		{
			 GPIO_ResetBits(GPIOA,GPIO_Pin_1);
			 printf("LED IS ON \r\n");
		}
		
		if(str == '1')
		{
			 GPIO_SetBits(GPIOA,GPIO_Pin_1);
			 printf("LED IS OFF \r\n");
		}
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
	}
	

}


usart.h

#ifndef USART_H_
#define USART_H_

void my_usart_Init(void);
void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint16_t Data);
void My_Usart_Send_Sting(USART_TypeDef* USARTx, char * str);

#endif

 main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "Bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "wireless.h"
#include "exti_key.h"
#include "usart.h"
#include "stdio.h"
 
void delay(uint16_t time)//延时1ms  软件延时粗延时
{
	uint16_t i=0;
	while(time --)
	{
		i=12000;
		while(i --);
	}
	
}
 
 
int  main()
{
	my_usart_Init();
	LED_Init();

//	My_Usart_Send_Byte( USART1, 'A');
//	My_Usart_Send_Byte( USART1, 'B');
//	My_Usart_Send_Byte( USART1, 'C');

//	My_Usart_Send_Sting( USART1, "kobe \r\n");
//	printf("kobe is king \r\n");
   while(1)
	 {
//		USART_SendData( USART1,  'A');
		
		 
	 }
		 
		
}
	

代码心得

写串口中断void  USART1_IRQHandler()去startup_stm32f10x_hd.s找到WEAK的弱定义

你可能感兴趣的:(单片机,stm32,嵌入式硬件)