STM32
直播中

李平

7年用户 1247经验值
私信 关注
[问答]

串口中断程序进入了总线错误中断怎么解决?

先上程序
#include "STM32f10x.h"
#include
#include "touwenjian.h"

extern uint8_t ch;
extern uint8_t flog;
int main(void)
{
        USART1_Init();
        nvic_Init();
        while(flog==1)
        {
                 USART_SendData(USART1, ch);
          while( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET );
                flog=0;
        }
}


下面是中断程序
void USART1_IRQHandler(void)
{
        if(USART_GetiTStatus(USART1,USART_IT_RXNE)!=RESET)
        {        
          ch=USART_ReceiveData(USART1);
                while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){}
                flog=1;                 
        }
}

配置程序
void nvic_Init(void)
{   
     NVIC_InitTypeDef NVIC_InitStructure;
     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;        
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;               
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        
    NVIC_Init( NVIC_InitStructure);        
}

void USART1_Init(void)
{
     GPIO_InitTypeDef GPIO_InitStructure;
     USART_InitTypeDef USART_InitStructure;
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);         
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA ,  GPIO_InitStructure);

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_Init(GPIOA ,  GPIO_InitStructure);

        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);
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
     USART_Cmd(USART1, ENABLE);  
}


问题是我硬件仿真的时候他进入了
void BusFault_Handler(void)
{
  /* Go to infinite loop when Bus Fault exception occurs */
  while (1)
  {
  }
}这个总线错误中断



回帖(2)

王静

2024-5-15 09:44:20
单步仿真一下,看看走到哪儿进入的这个中断。
举报

李泳瑜

2024-5-15 16:53:12
请按照以下步骤操作:

1. 确保时钟配置正确:在初始化USART1之前,请确保已正确配置了时钟。这包括设置APB2时钟、设置USART1时钟源等。

2. 检查GPIO配置:确保您已正确配置了USART1的TX和RX引脚。这包括设置引脚模式(例如:推挽输出、浮空输入等)、设置引脚速度等。

3. 检查USART1初始化参数:确保您在调用`USART1_Init()`函数时,传递了正确的参数。这包括波特率、字长、停止位、奇偶校验位等。

4. 检查中断配置:确保您已正确配置了NVIC(嵌套向量中断控制器)以处理USART1中断。这包括设置优先级、使能中断等。

5. 检查中断服务例程:确保您的中断服务例程(ISR)正确处理了USART1中断。这包括读取接收到的数据、发送数据等。

6. 检查总线错误中断:在STM32F10x系列微控制器中,总线错误中断通常与内存访问错误有关。请检查您的程序中是否有不合法的内存访问,例如访问未初始化的指针、数组越界等。

7. 使用调试工具:如果问题仍然存在,建议您使用调试工具(例如:ST-LINK、J-Link等)逐步调试您的程序,以找到导致总线错误中断的确切位置。

8. 更新固件库:确保您使用的STM32F10x固件库是最新版本,以避免可能的已知问题。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分