[STM32F1]

32串口中断问题求助

[复制链接]
楼主: Static0
手机看帖
扫描二维码
随时随地手机跟帖
jkl21| | 2017-12-20 17:51 | 显示全部楼层
USART_ReceiveData在这里读取?

使用特权

评论回复
maqianqu| | 2017-12-20 17:52 | 显示全部楼层
Static0 发表于 2017-12-19 17:06
中断处理程序如下:
char get_ch[8];
static int ch_num=0;

你的代码是怎么配置的?

使用特权

评论回复
jkl21| | 2017-12-20 17:53 | 显示全部楼层
Static0 发表于 2017-12-19 17:06
中断处理程序如下:
char get_ch[8];
static int ch_num=0;

不是直接串口读取寄存器吗?

使用特权

评论回复
maqianqu| | 2017-12-20 17:53 | 显示全部楼层
Static0 发表于 2017-12-19 17:06
中断处理程序如下:
char get_ch[8];
static int ch_num=0;

上传一下配置中断的代码。

使用特权

评论回复
dspmana| | 2017-12-20 17:53 | 显示全部楼层
单步调试能不能运行?

使用特权

评论回复
ningling_21| | 2017-12-20 17:56 | 显示全部楼层
Static0 发表于 2017-12-20 16:37
调试的时候发现的初始化之后就进入了硬件错误
stm32f10x_it.c中的这个
void HardFault_Handler(void)

这个函数没定义吗?

NVIC_Configuration();

使用特权

评论回复
Static0|  楼主 | 2017-12-20 19:38 | 显示全部楼层
kingkits 发表于 2017-12-20 16:50
volatile int Rev_flag; // 这样声明这个变量

在主函数中改成这样之后,发现好像传递数据还是不行
int main(void)
{
        delay_init(72);
        delay_ms(10);
        NVIC_Configuration();
        USART_Configuration();
      //LED_GPIO_Configuration();
       
        printf("\r\n  begin.  \n\n");
        while(1)
        {
        int array_num;
        if(Rev_flag)
        {
                Rev_flag=0;
                for(array_num=0;array_num<=8;array_num++)
                {
                        Handle_ch[array_num]=get_ch[array_num];   //这一句必须注释掉,也就是传递数据还是不行?
                        USART1_Put_Char(get_ch[array_num]);
                }
        }
        }
}

使用特权

评论回复
Static0|  楼主 | 2017-12-20 19:39 | 显示全部楼层
dspmana 发表于 2017-12-20 17:50
是中断程序不能运行吗?

是调用数据就出现bug,程序卡在硬件错误的函数里

使用特权

评论回复
Static0|  楼主 | 2017-12-20 19:39 | 显示全部楼层
jkl21 发表于 2017-12-20 17:51
USART_ReceiveData在这里读取?

嗯,对的

使用特权

评论回复
Static0|  楼主 | 2017-12-20 19:40 | 显示全部楼层
中端配置程序如下:
void USART_Configuration(void)
{
        USART_InitTypeDef USART_InitStucture;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        //Configure USART1 clock
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
        //configure USART1 PA9,PA10
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_9;  //TX
        GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10;  //RX
        GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;//Mode_IPU  
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        //USART Mode Config
        USART_InitStucture.USART_BaudRate =115200;
        USART_InitStucture.USART_WordLength =USART_WordLength_8b ;
        USART_InitStucture.USART_StopBits =USART_StopBits_1 ;
        USART_InitStucture.USART_Parity =USART_Parity_No;
        USART_InitStucture.USART_HardwareFlowControl =USART_HardwareFlowControl_None ;
        USART_InitStucture.USART_Mode=USART_Mode_Rx |USART_Mode_Tx ;
       
        USART_Init(USART1,&USART_InitStucture);      
        USART_ClearFlag(USART1, USART_IT_RXNE);                        
        USART_ITConfig (USART1,USART_IT_RXNE,ENABLE);
       
        USART_Cmd(USART1,ENABLE);
}


void NVIC_Configuration()
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig (NVIC_PriorityGroup_0 );
       
        NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn ;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
        NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE ;
       
        NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
Static0|  楼主 | 2017-12-20 19:41 | 显示全部楼层
jkl21 发表于 2017-12-20 17:53
不是直接串口读取寄存器吗?

这个都可以的吧,USART_ReceiveData(USART1) 是调用库里的函数

使用特权

评论回复
Static0|  楼主 | 2017-12-20 19:43 | 显示全部楼层
dspmana 发表于 2017-12-20 17:53
单步调试能不能运行?

单步调试的现象就是开始就跳进了“stm32f10x_it.c”里下面这个函数,应该就是出现了硬件BUG ?
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

使用特权

评论回复
Static0|  楼主 | 2017-12-20 21:31 | 显示全部楼层
ningling_21 发表于 2017-12-20 17:56
这个函数没定义吗?

NVIC_Configuration();

定义了的,30楼是初始化的函数

使用特权

评论回复
fhsxycq| | 2017-12-21 09:21 | 显示全部楼层
char get_ch[8]数组下标越界

使用特权

评论回复
Static0|  楼主 | 2017-12-21 13:53 | 显示全部楼层
我重新写了一遍,然后发现问题没有了,不是很懂。
最新的代码如下:
#define BUF_Size 32

static int ch_num=0;
char get_ch[BUF_Size];                                                                                                                                                                                                       
volatile int Rev_flag=0;

