keil常见问题记录汇总

keil常见问题记录汇总

本文记录了笔者在使用keil5时遇到的各种问题,现集中整理为博客内容,以便后续查阅。其中很多方法都是来源于网络上大佬们的文章,只可惜笔记中的原文链接丢失,具体学自哪个人已经不好考证,如果有朋友知道,或是原作者看见的话,请联系我附上原文链接以示感谢,如有侵权,也请联系我删除该内容。本是拾遗之举,忝为原创 ,还望能给各位读者带来帮助。

代码烧录问题

ST-LINK下载

ST-LINK下载的设置流程已经在图片中依次标记好,读者可以直接按照图片顺序依次设置,设置完成之后保存即可。
魔法棒窗口
Settings窗口Debug选项卡
Settings窗口Flash Download选项卡

ST-LINK下载时SWDIO显示NO target connected

ST-LINK下载方式进行设置时,SWDIO显示NO target connected,即无法检测到下载器。该错误很可能是因为STM32开发板在出厂的时候进行了flash写保护,导致不能识别ST-LINK。笔者用过也见过不少的STM32,确实碰见过一次这种情况,用下面描述的方法就可以解决。
解决方法:
1、将STM32接成Boot0 = 1;Boot1 = 0;即进入ISP编程模式(下个标题会着重说明ISP串口下载模式)。
2、通过USB转TTL与电脑连接(连接方法也可参考下面的ISP串口下载),用FlyMcu进行芯片擦除。
在这里插入图片描述
3、擦除成功后,再设置Boot0 = 0;Boot1 = 0;
4、重新连接,即可在SWDIO中找到ST-LINk的相关信息。
如果上述方法未能解决,也可以检查一下是否为下载器问题,尤其要着重检查线的连接是否良好。

ISP串口下载

想明白ISP是什么最好的办法,就是看它的全拼是什么,这种方法在电子编程领域屡试不爽,下面就简单拓展一下ISP及其相似缩写的全拼,用于类比记忆。 感兴趣的笔者可以进一步搜索什么是在系统编程,在此就不多做赘述。
ISP:In System Programing ,在系统编程
IAP:In Applicating Programing,在应用编程
ICP:In Circuit Programing,在电路编程
在这里插入图片描述

ISP串口下载方式流程如下:
1、配置跳线帽Boot0 = 1;Boot1 = 0;从系统存储器启动,进入ISP模式。
2、USB转TTL和STM32通过串口连接,即TX与RX交叉相连:USB转TTL的RX连接到STM32的TX,USB转TTL的TX连接到STM32的RX。STM32的5V和GND两个引脚接到USB转TTL,3V3悬空即可。
以STM32F103C8T6为例,PA9接USB转TTL的RX,PA10接USB转TTL的TX,GND接在一起、5V接在一起。
3、烧录程序。用FlyMcu烧录流程如下:搜索串口,选择波特率115200(或根据具体情况选择其他波特率),选择hex程序文件,点击开始编程即可。
4、调整跳线帽Boot0 = 0;Boot = 1;重新上电,程序即可正常运行。

无法识别串口设备

电脑无法识别设备

电脑无法识别设备时,排除USB线的问题,通常是缺少CH340的驱动程序。可从网上搜索下载安装。笔者习惯从STC-ISP公司的官网下载最新的烧录软件,软件压缩包内就包含了CH340串口驱动的安装程序,点击安装即可。CH341的驱动可以代替CH340的驱动,也能识别到串口设备。

FlyMcu无法搜索到串口

FlyMcu无法搜索到串口时,可以安装USB虚拟串口驱动,通过VCP_V1.4.0_Setup应用程序安装串口驱动即可。
在这里插入图片描述

软件设置问题

No Browse Information available

当工程中应用的文件较多时,我们通常对某个函数或变量使用“Go To Definition Of ‘XXXXXX’”或“Go To Reference To‘XXXXXX’”,来快速跳转到定义处或参考处。笔者就多次遇到报错“No Browse Information available in ‘…\XXX\XXX’”,无法快速跳转页面。
其实解决方法很简单,只需在魔法棒的Output选项卡中勾选Browse Information,再编译运行即可。
第一步:勾选Browse Information
在这里插入图片描述
第二步:编译运行
在这里插入图片描述

declaration may not appear after executable statement in block

在这里插入图片描述

错误:声明不能出现在可执行语句之后
在C语言的C89标准中,变量的定义只能放在函数开头,放在执行语句的前面;C99标准中才可以放在执行语句之后,即可以在函数中间声明变量。
解决方案有两个:
1、检查代码,将变量的定义放在函数的开头。
2、将编译器的标准修改为C99。修改方法为:点击魔法棒,点击C/C++选项卡,勾选C99 Mode。修改前后对比如下:
在这里插入图片描述
在这里插入图片描述

常见报错处理

multiply defined

当Build Output栏报错为“Error:symbol XXXXXX multiply defined(by XXXX.o and XXXX.o)”,通常为重复定义错误。
在这里插入图片描述
问题多出现于拷贝代码,复制文件之后直接应用等行为,出现该问题的原因就是在同一工程内,所包含的不同子文件中,定义了名字完全相同的函数。
解决函数重复定义的方法就是根据报错栏找到出现问题的文件,注释或者删除掉重复的函数。要注意协调合并相应的功能,尽量避免修改错误的时候又产生新的错误。

cannot open source input file “XXXXXX.h”:No such file or directory

问题产生原因:没能索引到.h文件。
解决方法:将出现问题的头文件索引配置好,即每个头文件所在的文件夹都要包含在Folder Setup中。配置方法如图:
在这里插入图片描述

function “XXXX” declared implicitly

函数XXXX未在.h文件中声明。将函数的声明复制到头文件中即可。
在这里插入图片描述

不报错的错误

编写代码的时候,最怕的不是报错几十个几百个,而是明明没有报错,却不能运行出正确的结果。
笔者最后将踩过的坑写在下面,如果你的代码出现了未知问题却不报错,可以尝试着从我的坑里找去。

变量错误

1、注意变量范围

  • u8是unsigned char
  • u16是unsigned short
  • u32是unsigned int
    假设数值计数超过了256,数值变量类型定义的却是u8,那么程序虽然没有语法错误,却无法得到稳定的正确结果。
    2、注意变量类型
    还是用u8举例。u8 * 和 u8 是两种完全不同的变量类型,强制转换也会出现错误。
    例如,sprintf(x," ",y);x应为char型数组,不可写成指针,也不可定义为u8类型,否则程序运行不出来。

复位后的管脚映射问题

STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能。有时我们为了充分利用MCU I/O口的资源,会把这些端口设置为普通I/O口。

一定要注意JTAG失能后才能使用该管脚,同时注意失能JTAG时也要失能AFIO

例如:STM32C8T6的JTAG管脚就在PB3/4,需要复用为普通IO口才能正常使用

复用功能重映射

具体方法如下:
在GPIO_Configuration(); // 配置使用的 GPIO 口:
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); // 改变指定管脚的映射 GPIO_Remap_SWJ_Disable,SWJ 完全禁用(JTAG+SW-DP),而且管脚映射函数,需要在GPIO配置函数GPIO_Configuration()中

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); // 改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG-DP 禁用 + SW-DP 使能,而且管脚映射函数,需要在GPIO配置函数GPIO_Configuration()中

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

注意:不要忘记在RCC_Configuration()中开启AFIO时钟,
//AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
该函数位于stm32f10x_gpio.c

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值