新聞中心

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

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

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



評(píng)論


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

關(guān)閉