<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 調(diào)試ARM遇到:No Cortex-M Device found問(wèn)題的解決方法

          調(diào)試ARM遇到:No Cortex-M Device found問(wèn)題的解決方法

          作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò) 收藏
          今天上午一直在調(diào)試stm32F407的PWM輸出,昨晚已經(jīng)調(diào)通通用定時(shí)器TIM2,現(xiàn)打算調(diào)試據(jù)稱高級(jí)的TIM1。查手冊(cè)知道TIM1的Ch1與復(fù)用,Ch2與GPIOA_Pin7復(fù)用,于是復(fù)用代碼如下:| GPIO_Pin_8

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //指定第7引腳
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //模式必須為復(fù)用!
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //頻率為快速
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉與否對(duì)PWM產(chǎn)生無(wú)影響
          GPIO_Init(GPIOA, &GPIO_InitStructure);

          本文引用地址:http://www.ex-cimer.com/article/201611/317473.htm

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

          GPIO_Init(GPIOA, &GPIO_InitStructure);

          GPIO_PinAFConfig(GPIOA, GPIO_PinSource7 | GPIO_PinSource8, GPIO_AF_TIM1);

          信心滿滿的將程序燒了進(jìn)去,測(cè)試GPIOA_Pin7與GPIOA_Pin8均無(wú)PWM輸出,等再次燒寫程序時(shí),卻提示No Cortex-M Device found!

          以前好好的,現(xiàn)在居然燒不進(jìn)去了,想到之前有個(gè)哥們兒在群里說(shuō)他以前因?yàn)樾酒瑹袅艘渤霈F(xiàn)了這樣的問(wèn)題,再想到剛才我拿著示波器探針來(lái)回點(diǎn)擊引腳,我不禁冷汗連連,難道我的芯片因?yàn)槎搪窡袅??!這可是老師剛花了近900元買了不到一周的板子呀!
          經(jīng)過(guò)艱苦卓絕的檢索,我發(fā)現(xiàn)在固件庫(kù)范例中復(fù)用程序是這么寫的GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8;
          這令我很困惑,GPIO_InitStructure.GPIO_Pin為結(jié)構(gòu)體的一個(gè)成員,它可以取多個(gè)值么???于是我找到了引腳的宏定義如下:
          #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 */
          可以看出每個(gè)引腳各占一位,其他位為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()函數(shù)如下:
          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;
          循環(huán)了16次進(jìn)行引腳輪詢定位,所以GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8;這種寫法是可以的。
          而且范例中開(kāi)啟復(fù)用功能是這么寫的:
          GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_TIM1);
          GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_TIM1);//復(fù)用GPIOA_Pin8為TIM1_Ch1,
          它居然分兩行寫而不是“|”的,人家開(kāi)發(fā)者這么寫必定有原因!于是同理打開(kāi)GPIO_PinAFConfig()函數(shù)的定義發(fā)現(xiàn)它并沒(méi)有進(jìn)行引腳的循環(huán)定位,只是進(jìn)行了一次定位,所以我寫的不正確,寫到這里我突然明白了我的串口為什么只能發(fā)不能收了!?。?/div>
          好,說(shuō)正事,我估計(jì)是我的程序跑飛了,所以程序燒寫不進(jìn)去,也有網(wǎng)友遇到過(guò)類似問(wèn)題,沒(méi)想到我也遇到了。
          我搜集整理了一些出現(xiàn)該問(wèn)題的原因以及解決方法,先分享出來(lái):
          原因:1。如前所述,程序跑飛了。解決辦法:找出問(wèn)題,加上wdt。
          2.JTAG口被程序占用了。這個(gè)很重要,寫程序前應(yīng)先進(jìn)行資源分配,不用占用編程口資源。一旦出現(xiàn)這個(gè)問(wèn)題,解決方法有二:1)將boot0拉高,然后擦除程序,再將boot0拉低,然后下載程序。2)用串口下載程序,有相關(guān)的軟件 3)



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();