調試ARM遇到:No Cortex-M Device found問題的解決方法
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!
以前好好的,現(xiàn)在居然燒不進去了,想到之前有個哥們兒在群里說他以前因為芯片燒掉了也出現(xiàn)了這樣的問題,再想到剛才我拿著示波器探針來回點擊引腳,我不禁冷汗連連,難道我的芯片因為短路燒掉了?!這可是老師剛花了近900元買了不到一周的板子呀!
經(jīng)過艱苦卓絕的檢索,我發(fā)現(xiàn)在固件庫范例中復用程序是這么寫的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 */
#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()函數(shù)如下:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00;
{
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));
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;
/*-- 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;
{
pos = ((uint32_t)0x01) << pinpos;
循環(huán)了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,
它居然分兩行寫而不是“|”的,人家開發(fā)者這么寫必定有原因!于是同理打開GPIO_PinAFConfig()函數(shù)的定義發(fā)現(xiàn)它并沒有進行引腳的循環(huán)定位,只是進行了一次定位,所以我寫的不正確,寫到這里我突然明白了我的串口為什么只能發(fā)不能收了?。。?/div>
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_TIM1);//復用GPIOA_Pin8為TIM1_Ch1,
它居然分兩行寫而不是“|”的,人家開發(fā)者這么寫必定有原因!于是同理打開GPIO_PinAFConfig()函數(shù)的定義發(fā)現(xiàn)它并沒有進行引腳的循環(huán)定位,只是進行了一次定位,所以我寫的不正確,寫到這里我突然明白了我的串口為什么只能發(fā)不能收了?。。?/div>
好,說正事,我估計是我的程序跑飛了,所以程序燒寫不進去,也有網(wǎng)友遇到過類似問題,沒想到我也遇到了。
我搜集整理了一些出現(xiàn)該問題的原因以及解決方法,先分享出來:
原因:1。如前所述,程序跑飛了。解決辦法:找出問題,加上wdt。
2.JTAG口被程序占用了。這個很重要,寫程序前應先進行資源分配,不用占用編程口資源。一旦出現(xiàn)這個問題,解決方法有二:1)將boot0拉高,然后擦除程序,再將boot0拉低,然后下載程序。2)用串口下載程序,有相關的軟件 3)
評論