打印
[N32G03x]

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

[复制链接]
691|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JX1417|  楼主 | 2023-4-21 17:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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 | 只看该作者
函数名称写错确实会导致进入硬件异常状态

使用特权

评论回复
5
单片小菜| | 2023-4-25 12:35 | 只看该作者
这种错误,有的时候确实很难找到的,不好找。

使用特权

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

本版积分规则

6

主题

16

帖子

0

粉丝