找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2465|回复: 8
打印 上一主题 下一主题
收起左侧

STM32 cubemx生成KEIL5代码后显示参数重定义如何解决?

[复制链接]
回帖奖励 100 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次(中奖概率 80%)
跳转到指定楼层
楼主
ID:694525 发表于 2020-3-17 21:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SignalGenerator_v0.1\SignalGenerator_v0.1: Error: L6200E: Symbol USART1_IRQHandler multiply defined (by stm32f1xx_it.o and usart.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 1 error messages.
"SignalGenerator_v0.1\SignalGenerator_v0.1" - 1 Error(s), 0 Warning(s).
Target not created.
两个确认都有定义USART_1IRQHandler,
这个是STM32F1XX.IT.C的定义段
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}
这个是USART.C的定义段
void USART1_IRQHandler(void)                       
{
        u32 timeout=0;
      
        HAL_UART_IRQHandler(&huart1);        //调用HAL库中断处理公用函数
      
        timeout=0;
    while (HAL_UART_GetState(&huart1) != HAL_UART_STATE_READY)//等待就绪
        {
         timeout++;////超时处理
     if(timeout>HAL_MAX_DELAY) break;               
      
        }

        timeout=0;
        while(HAL_UART_Receive_IT(&huart1, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1
        {
         timeout++; //超时处理
         if(timeout>HAL_MAX_DELAY) break;      
        }
}

请问各位高手这该如何处理?

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:694525 发表于 2020-3-17 21:56 | 只看该作者
补充一下,两个片段只要名字稍有差别就会出现大量编译错误(原因在于项目文件比较多),所以改函数名的方法不可行,麻烦各位了。
回复

使用道具 举报

板凳
ID:711971 发表于 2020-3-20 01:32 | 只看该作者
在:HAL_UART_IRQHandler函数中去找 callback,可以找hal 的uart例程看看
HAL库中的这些callback是weak 申明,是可以被重写的
USART1_IRQHandler已经是hal uart库内部实现函数了,没必要重写

而且你在终端函数里使用while容易阻塞,中断函数内都是只做简单事情,如计数等
回复

使用道具 举报

地板
ID:466599 发表于 2020-3-20 09:46 | 只看该作者
把这个是STM32F1XX.IT.C中的函数屏蔽掉就OK了
回复

使用道具 举报

5#
ID:389856 发表于 2020-3-20 16:19 | 只看该作者
检查一下USART.h文件里有没有声明这个函数,头文件里面已经包含这个函数了
回复

使用道具 举报

6#
ID:419968 发表于 2020-3-20 17:38 | 只看该作者
把STM32F1XX.IT.C 定义的 void USART1_IRQHandler(void)  改成 __weak void USART1_IRQHandler(void)

WEAK:弱定义,如果外部文件声明了标号,则优先使用外部文件定义的标号,如果外部文件没有定义也不出错。需要注意的是:这个不是ARM的指令,是编译器的,放在这里是为了方便
回复

使用道具 举报

7#
ID:513241 发表于 2020-3-20 20:54 | 只看该作者
cubeMX生成代码把所有中断处理函数都生成在 stm32f1xx_it.c 里,去注释掉就行。改函数名当然不行,中断函数名固定这个。另外使用官方的中断函数有问题的,长度固定、数据发多了会死掉,自己重写中断函数比可控。
回复

使用道具 举报

8#
ID:513241 发表于 2020-3-20 20:56 | 只看该作者
方法二:重写串口中断函数 /**   * @brief        串口中断函数,在stm32f0xx_it.c中注释同名   * @param        None   * @retval        None   */ void USART1_IRQHandler(void) {         uint8_t Res;                  if((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET))//接收中断         {                 Res = USART1->RDR;//读取接收到的数据                 //接收和帧完成判断         }          /* USER CODE END USART1_IRQn 1 */ }
回复

使用道具 举报

9#
ID:513241 发表于 2020-3-20 20:58 | 只看该作者
自己补充一下接收数据和结束帧处理吧,另外mian函数里要HAL_UART_Receive_IT(&huart1,&uart_Rx_Buf,1);//打开串口中断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表