如何设置STM101C8的PD0和PD1????

robertlce   2008-4-25 09:42 楼主
重新布版前,我测试过,可以设置两个晶振引脚为GPIOD。
可现在忘了当时怎么设置的了.   :(
我现在的代码如下: 却没有效果, 郁闷了,发上来让香主帮忙看看。
  //初始化GPIO接口
  /* AFIO Periperal Clock Enable */
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO,ENABLE );

  GPIO_PinRemapConfig( GPIO_Remap_PD01 , ENABLE );

  /* Enable SWJ , Disable JTAG */
  GPIO_PinRemapConfig( GPIO_Remap_SWJ_JTAGDisable , ENABLE );

  /* Enable GPIO clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

  /* Configure PD.0, PD.1 as Output push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

回复评论 (19)

请贴一下你的时钟配置程序

GPIO_PinRemapConfig( GPIO_Remap_PD01 , ENABLE );这里好象应该是DISABLE。
点赞  2008-4-25 13:13

请ST——ARM参考:(感谢)

/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
     
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */ 
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
}

/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures Vector Table base location.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
#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
}
点赞  2008-4-25 14:32

你的时钟设置中没有处理LSE

                                 在代码中将LSE关闭。
点赞  2008-4-25 15:24

PD0,PD1只能设为50MHz,

STM32F10xxx 勘误表 有相关说明
2.1 PD0 and PD1 use in output mode
Description
The use of PD0 and PD1 in output mode is limited as, in this mode, PD0 and PD1
used at 2 MHz and 10 MHz.
Workaround
When the output mode is required, PD0 and PD1 must be used at 50 MHz.
点赞  2008-4-25 22:58

还没搞定呀,,

香主能不能給个完整的设置代码??
我要用外部RTC时钟,就是PC14 PC15 仍然作为rtc时钟,保证时间准确度。
PD.0和PD.1作为普通IO。【刚才糊涂了,输入错误 :D 】
点赞  2008-5-13 11:54

把你新的设置代码贴出来看看

4楼的建议做了吗?

还有,什么是“外部RTC外部时钟”?

一楼说要“设置两个晶振引脚为GPIOD”,6楼又说“PD.0和PD.1作为普通时钟”,这2种说法矛盾啊。
点赞  2008-5-13 12:05

香主:我不会设置了。

LSE是RTC的设置,默认就是关闭状态。
跟PD0和PD1 什么关系???
看了英文论坛,好像跟芯片版本也有关系,最新的是什么版本呀??
您那如果有现成的代码,給个参考吧,我现在逻辑混乱,都不清楚以什么步骤来操作。
点赞  2008-5-13 14:30

香主,帮帮忙吧,:D

这个问题拖了这么久都没解决。:(
好像总是我遇到这些奇怪的问题,:(
别人咋就遇不到呀。
点赞  2008-5-13 15:06

请再清楚地描述一下你的需求

我在7楼已经指出你的矛盾之处,你也没有澄清,我不知道你到底要做什么。

至少你能再重新清楚地描述一下你的需求,清理一下自己的思路,你自己都不清楚,别人如何能够帮助你?
点赞  2008-5-13 15:32

香主:

简单点说:就是要实现STM101C8——PD0和PD1的gpio功能。
您说的错误我已经改正了,输入错误。
我现在迫切需要个例子,呵呵。
既然这里操作的不清楚,所以例子的重要性就显而易见了。
点赞  2008-5-13 15:40

我这里有个PD01作为GPIO的

但是我这里是100pin的,PD0/1和OSC_IN/OUT分开的,不用remap,代码很简单,如下:
int main(void)
{

#ifdef DEBUG
  debug();
#endif

  /* System Clocks Configuration */
  RCC_Configuration();
  
  /* NVIC Configuration */
  NVIC_Configuration();
  
  {
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
  while (1)
  {
  GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
  GPIO_ResetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
  GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
  GPIO_ResetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
  GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
  GPIO_ResetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
  }
  
  }
}

void RCC_Configuration(void)
{
  
  /* RCC system reset(for debug purpose) */
 RCC_DeInit();


    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    FLASH_SetLatency(FLASH_Latency_2);
    
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);
    
    
    /* Select HSI as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

    /* Wait till HSI is used as system clock source */
      while(RCC_GetSYSCLKSource() != 0x00)
    {
    }

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
  
}

void NVIC_Configuration(void)
{
#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

}
点赞  2008-5-13 15:46

感谢lut1lut提供例子代码。

                                 我刚才试了试您的代码还是不成,唉,我记得好像以前试过的,这次咋就被难住了呢?!!
点赞  2008-5-13 16:12

stm32首次让我抓狂

将我的代码粘贴出来吧,没希望了,如果骂娘能解决问题,我想我早就开骂了,:D
飞线!
下面是我抽取的相关代码,感兴趣的可以测试一下。
void RCC_Configuration(void)
{
  
    /* RCC system reset(for debug purpose) */
    RCC_DeInit();

    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
     
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);

    /* Enable PLL */ 
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
}

