打印
[STM32F1]

串口中断

[复制链接]
楼主: chenjunt
手机看帖
扫描二维码
随时随地手机跟帖
21
huangchui| | 2021-5-9 18:50 | 只看该作者 回帖奖励 |倒序浏览
USART_ReceiveData在这里读取?

使用特权

评论回复
22
yinxiangh| | 2021-5-9 18:52 | 只看该作者

你的代码是怎么配置的?
不是直接串口读取寄存器吗?

使用特权

评论回复
23
jlyuan| | 2021-5-9 18:54 | 只看该作者
上传一下配置中断的代码。

使用特权

评论回复
24
ousj| | 2021-5-9 18:59 | 只看该作者
单步调试能不能运行?

使用特权

评论回复
25
morrisk| | 2021-5-9 19:02 | 只看该作者

这个函数没定义吗?

NVIC_Configuration();

使用特权

评论回复
26
chenjunt|  楼主 | 2021-5-9 19:05 | 只看该作者
在主函数中改成这样之后,发现好像传递数据还是不行
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]);
                }
        }
        }
}

使用特权

评论回复
27
chenjunt|  楼主 | 2021-5-9 19:07 | 只看该作者
是调用数据就出现bug,程序卡在硬件错误的函数里

使用特权

评论回复
28
chenjunt|  楼主 | 2021-5-9 19:09 | 只看该作者
嗯,对的

使用特权

评论回复
29
chenjunt|  楼主 | 2021-5-9 19:11 | 只看该作者

中端配置程序如下:
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);
}

使用特权

评论回复
30
chenjunt|  楼主 | 2021-5-9 19:13 | 只看该作者
这个都可以的吧,USART_ReceiveData(USART1) 是调用库里的函数

使用特权

评论回复
31
chenjunt|  楼主 | 2021-5-9 19:15 | 只看该作者
单步调试的现象就是开始就跳进了“stm32f10x_it.c”里下面这个函数,应该就是出现了硬件BUG ?
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

使用特权

评论回复
32
chenjunt|  楼主 | 2021-5-9 19:17 | 只看该作者
定义了的,30楼是初始化的函数

使用特权

评论回复
33
zyf部长| | 2021-5-9 19:18 | 只看该作者
char get_ch[8]数组下标越界

使用特权

评论回复
34
chenjunt|  楼主 | 2021-5-9 19:21 | 只看该作者
我重新写了一遍,然后发现问题没有了,不是很懂。
最新的代码如下:
#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);
                }
        }
}

使用特权

评论回复
35
zyf部长| | 2021-5-9 19:23 | 只看该作者
断点调试一下,应该不难的

使用特权

评论回复
36
chenjunt|  楼主 | 2021-5-9 19:27 | 只看该作者
调试发现开始就进入了硬件错误
跳进了“stm32f10x_it.c”里下面这个函数
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

使用特权

评论回复
37
xxmmi| | 2021-5-9 19:30 | 只看该作者
USART1_Puts(get_ch);
这个有可能出问题,get_ch是个数组
有可能你那个USART1_Puts 是要求有结尾的,你这个数组没有标明结束位置(就是不知道需要发送多少个字符)

使用特权

评论回复
38
chenjunt|  楼主 | 2021-5-9 19:33 | 只看该作者

这个是可行的程序,之前的没有用这个,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);
}

使用特权

评论回复
39
chenjunt|  楼主 | 2021-5-9 19:35 | 只看该作者
可能就是某些地方代码写的不规范,才导致出现这种情况的吧。
现在问题算是解决了吧,谢谢指导

使用特权

评论回复
40
supernan| | 2021-5-9 19:38 | 只看该作者
数组定义成全局变量就可以

使用特权

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

本版积分规则