你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F072 Nucleo开发板 USART2串口通信问题

[复制链接]
愤怒的小宝 提问时间:2018-4-5 18:10 /
STM32新手,刚开始学习,尝试用STM32F072 Nucleo开发板和AS608指纹模块做一个指纹识别的应用,遇到的一个问题是开发板和指纹模块不能用串口(USART2)通信。用的库是stm32f0xx_HAL_Driver,串口配置程序如下
void usart2_init(u32 bound)
{  
        GPIO_InitTypeDef GPIO_InitStructure;

   __GPIOA_CLK_ENABLE();  // GPIOA时钟
  __USART2_CLK_ENABLE();   //串口2时钟

                 //USART2_TX   PA2
   GPIO_InitStructure.Pin = GPIO_PIN_2; //PA2
  GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;        //复用推挽输出
  HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA2

    //USART2_RX          PA3
  GPIO_InitStructure.Pin = GPIO_PIN_3;
  GPIO_InitStructure.Mode = GPIO_MODE_INPUT;//浮空输入
  HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA3
       
        huart2.Instance = USART2;
  huart2.Init.BaudRate = bound;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED ;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  HAL_UART_Init(&huart2);
        __HAL_UART_ENABLE(&huart2);       //使能串口2
//        __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
        //开启中断
        HAL_NVIC_SetPriority(USART2_IRQn,1,0);
        HAL_NVIC_EnableIRQ(USART2_IRQn);
}


使用串口助手能收到单片机发送的控制指纹模块的指令,在串口助手发送数据到单片机,也能进入接收中断函数。然后将此指令用串口助手发送到指纹模块,能在串口助手上收到正确的应答包。可是单片机和指纹模块却不能正常通信,也不能进入接收中断函数。。恳请各路大神支支招,在此先谢过了。
收藏 评论12 发布时间:2018-4-5 18:10

举报

12个回答
无薪税绵 回答时间:2018-4-5 18:35:06
请检查一下,单片机的TX、RX和指纹的TX、RX,是否连接对了。
我估计是反了。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

愤怒的小宝 回答时间:2018-4-5 18:49:22
无薪税绵 发表于 2018-4-5 18:35
请检查一下,单片机的TX、RX和指纹的TX、RX,是否连接对了。
我估计是反了。 ...

又检查了一遍,单片机TX接指纹RX,没错啊,,很恼火
wenyangzeng 回答时间:2018-4-5 19:03:12
本帖最后由 wenyangzeng 于 2018-4-5 19:20 编辑

楼主把这句屏蔽掉了 __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);禁止了接收中断。
既然分开用串口助手都能进行通讯,那就应该检查一下单片机和指纹模块的硬件连接是否正常,尤其是RXD和TXD可能需要交叉对接的。。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

愤怒的小宝 回答时间:2018-4-5 19:31:25
wenyangzeng 发表于 2018-4-5 19:03
楼主把这句屏蔽掉了 __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);禁止了接收中断。
既然分开用串口助手 ...

隐约感觉到可能是硬件电路有问题,因为我的蜂鸣器处于关闭状态的,当我把指纹模块的3.3v 和GND接山单片机时蜂鸣器会有很小的滴滴声(凑到耳朵跟前才能听见),拔掉指纹模块电源时,这个声音就消失了,说明这个指纹模块对单片机的引脚是有影响的,有可能是模块干扰了TX和RX引脚,导致不能正常通信。。。可是不知道怎么解决,
wenyangzeng 回答时间:2018-4-5 19:54:46
愤怒的小宝 发表于 2018-4-5 19:31
隐约感觉到可能是硬件电路有问题,因为我的蜂鸣器处于关闭状态的,当我把指纹模块的3.3v 和GND接山单片机 ...

可以先对指纹模块单独外部供电。
无薪税绵 回答时间:2018-4-5 20:28:28
愤怒的小宝 发表于 2018-4-5 19:31
隐约感觉到可能是硬件电路有问题,因为我的蜂鸣器处于关闭状态的,当我把指纹模块的3.3v 和GND接山单片机 ...

