stm32f103 串口2接收中断

Creator_莫言 2017-04-13 04:08:09
问题描述:串口2配置如下,与PC端连接,发送数据PC端可以正常收到,当PC端发送数据时。板子卡死。
问题:请问下面的中断配置哪里不对吗?我替换USART_IT_RXNE成USART_IT_TC也会卡死。就好像只要触发串口2的中断都会死掉。串口1也是一样


/* Enable USART1 and GPIOA clock */
RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1 |
RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_USART2, ENABLE);



/* Configure USART2 Rx (PA3) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART2 Tx (PA2) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
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(USART2, &USART_InitStructure);

/* USART2 recv event interrupt */
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
/* Enable USART2 */
USART_Cmd(USART2, ENABLE);



/* USART2 recv interrupt */
NVIC_InitTypeDef NVIC_InitStructureUart;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructureUart.NVIC_IRQChannel=USART2_IRQn;
NVIC_InitStructureUart.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructureUart.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructureUart.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructureUart);



void USART2_IRQHandle(void)
{
uart_printf("USART2_IRQHandle\r\n");
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)
{
uart_printf("USART2_IRQHandle\r\n");
uint8_t RX_dat = USART_ReceiveData(USART2);
}
}
...全文
1167 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
无知者无谓 2017-04-19
  • 打赏
  • 举报
回复
你需要在函数void USART2_IRQHandle(void)结束时加入HAL_UART_IRQHandler(&huart2); 我没有去修改 USART2_IRQHandle函数,而是重新定义了 void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart) void HAL_UART_TxCpltCallback(UART_HandleTypeDef* huart) 这两个函数。 这里需要显式的调用HAL_UART_Receive_IT(huart, &c_recv, sizeof(c_recv));,接收buffer满后会自动调用HAL_UART_RxCpltCallback,所以我的buffer大小为1,每次接收后都需要调用一次HAL_UART_Receive_IT。
role_shen 2017-04-14
  • 打赏
  • 举报
回复
这个问题我也遇到过,原因是因为卡死在了UART_WaitOnFlagUntilTimeout(...)里面了,调用Hal_getTick()函数后,uwTick一直没有递增,没有递增的原因是因为rcc没有中断,没有中断的原因,我怀疑是因为串口已经在中断函数,rcc没有能中断串口的中断函数,我估计是这个原因,但是不知道该怎么解决才好,网上有评论说是可以把该函数里面第一个if判断下屏蔽了(if(status == reset)),但是我觉得不应该这样做,而且解决了这个,也不好实现不定长度接收,所以最后我还是用了dma方式接收。我当时做是开双串口,http://download.csdn.net/detail/role_shen/9810926,这个是我当时实现代码
Creator_莫言 2017-04-14
  • 打赏
  • 举报
回复
引用 1 楼 u012388993 的回复:
原先遇到过这种问题,进入中断后无法退出,遂写了这一篇文章,可以参考一下:http://blog.csdn.net/u012388993/article/details/60961855 相比于cubemx配置的UART,主要是在于标志位置位的那部分代码区别。 后来开发F469时候又遇到,转而发现可能是由于接收处理上的问题,于是将串口收发改为DMA方式,实现任意长度,可以参考这位博主的文章: http://blog.csdn.net/youmeichifan/article/details/51750435
感谢你的回答,我还没有尝试DMA接收方式,但是我想中断接收肯定也是可以的,只是不知道为什么我这里不行
Moran_Hansir 2017-04-13
  • 打赏
  • 举报
回复
引用 1 楼 arenascat的回复:
原先遇到过这种问题,进入中断后无法退出,遂写了这一篇文章,可以参考一下:http://blog.csdn.net/u012388993/article/details/60961855 相比于cubemx配置的UART,主要是在于标志位置位的那部分代码区别。 后来开发F469时候又遇到,转而发现可能是由于接收处理上的问题,于是将串口收发改为DMA方式,实现任意长度,可以参考这位博主的文章: http://blog.csdn.net/youmeichifan/article/details/51750435
请问具体是什么原因呀?
arenascat 2017-04-13
  • 打赏
  • 举报
回复
原先遇到过这种问题,进入中断后无法退出,遂写了这一篇文章,可以参考一下:http://blog.csdn.net/u012388993/article/details/60961855 相比于cubemx配置的UART,主要是在于标志位置位的那部分代码区别。 后来开发F469时候又遇到,转而发现可能是由于接收处理上的问题,于是将串口收发改为DMA方式,实现任意长度,可以参考这位博主的文章: http://blog.csdn.net/youmeichifan/article/details/51750435

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