在使用串口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++);
}
}