youyexinyu 发表于 2015-7-13 11:41:57

STM32F303RE 串口中断通信问题

STM32F303RE 串口接收中断处理:当从串口发数据时,MCU只能接收到一半数据,请教各位大神,这是怎么一回事?如图1

//中断处理程序
void USART2_IRQHandler(void)
{
   CLI();    //disable all interrupts
   /* checks whether the specified USART interrupt has occurred or not */
    if (USART_GetITStatus(USART2, USART_IT_RXNE)) {
   /* clear the RXNE pending bit */
      USART_RequestCmd(USART2, USART_Request_RXFRQ, ENABLE);
   //USART_SendData(USART2, USART_ReceiveData(USART2));
   HW_USART_SendOneChar(USART2, HW_USART_ReceOneChar(USART2));
}
SEI();    //enable all interrupts
}

当中断里直接用库函数USART_SendData(USART2, USART_ReceiveData(USART2))时接收正常

//串口程序
//115200 -8-1-0-0

#include "HW_USART.h"

static void RCC_Configuration(void);
static void NVIC_Configuration(void);
static void GPIO_Configuration(GPIO_TypeDef* port);

void HW_USART_Init(USART_TypeDef* usartnum, FunctionalState state)
{
    USART_InitTypeDef    USART_InitStructure;

   RCC_Configuration();
   
   NVIC_Configuration();

   GPIO_Configuration(Light_Run_Port);
    USART_InitStructure.USART_BaudRate = BaudRate;
    USART_InitStructure.USART_WordLength = WordLength;
    USART_InitStructure.USART_StopBits = StopBits;
    USART_InitStructure.USART_Parity = ParityChecking;
    USART_InitStructure.USART_HardwareFlowControl = FlowControl;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
   
USART_DeInit(usartnum);
    USART_Init(usartnum, &USART_InitStructure);
    USART_ITConfig(usartnum, USART_IT_RXNE, state);                //enable RXNE interrupt
   USART_ClearFlag (USART2, (USART_FLAG_TXE | USART_FLAG_TC));    //clear TXE TC flag
    USART_Cmd(usartnum, state);
}
void RCC_Configuration(void)
{
    /* GPIOA Periph clock enable */
   RCC_AHBPeriphClockCmd(GPIOA, ENABLE);

   /* USART2 Periph clock enable */
    RCC_APB1PeriphClockCmd(USART2, ENABLE);
}
void NVIC_Configuration(void)
{
   NVIC_InitTypeDef    NVIC_InitStruct;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}
void GPIO_Configuration(GPIO_TypeDef* port)
{
    GPIO_InitTypeDef    GPIO_InitStructure;

   GPIO_InitStructure.GPIO_Pin = (USART_TXpin | USART_RXpin);    //RX TX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                  //Alternate function mode
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;             //High speed
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                //Output push-pull
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                  //Pull-up
    GPIO_Init(port, &GPIO_InitStructure);

    /* select the pins to be used as Alternate function */
    GPIO_PinAFConfig(port, GPIO_PinSource2, GPIO_AF_7);
    GPIO_PinAFConfig(port, GPIO_PinSource3, GPIO_AF_7);
}
void HW_USART_SendOneChar(USART_TypeDef* usartnum, uint8_t data)
{
USART_SendData(usartnum, data);

   /* wait until transmission is complete */
    while (!(USART_GetFlagStatus(usartnum, USART_FLAG_TC))) {
      ;
}
}
void HW_USART_SendChars(USART_TypeDef* usartnum, uint16_t len, void *buff)
{
   uint16_t i;
    uint8_t *ptr = (uint8_t *)buff;
   
   for (i = 0; i < len; i++) {
       HW_USART_SendOneChar(usartnum, ptr);
}
}
void HW_USART_SendString(USART_TypeDef* usartnum, void *buff)
{
   uint8_t *ptr = (uint8_t *)buff;
   
   while (*ptr != '\0') {
      HW_USART_SendOneChar(usartnum, *ptr++);
   }
}
uint16_t HW_USART_ReceOneChar(USART_TypeDef* usartnum)
{
   /* Wait until data to be received */
    while (!(USART_GetFlagStatus(usartnum, USART_FLAG_RXNE))) {
      ;
}
return USART_ReceiveData(usartnum);
}

stary666 发表于 2015-7-13 12:14:22

看看,,,,,,,,,,,,sofa

mark0668 发表于 2015-7-13 13:21:14

看看了...

左岸右岸 发表于 2015-7-13 13:38:47

水平不够,看不出来,帮顶吧:D

发表于 2015-7-13 15:08:19

看样子是由于在发送的时候,丢掉了数据,应该是发生了溢出。下面的代码导致数据溢出
/* wait until transmission is complete */
    while (!(USART_GetFlagStatus(usartnum, USART_FLAG_TC))) {
      ;
}

youyexinyu 发表于 2015-7-13 15:22:17

安 发表于 2015-7-13 15:08
看样子是由于在发送的时候,丢掉了数据,应该是发生了溢出。下面的代码导致数据溢出
/* wait until transmi ...

你好,
在中断里用USART_SendData(USART2, USART_ReceiveData(USART2));是正常的;
但是用自己的就有问题,串口发一个字节要发两次,MCU才能收到;串口发一大串数据的话就只能收到一半。
while (!(USART_GetFlagStatus(usartnum, USART_FLAG_TC))) {
      ;
}这个是等待发送完成的,应该要加的吧。

creep 发表于 2015-7-13 15:26:22

youyexinyu 发表于 2015-7-13 15:22
你好,
在中断里用USART_SendData(USART2, USART_ReceiveData(USART2));是正常的;
但是用自己的就有问题 ...

换成下面的判断函数试试
while(USART_GetFlagStatus(usartnum,USART_FLAG_TXE)!=SET);

youyexinyu 发表于 2015-7-13 15:35:22

creep 发表于 2015-7-13 15:26
换成下面的判断函数试试

还是一样 呵呵

发表于 2015-7-13 16:02:15

把波特率调低点试试。9600

youyexinyu 发表于 2015-7-13 16:09:08

安 发表于 2015-7-13 16:02
把波特率调低点试试。9600

效果一样!真奇怪
页: [1] 2 3
查看完整版本: STM32F303RE 串口中断通信问题