OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2720|回复: 9

问题阐述:串口3无法进入接收中断。能够发送。小弟就6金钱,如果解决了我的问题,小弟万分感激。在此谢过大牛们啦

[复制链接]

2

主题

15

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-1-25
在线时间
3 小时
发表于 2017-1-25 22:20:06 | 显示全部楼层 |阅读模式
3金钱
小弟就想用串口3接收数据然后返回给电脑。使用定时7来用于超时接收。
现如今能够发送数据,但就是接受不了数据,还望给为大神稍微花点时间为小弟解决一下,小弟在此谢过啦。

主函数

int main(void)
{  
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();         
usart3_init(115200);  
  
  while(1)
{
  if((USART3_RX_STA&(1<<15))!=0)
  {
   u3_printf("\nrecive:%s\n",USART3_RX_BUF);
   USART3_RX_STA=0;
  }
}  
}

这是我的串口3配置部分和中断
#include "delay.h"
#include "usart.h"
#include "stdarg.h"   
#include "stdio.h"   
#include "string.h"  
#include "timer.h"
volatile u8 USART3_RX_BUF[USART3_MAX_RECV_LEN];   
volatile u8 USART3_TX_BUF[USART3_MAX_SEND_LEN];   
volatile vu16 USART3_RX_STA=0;

void USART3_IRQHandler(void)
{
u8 res;      
if(USART_GetFlagStatus(USART3,USART_IT_RXNE)!=RESET)
{  
  res =USART_ReceiveData(USART3);
  if((USART3_RX_STA&(1<<15))==0)
  {
   if(USART3_RX_STA<USART3_MAX_RECV_LEN)
   {
    TIM_SetCounter(TIM7,0);            
    if(USART3_RX_STA==0)   
    {
     TIM_Cmd(TIM7,ENABLE);
    }
    USART3_RX_BUF[USART3_RX_STA++]=res;
   }else
   {
    USART3_RX_BUF[USART3_RX_STA]='\0';
    USART3_RX_STA|=1<<15;   
    TIM_Cmd(TIM7,DISABLE);
   }
  }
}
}   

void usart3_init(u32 bound)
{  
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
USART_DeInit(USART3);  
   //USART3_TX   PB10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    //USART3_RX   PB11
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);  


USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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(USART3, &USART_InitStructure);
USART_Cmd(USART3, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);


NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
NVIC_Init(&NVIC_InitStructure);

TIM7_Int_Init(1000-1,7200-1);
USART3_RX_STA=0;  
TIM_Cmd(TIM7,DISABLE);

}

void u3_printf(char* fmt,...)  
{  
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF);
for(j=0;j<i;j++)     
{
  while((USART3->SR&0X40)==0);   
  USART3->DR=USART3_TX_BUF[j];
}
}
定时器7 的配置和中断
#include "timer.h"
void TIM7_Int_Init(u16 arr,u16 psc)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);


TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure);

TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE );

TIM_Cmd(TIM7,ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
NVIC_Init(&NVIC_InitStructure);

}
  
extern volatile u8  USART3_RX_BUF[];   
extern volatile u8  USART3_TX_BUF[];   
extern volatile vu16 USART3_RX_STA;         
void TIM7_IRQHandler(void)
{   

if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)
{
  USART3_RX_BUF[USART3_RX_STA]='\0';
  USART3_RX_STA|=1<<15;
  TIM_ClearITPendingBit(TIM7, TIM_IT_Update);  
  TIM_Cmd(TIM7, DISABLE);

}
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-1-25
在线时间
3 小时
 楼主| 发表于 2017-1-25 22:25:59 | 显示全部楼层
签了个到,又有金钱啦。希望大牛们能够驻足看一下。我顶自己一下
回复

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-1-25
在线时间
3 小时
 楼主| 发表于 2017-1-25 22:51:15 | 显示全部楼层
看来大神们白天太累,都睡觉去了吧
回复

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-1-25
在线时间
3 小时
 楼主| 发表于 2017-1-26 11:09:40 | 显示全部楼层
帮帮忙呀,各位
回复

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-1-25
在线时间
3 小时
 楼主| 发表于 2017-1-26 18:04:10 | 显示全部楼层
大神们呀,不要再沉默中消亡呀
回复

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-1-25
在线时间
3 小时
 楼主| 发表于 2017-1-26 18:04:29 | 显示全部楼层
只有自己顶自己啦嘻嘻
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-12-12
在线时间
14 小时
发表于 2017-1-26 22:58:27 | 显示全部楼层
建议楼主把代码的逻辑写一写,还有代码稍微注释一下吧,边看还要边理解挺费神的,而且也没耐心看。有时候可能在代码设计的逻辑就有问题导致最终实现不了,先了解代码的逻辑和功能再看代码内容对发现问题会高效很多,对你快速得到回答也有帮助。
回复

使用道具 举报

4

主题

144

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
345
金钱
345
注册时间
2017-1-18
在线时间
80 小时
发表于 2017-1-30 10:14:48 | 显示全部楼层
看个热闹
回复

使用道具 举报

18

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-12-24
在线时间
29 小时
发表于 2017-1-30 15:30:48 | 显示全部楼层
中断不是还要配一个中断组才可以用的吗?NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
回复

使用道具 举报

18

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2016-12-24
在线时间
29 小时
发表于 2017-1-30 15:45:24 | 显示全部楼层
呀!楼主是不是忘记在main里加定时器初始化的代码了呀,不加定时器不是没得用吗,然后,楼主是不是应该先在进入main的时候先把定时器关掉啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 01:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表