×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-20 发布时间:
|
今天上午一直在调试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)

关键字:调试ARM  No  Cortex-M  Device  found 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会