JX1417 发表于 2023-4-21 17:37

N32G032串口接收卡死问题(已解决)

本帖最后由 JX1417 于 2023-4-23 09:27 编辑

以下是配置了一个串口中断接收到程序,打印没问题,接收到时候就直接卡死程序,哪位大佬帮忙看看什么问题


void uart_init(unsigned long bound)
{

GPIO_InitType GPIO_InitStructure;
USART_InitType USART_InitStructure;
NVIC_InitType NVIC_InitStructure;

/* 启用 GPIO 时钟 */
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA,启用);

/* 启用 USART1 时钟 */
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_USART1,启用);

/* 初始化GPIO_InitStructure */
GPIO_InitStruct(&GPIO_InitStructure);
/* 将 USART1 Tx 配置为备用函数推挽 */
GPIO_InitStructure.Pin = GPIO_PIN_9;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.GPIO_Alternative = GPIO_AF4_USART1;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);

/* 将 USART1 Rx 配置为备用函数推挽 */
GPIO_InitStructure.Pin = GPIO_PIN_10;
GPIO_InitStructure.GPIO_Alternative = GPIO_AF4_USART1;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);


/* USARTy 和 USART1 配置 ------------------------------------------------------*/
USART_InitStructure.波特率 = 绑定;
USART_InitStructure.字长 = USART_WL_8B;
USART_InitStructure.停止位 = USART_STPB_1;
USART_InitStructure.奇偶校验 = USART_PE_NO;
USART_InitStructure.硬件流量控制 = USART_HFCTRL_NONE;
USART_InitStructure.模式 = USART_MODE_RX |USART_MODE_TX;

/* 配置 USART1 */
USART_Init(USART1, &USART_InitStructure);

/* 启用 USART1 中断 */
NVIC_InitStructure.NVIC_IRQChannel = USART1_2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* 启用 USART1 接收中断 */
USART_ConfigInt(USART1, USART_INT_RXDNE, 启用);
//USART_ConfigInt(USART1, USART_INT_TXDE, ENABLE);
/* 启用 USART1*/
USART_Enable(USART1, ENABLE);

}

int fputc(int ch, FILE* f){
USART_SendData(USART1, (uint8_t)ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXDE) == RESET)

;

返回(通道);
}

/*------------------------------------------------------------------------------
函数名称 : USART1_IRQHandler描述 : 通信 USART 介入处理程序
输入 : 无 输出 : 无 返回 : 无


------------------------------------------------------------------------------*/
void USART1_IRQHandler
(void)
{
静态 U8 分辨率;

if (USART_GetIntStatus(USART1, USART_INT_RXDNE) != RESET)
{
res=USART_ReceiveData(USART1);printf(“feng:%d \r\n”,res);

}
USART_ClrIntPendingBit(USART1,USART_INT_RXDNE);

               
}

jobszheng 发表于 2023-4-21 18:00

楼主不要在中断中添加printf()函数。
可以在中断里面添加一个断点。
使用串口助手发送一个字符后,看看程序是否停止在断电点。
然后,再通过内存查看res变量,是不是你发送的字符,即可验证串口接收的正确性了

JX1417 发表于 2023-4-23 09:30

本帖最后由 JX1417 于 2023-4-23 09:33 编辑

jobszheng 发表于 2023-4-21 18:00
楼主不要在中断中添加printf()函数。
可以在中断里面添加一个断点。
使用串口助手发送一个字符后,看看程序 ...
问题已解决,查看了官方给出的例程,发现我的中断函数名字跟官方给的不一样,修改后程序可正常运行
//void USART1_2_IRQHandler(void)
//{
//         static u8 res;

//         if (USART_GetIntStatus(USART1, USART_INT_RXDNE) != RESET)
//    {
//                        res=USART_ReceiveData(USART1);
//                        printf("feng:%d \r\n",res);
//      }
////      USART_ClrIntPendingBit(USART1, USART_INT_RXDNE);

//               
//}

jobszheng 发表于 2023-4-23 10:06

函数名称写错确实会导致进入硬件异常状态

单片小菜 发表于 2023-4-25 12:35

这种错误,有的时候确实很难找到的,不好找。
页: [1]
查看完整版本: N32G032串口接收卡死问题(已解决)