微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 调试ARM遇到:No Cortex-M Device found问题的解决方法

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

时间:11-10 来源:互联网 点击:
今天上午一直在调试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()函数的定义发现它并没有进行引脚的循环定位,只是进行了一次定位,所以我写的不正确,写到这里我突然明白了我的串口为什么只能发不能收了!!!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top