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

查看: 4318|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版