建议楼主使用示波器,
看看TX和RX,是不是被干扰了。

要不,上个原理图看看,是不是电路错了。
七哥 回答时间:2018-4-6 02:16:20
本帖最后由 toofree 于 2018-4-6 02:18 编辑

还是上程序和原理图吧!
之前就有一位,跟你现在说的问题非常像,也是串口指纹模块。硬件能排除的都排除过了。只剩下程序了,说他程序有问题,他非常确定的说没问题,但是不提供程序。
最终还是中断服务函数用法有问题导致的丢数据。
跟你说这的目的是想告诉你,你以为的不一定就是你以为的。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

Angel_YY_ST 回答时间:2018-4-6 07:18:28
提示: 作者被禁止或删除 内容自动屏蔽
愤怒的小宝 回答时间:2018-4-6 19:46:14
toofree 发表于 2018-4-6 02:16
还是上程序和原理图吧!
之前就有一位,跟你现在说的问题非常像,也是串口指纹模块。硬件能排除的都排除过 ...

我现在USART1了,串口配置的流程跟上面一样,现在的情况是单片机发的指令能被指纹模块接收到,指纹模块返回应答数据包,然后能进入中断服务程序,但是就卡在中断服务里面了,调试模式下全速运行,能看到RDR寄存器有值,查看指纹模块手册后发现这个值正是应答数据包的第一个字节。。。这是我的中断服务函数,返回的数据包读不出来。
void USART1_IRQHandler(void)
{        
       
        if(__HAL_USART_GET_FLAG(&huart1, USART_FLAG_RXNE) == SET)
        {         
                BeepNormal(100);  //响应中断程序提示,蜂鸣器嘀一声
                if(USART1_RX_COUNT < USART1_MAX_RECV_LEN) //接收缓冲区未满
                {
                        //HAL_USART_Receive_IT(&huart1,&USART1_RX_BUF[USART1_RX_COUNT],1);
                        USART1_RX_BUF[USART1_RX_COUNT] = USART1->RDR;
                        USART1_RX_COUNT++;
                }
        }
}   
愤怒的小宝 回答时间:2018-4-6 19:51:12
Angel_YY 发表于 2018-4-6 07:18
从现象上开硬件连接的问题可能性大一些,如果还是不行,建议楼主串口RX和TX上拉10K电阻试试,串口协议要求T ...

不知道是什么原因了,换成USART1之后就可以通信了,能进入中断服务程序,问题是问题是返回的数据包读不出来,,这是我的中断服务程序,,请帮忙看看
void USART1_IRQHandler(void)
{        
       
        if(__HAL_USART_GET_FLAG(&huart1, USART_FLAG_RXNE) == SET)
        {         
                BeepNormal(100); 响应中断服务程序提示,蜂鸣器嘀一声
                if(USART1_RX_COUNT < USART1_MAX_RECV_LEN) //½ÓÊÕ»º³åÇøδÂú
                {
                        //HAL_USART_Receive_IT(&huart1,&USART1_RX_BUF[USART1_RX_COUNT],1);
                        USART1_RX_BUF[USART1_RX_COUNT] = USART1->RDR; //接收缓冲区未满
                        USART1_RX_COUNT++;
                }
        }
}   
七哥 回答时间:2018-4-6 20:46:12
本帖最后由 toofree 于 2018-4-6 20:50 编辑
愤怒的小宝 发表于 2018-4-6 19:46
我现在USART1了,串口配置的流程跟上面一样,现在的情况是单片机发的指令能被指纹模块接收到,指纹模块返 ...
BeepNormal(100);  这条不要在串口中断中执行,太占时间。定义个全局变量,作为有串口中断的标志,在主循环中判断标志,去执行蜂鸣器操作。
jh309 回答时间:2018-7-12 13:23:38
很有用的资料,值得参考!
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版