void USART_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

/* config USART1 clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA, ENABLE);

  /* USART1 GPIO config */
  /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART1 Rx (PA.10) as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* USART1 mode config */
  USART_InitStructure.USART_BaudRate = 115200;
  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(USART1, &USART_InitStructure);
        /*Clear the IT bit */
        USART_ClearFlag(USART1, USART_IT_RXNE);                        
        USART_ITConfig (USART1,USART_IT_RXNE,ENABLE);
  USART_Cmd(USART1, ENABLE);
       
        NVIC_PriorityGroupConfig (NVIC_PriorityGroup_0 );
        NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn ;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;  //
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;         //
        NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE ;
       
        NVIC_Init(&NVIC_InitStructure);
}

void USART1_IRQHandler(void)
{
        while(USART_GetFlagStatus(USART1,USART_IT_RXNE)!=RESET)
        {
                get_ch[ch_num]=USART_ReceiveData(USART1);
                ch_num++;
                if(ch_num>=BUF_Size)
                {
                        ch_num =0;
                        Rev_flag=1;
                }
        }
}


int main(void)
{
        delay_init(72);
        delay_ms(10);
        USART_Config();
        delay_ms(10);
        USART1_Puts(" \r  Begin \r\n");
        while(1)
        {
                if(Rev_flag)
                {
                        Rev_flag=0;
                        USART1_Puts(get_ch);
                }
        }
}

使用特权

评论回复
877049204| | 2017-12-21 14:44 | 显示全部楼层
断点调试一下,应该不难的

使用特权

评论回复
Static0|  楼主 | 2017-12-21 15:27 | 显示全部楼层
877049204 发表于 2017-12-21 14:44
断点调试一下,应该不难的

调试发现开始就进入了硬件错误
跳进了“stm32f10x_it.c”里下面这个函数
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

使用特权

评论回复
kingkits| | 2017-12-21 16:06 | 显示全部楼层
本帖最后由 kingkits 于 2017-12-21 16:09 编辑

USART1_Puts(get_ch);
这个有可能出问题,get_ch是个数组
有可能你那个USART1_Puts 是要求有结尾的,你这个数组没有标明结束位置(就是不知道需要发送多少个字符)

使用特权

评论回复
Static0|  楼主 | 2017-12-21 18:51 | 显示全部楼层
kingkits 发表于 2017-12-21 16:06
USART1_Puts(get_ch);
这个有可能出问题,get_ch是个数组
有可能你那个USART1_Puts 是要求有结尾的,你这 ...

这个是可行的程序,之前的没有用这个,Puts里面输出的是字符串。之前的程序

#define uchar unsigned char
#define uint unsigned int       
#define RX_LEN 25600

void USART_Configuration(void);      //串口初始化
void NVIC_Configuration(void);       //中断初始化       
uint RX_DATA_Handler(void);           
void Rev_to_Handle(void);

char get_ch[8];
static int Handle_ch[16];
static int ch_num=0;
int Con_i=0;
volatile int Rev_flag=0;

int main(void)
{
        delay_init(72);
        delay_ms(10);
        NVIC_Configuration();
        USART_Configuration();

  printf("\r\n  begin.  \n\n");
        while(1)
        {
        int array_num;
        if(Rev_flag)
        {
                Rev_flag=0;
                for(array_num=0;array_num<8;array_num++)
                {
                        //Handle_ch[array_num]=get_ch[array_num];
                        USART1_Put_Char(get_ch[array_num]);
                }
        }
        }
}
       
void USART1_IRQHandler(void)
{
        while(USART_GetFlagStatus (USART1,USART_IT_RXNE)!=RESET)   
        {
   get_ch[ch_num]=USART_ReceiveData(USART1);         
         //USART1_Put_Char(get_ch[ch_num++]);
                ch_num++;
         //Con_i ++;
         USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                if(ch_num >= 8)
                {
                        Con_i =0;
                        Rev_flag=1;
                        ch_num=0;
                }
  }
}
       
void USART_Configuration(void)
{
        USART_InitTypeDef USART_InitStucture;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        //Configure USART1 clock
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
        //configure USART1 PA9,PA10
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_9;  //TX
        GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10;  //RX
        GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;//Mode_IPU  
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        //USART Mode Config
        USART_InitStucture.USART_BaudRate =115200;
        USART_InitStucture.USART_WordLength =USART_WordLength_8b ;
        USART_InitStucture.USART_StopBits =USART_StopBits_1 ;
        USART_InitStucture.USART_Parity =USART_Parity_No;
        USART_InitStucture.USART_HardwareFlowControl =USART_HardwareFlowControl_None ;
        USART_InitStucture.USART_Mode=USART_Mode_Rx |USART_Mode_Tx ;
       
        USART_Init(USART1,&USART_InitStucture);       //串口接收中断使能
        USART_ClearFlag(USART1, USART_IT_RXNE);                         //清中断,以免一启用中断后立即产生中断
        USART_ITConfig (USART1,USART_IT_RXNE,ENABLE);
       
        USART_Cmd(USART1,ENABLE);
}


void NVIC_Configuration()
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig (NVIC_PriorityGroup_0 );
       
        NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn ;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
        NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE ;
       
        NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
kingkits| | 2017-12-22 11:49 | 显示全部楼层
随便你吧。
有些东西说了你未必明白

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则