int main()
{
  /* Configure the system clocks */
  RCC_Configuration();
  /* NVIC Configuration */
  NVIC_Configuration();
  /* Enable SWJ , Disable JTAG */
  GPIO_PinRemapConfig( GPIO_Remap_SWJ_JTAGDisable , ENABLE );

  /* AFIO Periperal Clock Enable */
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO,ENABLE );
    /* Enable GPIO clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

  GPIO_PinRemapConfig( GPIO_Remap_PD01 , ENABLE );

  /* Configure PD.0, PD.1 as Output push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

//  while (1)
//  {
//  GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
//  GPIO_ResetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
//  GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
//  GPIO_ResetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
//  GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
//  GPIO_ResetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
//  }

}


点赞  2008-5-15 11:15

另外转英文的一个回帖!!英文官方的。

As you have mentioned, the IO remap of PD0 / PD1 on OSCIN / OSCOUT is not working on The early Silicon revision A, In fact The remapping of PD0 / PD1 was done but the configuration of PD0 and PD1 is forced to
output push-pull and their level is driven to 0 by the package options.

The fix of this limitation was already identified and resolved in the official Silicon revision. Please contact ST Sales offices for more details about the availability for your Region.

With best regards

我用的REV A(芯片右下角有个A)   STM32101C8的最新版本怎么查呢??
点赞  2008-5-15 11:30

大哥 c8 48脚 哪来的pD脚

                                  
点赞  2008-5-15 14:00

晕!

你竟然不知道!!
PD0 和 PD1 与8M晶振的两个引脚复用,
如果你觉得IO不够用呢,可以用内部振荡器提供主频。将PD0、PD1 remap到这两个引脚上,根据文档资料,是可以作GPIO用的。目前偶就是无法实现这个功能而苦恼。如果你也有48PIN的STM32,可以试试,将晶振拆下来就可以试了。
点赞  2008-5-15 14:27

徐工,您好

                                 我想问一下  你在这个程序下 用别的端口输出可以吗?  我想明确时钟肯定是不是起来了
点赞  2008-5-15 15:20

STM32 版本A的remap功能失效。

STM32F10x的PD0、1的remap功能在A版本中无效。
在48脚封装中,PD0、1引脚默认功能是用于RTC的32K晶振引脚。在STM32的参考手册中默认功能是32K晶振引脚。

如果在应用中要将PD0、1用作普通的IO口,请参考如下代码:


#include "stm32f10x_lib.h"

RCC_ClocksTypeDef RCC_ClockFreq;

/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    :
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
    RCC_DeInit();                                /* RCC system reset(for debug purpose) */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);    /* Enable Prefetch Buffer */
    FLASH_SetLatency(FLASH_Latency_2);            /* Flash 2 wait state */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);            /* HCLK = SYSCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);                /* PCLK2 = HCLK */
    RCC_PCLK1Config(RCC_HCLK_Div2);                /* PCLK1 = HCLK/2 */
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);    /* PLLCLK = 8MHz /2 * 12 = 48 MHz */
    RCC_PLLCmd(ENABLE);                            /* Enable PLL */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}    /* Wait till PLL is ready */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);    /* Select PLL as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08) {}        /* Wait till PLL is used as system clock source */

    RCC_GetClocksFreq(&RCC_ClockFreq);                                // This function fills a RCC_ClocksTypeDef structure with the current frequencies of different on chip clocks (for debug purpose)
    /* The RCC_ClockFreq members should be as following:
        RCC_ClockFreq.SYSCLK_Frequency = 48000000
        RCC_ClockFreq.HCLK_Frequency   = 48000000
        RCC_ClockFreq.PCLK1_Frequency  = 24000000
        RCC_ClockFreq.PCLK2_Frequency  = 48000000
        RCC_ClockFreq.ADCCLK_Frequency = 24000000
    */
}

/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures Vector Table base location.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
#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
}

/*******************************************************************************
* Function Name  : main
* Description    :
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_Configuration();        /* Configure the system clocks */
    NVIC_Configuration();        /* NVIC Configuration */
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO,ENABLE );        /* AFIO Periperal Clock Enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);        /* Enable GPIO clock */

    GPIO_PinRemapConfig( GPIO_Remap_PD01 , ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);    /* Configure PD.0, PD.1 as Output push-pull */

    while (1) {
        GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
        GPIO_ResetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
        GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
        GPIO_ResetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
        GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
        GPIO_ResetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 );
    }

}
点赞  2008-5-15 15:39

to: jackbao

谢谢了,时钟是没问题的,能正常运行程序,:D
真的实现不了,呵呵,我倒是踏实了!当初可能我只把keil模拟当作仿真了,也可能当时测试了一下RTC那2个引脚,就觉得OSC_IN OSC_OUT这两个也应该没问题。
:P
点赞  2008-5-15 16:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复