打印
[STM32F1]

stm32f107使能了AFIO,但是PE2,3,4,5,6不受控制

[复制链接]
4794|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
easier_life|  楼主 | 2014-11-15 20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 easier_life 于 2014-11-15 20:12 编辑

我的情况是这样的:
1、开启了外部中断,使能了AFIO;
2、在一个中断相应函数中控制PE2、3、4、5、6的输出电平;
3、PE2~6的管脚配置为GPIO_Mode_Out_PP;
4、IO的时钟已经使能
但是,结果如下:
a、使用GPIO_SetBits和GPIO_ResetBits函数都不能改变端口的输出电平;
b、调试看到输出的电平一直是低电平,GPIOE->ODR中的相应位已经显示为1,但是并没有输出;

查看手册发现PE2~6的默认功能是TRACECK、TRACED0~TRACED3,如何让这几个管脚当做普通IO脚来使用呢?
是不是应该关闭JTAG功能,只保留SW-DP功能?
请各位指点,谢谢
沙发
mmuuss586| | 2014-11-15 23:30 | 只看该作者
F1的PE口没用过;
用过F4的PE口,没啥特殊;
你代码发上来看看

使用特权

评论回复
板凳
airwill| | 2014-11-16 14:31 | 只看该作者
从手册看, 这些脚有个功能脚 TRACE(ETM 模块), 不过不大可能是这个外设功能.
我感觉更大的可能性是你的GPIO寄存器设置在别的地方被误该了, 借助调试器检查一下寄存器配置吧

使用特权

评论回复
地板
easier_life|  楼主 | 2014-11-16 23:32 | 只看该作者
mmuuss586 发表于 2014-11-15 23:30
F1的PE口没用过;
用过F4的PE口,没啥特殊;
你代码发上来看看

谢谢回复,稍后我把代码贴上来

使用特权

评论回复
5
easier_life|  楼主 | 2014-11-16 23:33 | 只看该作者
airwill 发表于 2014-11-16 14:31
从手册看, 这些脚有个功能脚 TRACE(ETM 模块), 不过不大可能是这个外设功能.
我感觉更大的可能性是你的GPIO ...

恩,好的,谢谢!

使用特权

评论回复
6
easier_life|  楼主 | 2014-11-16 23:37 | 只看该作者
我的配置代码是这样的:

void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        /* Configure IO connected to LD1, LD2, LD3 and LD4 leds *********************/       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_7;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOD, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14 | GPIO_Pin_15;       
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOD, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;                          
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOE, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 ;         
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOE, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    GPIO_Init(GPIOA,&GPIO_InitStructure);

}

//系统中断管理
void NVIC_Configuration(void)
{
          /* Configure the NVIC Preemption Priority Bits */  
                NVIC_InitTypeDef   NVIC_InitStructure;
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   

                  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;           
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;   
        NVIC_Init(&NVIC_InitStructure);

                NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;  
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  
        NVIC_Init(&NVIC_InitStructure);


        #ifdef  VECT_TAB_RAM  
          /* Set the Vector Table base location at 0x20000000 */
          NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
        #else  /* VECT_TAB_FLASH  */
          /* Set the Vector Table base location at 0x08000000 */
          NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
        #endif
}

//配置系统时钟,使能各外设时钟
void RCC_Configuration(void)
{
        SystemInit();       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB
                                                   | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO
                           | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,  ENABLE );

}



void EXTI_Configuration(void)
{
           EXTI_InitTypeDef  EXTI_InitStructure;
           //清空中断标志
           EXTI_ClearITPendingBit(EXTI_Line0);
           EXTI_ClearITPendingBit(EXTI_Line10);
           EXTI_ClearITPendingBit(EXTI_Line11);
           EXTI_ClearITPendingBit(EXTI_Line12);
          
           EXTI_ClearITPendingBit(EXTI_Line14);
           EXTI_ClearITPendingBit(EXTI_Line15);

           GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
           GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource13);

       EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line13 ;
       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
       EXTI_InitStructure.EXTI_LineCmd=ENABLE;  
       EXTI_Init(&EXTI_InitStructure);

          GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource11);
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource12);
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource14);
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource15);

          EXTI_InitStructure.EXTI_Line =  EXTI_Line11| EXTI_Line12| EXTI_Line14| EXTI_Line15;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling ;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);


          GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource10);

          EXTI_InitStructure.EXTI_Line =  EXTI_Line10;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);
}



