C USART接收中断stm32

C USART接收中断stm32,c,stm32,interruption,usart,C,Stm32,Interruption,Usart,我在地图上画了一张图,我正在研究STM32和USART中断。在配置USART1和使能接收中断后。接收中断未检测到的问题???如果不知道您使用的是哪个特定处理器、哪个板和/或哪个编译器,则很难回答此类问题。但为了给大家提供帮助,下面是我的代码 这是我的GPIO和NVIC初始化代码,使用Sourcery CodeBench Lite,将STM32F4处理器安装在定制板上 GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitSt

我在地图上画了一张图,我正在研究STM32和USART中断。在配置USART1和使能接收中断后。接收中断未检测到的问题???

如果不知道您使用的是哪个特定处理器、哪个板和/或哪个编译器,则很难回答此类问题。但为了给大家提供帮助,下面是我的代码

这是我的GPIO和NVIC初始化代码,使用Sourcery CodeBench Lite,将STM32F4处理器安装在定制板上

GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3);  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// Enable the USART RX Interrupt 
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
当然,根据处理器、电路板和中断优先级的不同,您的设置也会有所不同

这是我的中断处理程序代码。在我的开发环境中,此处理程序在我的启动程序集文件中声明为对默认\u处理程序的弱引用

。。。因此,只要我提供这个中断处理程序的新声明和实现,弱引用就会被替换。下面是我的代码

//Interrupt handler declaration
void USART3_IRQHandler();

如果你使用C++,你需要声明如下:

//Interrupt handler declaration in C/C++
#ifdef __cplusplus
 extern "C" {
#endif
void USART3_IRQHandler();
#ifdef __cplusplus
 }
#endif
下面是中断处理程序的实现

//Interrupt handler implementation
void USART3_IRQHandler()
{
    //handle interrupt
}

如果不知道您使用的是哪个特定处理器、使用的是哪个板和/或使用的是哪个编译器,就很难回答这样的问题。但为了给大家提供帮助,下面是我的代码

这是我的GPIO和NVIC初始化代码,使用Sourcery CodeBench Lite,将STM32F4处理器安装在定制板上

GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3);  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// Enable the USART RX Interrupt 
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
当然,根据处理器、电路板和中断优先级的不同,您的设置也会有所不同

这是我的中断处理程序代码。在我的开发环境中,此处理程序在我的启动程序集文件中声明为对默认\u处理程序的弱引用

。。。因此,只要我提供这个中断处理程序的新声明和实现,弱引用就会被替换。下面是我的代码

//Interrupt handler declaration
void USART3_IRQHandler();

如果你使用C++,你需要声明如下:

//Interrupt handler declaration in C/C++
#ifdef __cplusplus
 extern "C" {
#endif
void USART3_IRQHandler();
#ifdef __cplusplus
 }
#endif
下面是中断处理程序的实现

//Interrupt handler implementation
void USART3_IRQHandler()
{
    //handle interrupt
}

下面是配置STM32 USART USART3和中断处理程序的简短代码

配置和初始化

句柄接收中断


下面是配置STM32 USART USART3和中断处理程序的简短代码

配置和初始化

句柄接收中断

处理接收中断的示例编码

处理接收中断的示例编码


我之前对EclipseGCC也有同样的问题,最后我发现了问题。问题不在于代码,而在于trace_printf,如果您在运行时使用此API打印任何细节,trace_printf将破坏uart,并且您的接收中断将永远不会出现。因此,请尝试一下,不要使用它并设置断点来查看您接收到的内容。

我之前对EclipseGCC也有同样的问题,最后我发现了问题。问题不在于代码,而在于跟踪打印,如果您在运行时使用此API打印任何详细信息,trace\u printf将中断uart,您的接收中断将永远不会出现。因此,请尝试一下,不要使用它,并设置断点以查看您接收到的内容。

确保不要在尝试中断的同一usart上调用HAL\u uart\u Transmit。这是因为该函数调用UART_WaitOnFlagUntilTimeout来禁用中断。上面提到的用户7404301最有可能调用它的跟踪printf。

确保不要在尝试中断的同一个usart上调用HAL\u UART\u传输。这是因为该函数调用UART_WaitOnFlagUntilTimeout来禁用中断。上面提到的用户7404301最有可能调用它的跟踪printf。

第一件事:USART自身是否正常工作?你能在没有中断的情况下接收数据吗?因此,只需手动读取接收寄存器?首先,USART自身是否正常工作?你能在没有中断的情况下接收数据吗?所以,只需手动读取接收寄存器?请同时对您的答案添加一些解释。请您也给我的答案加上一些解释。我把我的项目改成C++,每次中断都应该登记在默认处理程序中。非常感谢。我把我的项目改成C++,每次中断都要进入默认处理程序…非常感谢。似乎分配中断处理程序的行丢失似乎分配中断处理程序的行丢失Hi,我这样做是因为我必须从调制解调器发送和接收回复。我应该使用什么功能来传输?此外,Uart RX处理程序在调用HAL_Uart_传输后触发,但没有收到任何字节。您好,我这样做是因为我必须从调制解调器发送和接收应答。我应该使用什么功能来传输?此外,Uart RX处理程序在调用HAL_Uart_传输后触发,但未收到任何字节。