小弟编程遇到点麻烦,请香版主和各位高工请教。
我最近在编辑SPI的通讯程序,由于传输时钟的速度要高于20M。所以我选用了STM32F107VC。根据ST的资料和性能,时钟可以达到72M,IO的速度可以达到50M。
我在编译的时候设置了内部和外部时钟,实际编译时候只用了一种方式。
当我烧写入芯片迫不及待的想看波形时,发现最快才2M。为了保证我设置频率是正确的。我专门让时钟在MOC输出(PA8)。发现时钟是预计的72M。
为了弄清情况,我专门设置了一个IO使其正反置位。
GPIO_ResetBits(GPIOB, GPIO_Pin_11);
delay(1);
GPIO_SetBits(GPIOB, GPIO_Pin_11);
delay(1);
但是一切不如人愿啊。我在步进行是发现在stm32f10x_gpio.c的265行函数,是不是它有影响,望香版主和各位高工指点。
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)
{
/* Reset GPIO init structure parameters values */
GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All;
GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING;
}
现在就想知道,是时钟设置上面有问题,还是IO置位函数有问题。希望各位指点。
IO定义如下:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_11
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
内部和外部时钟设置如下。
//配置系统外部时钟,使能各外设
void RCC_Configuration(void) //时钟初始化
{
ErrorStatus HSEStartUpStatus; //等待时钟的稳定
RCC_DeInit(); //时钟管理重置
RCC_HSEConfig(RCC_HSE_ON); //打开外部晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部晶振就绪
if (HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //flash缓冲读取加速
FLASH_SetLatency(FLASH_Latency_2); // flash操作的延时
RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB使用系统时钟(只有目标时钟源就绪时时钟切换才会发生 )
RCC_PCLK2Config(RCC_HCLK_Div2); //APB2(高速)为HCLK的一半
RCC_PCLK1Config(RCC_HCLK_Div2); //APB1(低速)为HCLK的一半
//注:AHB主要负责外部存储器时钟。PB2负责AD,I/O,高级TIM,串口1,EXTI。
// APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM,IWDG,WWDG。
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //9为时钟倍频系数,PLLCLK = 8MHz * 9 = 72 MHz
//HSI时钟信号由内部的8MHz的RC振荡器产生,可直接作为系统时钟,或在2分频后作为PLL输入
RCC_PLLCmd(ENABLE); //启动PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY==RESET)) {} //等待PLL启动
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //将PLL设置为系统时钟源
while(RCC_GetSYSCLKSource()!=0x08){}
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA
|RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
|RCC_APB2Periph_GPIOD | RCC_APB2Periph_ADC1
| RCC_APB2Periph_AFIO |
RCC_APB2Periph_SPI1, ENABLE );
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL ,ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4
|RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2
, ENABLE );
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}
//配置系统内部时钟,使能各外设
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA
|RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
|RCC_APB2Periph_GPIOD | RCC_APB2Periph_ADC1
| RCC_APB2Periph_AFIO |
RCC_APB2Periph_SPI1, ENABLE );
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL ,ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4
|RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2
, ENABLE );
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
} |