您的位置 首页 模拟

调试ARM遇到:No Cortex-M Device found问题的解决方法

今天上午一直在调试stm32F407的PWM输出,昨晚已经调通通用定时器TIM2,现打算调试据称高级的TIM1。查手册知道TIM1的Ch1与复用,Ch2与GPIOA_…

今天上午一直在调试stm32F407的PWM输出,昨夜现已调通通用定时器TIM2,现计划调试据称高档的TIM1。查手册知道TIM1的Ch1与复用,Ch2与GPIOA_Pin7复用,所以复用代码如下:| GPIO_Pin_8

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //指定第7引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //形式有必要为复用!
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //频率为快速
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉与否对PWM发生无影响
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//指定第7引脚

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource7 | GPIO_PinSource8, GPIO_AF_TIM1);

决心满满的将程序烧了进去,测验GPIOA_Pin7与GPIOA_Pin8均无PWM输出,等再次烧写程序时,却提示No Cortex-M Device found

曾经好好的,现在竟然烧不进去了,想到之前有个哥们儿在群里说他曾经由于芯片烧掉了也呈现了这样的问题,再想到方才我拿着示波器探针来回点击引脚,我不由盗汗连连,莫非我的芯片由于短路烧掉了?!这但是教师刚花了近900元买了不到一周的板子呀!
通过艰苦卓绝的检索,我发现在固件库典范中复用程序是这么写的GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8;
这令我很困惑,GPIO_InitStructure.GPIO_Pin为结构体的一个成员,它能够取多个值么???所以我找到了引脚的宏界说如下:
#define GPIO_Pin_0 ((uint16_t)0x0001) /* Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /* Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /* Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /* Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /* Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /* Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /* Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /* Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /* Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /* Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /* Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /* Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /* Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /* Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /* Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /* Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF) /* All pins selected */
能够看出每个引脚各占一位,其他位为0,正好16位,则GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8;GPIO_Pin_7与GPIO_Pin_8按位“与”,则GPIO_InitStructure.GPIO_Pin = 0x0180,即中心两位为1,其他位为0;我又找到GPIO_Init()函数如下:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd));
/* ————————-Configure the port pins—————- */
/*– GPIO Mode Configuration –*/
for (pinpos = 0x00; pinpos < 0x10; pinpos++)
{
pos = ((uint32_t)0x01) << pinpos;
/* Get the port pins position */
currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
if (currentpin == pos)
{…..
……
……
能够看出 for (pinpos = 0x00; pinpos < 0x10; pinpos++)
{
pos = ((uint32_t)0x01) << pinpos;
循环了16次进行引脚轮询定位,所以GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8;这种写法是能够的。
并且典范中敞开复用功用是这么写的:
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_TIM1);//复用GPIOA_Pin8为TIM1_Ch1,
它竟然分两行写而不是“|”的,人家开发者这么写必定有原因!所以同理翻开GPIO_PinAFConfig()函数的界说发现它并没有进行引脚的循环定位,仅仅进行了一次定位,所以我写的不正确,写到这儿我忽然理解了我的串口为什么只能发不能收了!!!
好,说正事,我估量是我的程序跑飞了,所以程序烧写不进去,也有网友遇到过类似问题,没想到我也遇到了。
我搜集整理了一些呈现该问题的原因以及解决方法,先共享出来:
原因:1。如前所述,程序跑飞了。解决办法:找出问题,加上wdt。
2.JTAG口被程序占用了。这个很重要,写程序前应先进行资源分配,不必占用编程口资源。一旦呈现这个问题,解决方法有二:1)将boot0拉高,然后擦除程序,再将boot0拉低,然后下载程序。2)用串口下载程序,有相关的软件 3)

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/276236.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部