你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 4289|回复: 24

[STM32F3] STM32F303RE 串口中断通信问题

[复制链接]

1

主题

7

回帖

0

蝴蝶豆

初级会员

最后登录
2015-8-15
发表于 2015-7-13 11:41:57 | 显示全部楼层 |阅读模式
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[i]);
  }
}
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);
}
a.jpg
回复

使用道具 举报

100

主题

3617

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2015-7-13 12:14:22 | 显示全部楼层
看看,,,,,,,,,,,,sofa
回复 支持 反对

使用道具 举报

47

主题

1210

回帖

5

蝴蝶豆

论坛元老

最后登录
2020-8-13
发表于 2015-7-13 13:21:14 | 显示全部楼层
看看了...
回复 支持 反对

使用道具 举报

4

主题

881

回帖

5

蝴蝶豆

论坛元老

最后登录
2020-11-28
发表于 2015-7-13 13:38:47 | 显示全部楼层
水平不够,看不出来,帮顶吧
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2015-7-13 15:08:19 | 显示全部楼层
看样子是由于在发送的时候,丢掉了数据,应该是发生了溢出。下面的代码导致数据溢出
/* wait until transmission is complete */  
    while (!(USART_GetFlagStatus(usartnum, USART_FLAG_TC))) {
      ;
  }  
回复 支持 反对

使用道具 举报

1

主题

7

回帖

0

蝴蝶豆

初级会员

最后登录
2015-8-15
 楼主| 发表于 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))) {
      ;
  }  这个是等待发送完成的,应该要加的吧。
回复 支持 反对

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2015-7-13 15:26:22 | 显示全部楼层
youyexinyu 发表于 2015-7-13 15:22
你好,
在中断里用USART_SendData(USART2, USART_ReceiveData(USART2));是正常的;
但是用自己的就有问题 ...

换成下面的判断函数试试
  1. while(USART_GetFlagStatus(usartnum,USART_FLAG_TXE)!=SET);
复制代码
回复 支持 反对

使用道具 举报

1

主题

7

回帖

0

蝴蝶豆

初级会员

最后登录
2015-8-15
 楼主| 发表于 2015-7-13 15:35:22 | 显示全部楼层
creep 发表于 2015-7-13 15:26
换成下面的判断函数试试

还是一样 呵呵
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2015-7-13 16:02:15 | 显示全部楼层
把波特率调低点试试。9600
回复 支持 反对

使用道具 举报

1

主题

7

回帖

0

蝴蝶豆

初级会员

最后登录
2015-8-15
 楼主| 发表于 2015-7-13 16:09:08 | 显示全部楼层
安 发表于 2015-7-13 16:02
把波特率调低点试试。9600

效果一样!真奇怪
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版