stm32 uart5串口通信代码记录

在使用串口5接受数据的时候,只能接收一个字节,即串口中断只触发了一次,我的优先级已经设为1(抢占优先级) 0(子优先级)了,解决办法为在中断中清除中断标志位,使能中断。

#include "usart5.h"
#include "stm32f10x.h"
#include "string.h"
#include "stm32f10x_tim.h"
#include "stdio.h"


typedef enum {
	false = 0, true = !false
}bool;

bool isUartRxCompleted = false;

//int fputc(int ch, FILE *f)
//{
//        if(ch =='\n')  
//        {  
//            USART_SendData(USART2, 0x0D);  
//            while (!(USART2->SR & USART_FLAG_TXE)); 
//            USART_SendData(USART2, 0x0A);  
//            while (!(USART2->SR & USART_FLAG_TXE));  
//        }  
//        else  
//        {  
//            USART_SendData(USART2, (unsigned char)ch);  
//            while (!(USART2->SR & USART_FLAG_TXE));   
//        }  
//	return ch;
//}
#define GSM_USART_MAX_RECV_LEN		128		//	接收缓存大小
#define GSM_USART_MAX_SEND_LEN		32		//  发送缓存大小
#define GSM_USART_RX_EN 			1		//  接收使能标志


char GSM_USART_RX_BUF[GSM_USART_MAX_RECV_LEN]; 				
char GSM_USART_TX_BUF[GSM_USART_MAX_SEND_LEN]; 				


// [14:0]: 接收字节数 [15]: 接收完成标志
volatile uint16_t GSM_USART_RX_STA = 0; 

void GSM_TIM3_Init(void)
{	
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	TIM_DeInit(TIM3);
	TIM_TimeBaseStructure.TIM_Period = 1000-1; 
	TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; 
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
	TIM_Cmd(TIM3,DISABLE);

	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	TIM_Cmd(TIM3,DISABLE);
}

void TIM3_IRQHandler(void)
{ 	
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
	{	 			   
		GSM_USART_RX_STA|=1<<15;
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
		TIM_Cmd(TIM3, DISABLE); 
	}	    
}


void UART5_init(u32 bound)
{

    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
	  USART_InitTypeDef   USART_InitStructure;
	
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE); //使能UART5时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); //使能GPIOC/D时钟
    USART_DeInit(UART5);  //复位串口5 //USART5_TX   PC12

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PC12
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PC12
    //USART5_RX   PD2

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//上拉输入
    GPIO_Init(GPIOD, &GPIO_InitStructure);  //初始化PD2

    //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

    //USART 初始化设置
    USART_InitStructure.USART_BaudRate = 9600;//一般设置为;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    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(UART5, &USART_InitStructure); //初始化串口
    USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(UART5, ENABLE);                    //使能串口

}

/*
 *==============================================================================
 *函数名称:UART5_IRQHandler
 *函数功能:UART5中断服务函数
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */


void UART5_IRQHandler(void)
{
	uint8_t res;
    if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)//接收中断
    {  
		#if 1
		USART_ClearITPendingBit(UART5,USART_IT_RXNE);
		USART_Cmd(UART5, ENABLE);                    //使能串口
		USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//开启中断
			res = USART_ReceiveData(UART5);
		if((GSM_USART_RX_STA&(1<<15))==0)
		{ 
			if(GSM_USART_RX_STA<GSM_USART_MAX_RECV_LEN)
			{
				TIM_SetCounter(TIM3,0);
				if(GSM_USART_RX_STA==0) 
				{
					TIM_Cmd(TIM3,ENABLE);
				}
				GSM_USART_RX_BUF[GSM_USART_RX_STA++]=res;	
			}else 
			{
				GSM_USART_RX_STA|=1<<15;
			} 
		}
		#endif

		#if 0	
		USART_ClearITPendingBit(UART5,USART_IT_RXNE);
		USART_Cmd(UART5, ENABLE);                    //使能串口
		USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//开启中断
		
		res = USART_ReceiveData(UART5);
		if((GSM_USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(GSM_USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(res!=0x0a)GSM_USART_RX_STA=0;//接收错误,重新开始
				else GSM_USART_RX_STA|=0x8000;	//接收完成了 
				}
			else //还没收到0X0D
				{	
				if(res==0x0d)GSM_USART_RX_STA|=0x4000;
				else
					{
						
					GSM_USART_RX_BUF[GSM_USART_RX_STA&0X3FFF]=res ;
					GSM_USART_RX_STA++;
					if(GSM_USART_RX_STA>(GSM_USART_MAX_RECV_LEN-1))GSM_USART_RX_STA=0;//接收数据错误,重新开始接收	  
					}		 
				}
			}   
		
		#endif
    }
	//USART_ClearITPendingBit(UART5,USART_IT_RXNE);
}


void uart5WriteBuf(uint8_t *buf, uint8_t len)
{
	while (len--) {
		while ((UART5->SR & 0x40) == 0);
		USART_SendData(UART5,*buf++);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值