void EXTI0_IRQHandler(void)
{

       GPIO_SetBits(GPIOD,GPIO_Pin_2);
           GPIO_ResetBits(GPIOD,GPIO_Pin_3);
       EXTI_ClearITPendingBit(EXTI_Line0);
}

void EXTI15_10_IRQHandler(void)
{

           if(EXTI_GetITStatus(EXTI_Line10)!=RESET)
        {

                GPIO_ResetBits(GPIOE, GPIO_Pin_2);
                EXTI_ClearITPendingBit(EXTI_Line10) ;       
        }
        if(EXTI_GetITStatus(EXTI_Line11)!=RESET)
        {

                 GPIO_ResetBits(GPIOE, GPIO_Pin_3);

                EXTI_ClearITPendingBit(EXTI_Line11) ;       
        }
        if(EXTI_GetITStatus(EXTI_Line12)!=RESET)
        {

                GPIO_ResetBits(GPIOE, GPIO_Pin_4);
                EXTI_ClearITPendingBit(EXTI_Line12) ;       
        }
        if(EXTI_GetITStatus(EXTI_Line14)!=RESET)
        {
                GPIO_ResetBits(GPIOE, GPIO_Pin_2);
                EXTI_ClearITPendingBit(EXTI_Line14) ;       
        }
        if(EXTI_GetITStatus(EXTI_Line15)!=RESET)         //暂时未添加响应函数
        {
                   GPIO_SetBits(GPIOE, GPIO_Pin_3);

                EXTI_ClearITPendingBit(EXTI_Line15) ;       
        }
         if(EXTI_GetITStatus(EXTI_Line13)!=RESET)
        {
           GPIO_SetBits(GPIOE, GPIO_Pin_4);
       EXTI_ClearITPendingBit(EXTI_Line13);
         }

}


void Init_All_Periph(void)
{
        RCC_Configuration();       
        NVIC_Configuration();
        EXTI_Configuration();
        GPIO_Configuration();

}



   int main(void)
{  
        Init_All_Periph();

   while(1) ;
}
如果大家愿意看代码我将不胜感激,恳请各位大侠帮忙,谢谢!

使用特权

评论回复
7
mmuuss586| | 2014-11-17 12:20 | 只看该作者
easier_life 发表于 2014-11-16 23:37
我的配置代码是这样的:

void GPIO_Configuration(void)

:)
看了下程序没什么问题;

看看设置是否有问题;
另外芯片哪里买的?也不排除芯片本身问题;
还有硬件的,数字电源都量下,看电源部分是有虚焊的;
只焊了一块板子吗?

使用特权

评论回复
8
easier_life|  楼主 | 2014-11-17 14:52 | 只看该作者
mmuuss586 发表于 2014-11-17 12:20
看了下程序没什么问题;

看看设置是否有问题;

谢谢!我再查查板子看板子有没有问题。

使用特权

评论回复
9
mmuuss586| | 2014-11-17 17:35 | 只看该作者
easier_life 发表于 2014-11-17 14:52
谢谢!我再查查板子看板子有没有问题。

恩,也没其它办法了;
手上也没这么多脚F1的板子,有的话,早就帮你测试下了;
F4到是有,用过PE口,一直没啥区别;
:)

使用特权

评论回复
10
easier_life|  楼主 | 2014-11-18 11:17 | 只看该作者
mmuuss586 发表于 2014-11-17 17:35
恩,也没其它办法了;
手上也没这么多脚F1的板子,有的话,早就帮你测试下了;
F4到是有,用过PE口,一直 ...

谢谢您的热心帮助,我在代码中关闭了jtag,只使能了sw,又把pe2换成了另外的管脚来控制,现在代码表现基本正常,谢谢

使用特权

评论回复
11
mmuuss586| | 2014-11-18 12:11 | 只看该作者
easier_life 发表于 2014-11-18 11:17
谢谢您的热心帮助,我在代码中关闭了jtag,只使能了sw,又把pe2换成了另外的管脚来控制,现在代码表现基本 ...

哦,谢谢分享;

使用特权

评论回复
12
yaner691| | 2015-10-23 14:04 | 只看该作者
最终PE2-6作为GPIO用,成功了吗?

使用特权

评论回复
13
seeokok| | 2016-8-26 18:55 | 只看该作者
我也碰到这个问题,PE2-6无法作为GPIO用!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

16

帖子

1

粉丝