最近我一直在搜索STM32,IO翻转18M速度的资料和帖子。
香城主提供了以前关于这方面的精华帖链接,但是都被删除不存在了。
我在编译的时候,IO翻转最多才7M。
为了方便大家讨论,现将我编写的程序贴出来。由于我是初学者,花了我不少时间,从最初的150多us,速度提高到了130ns左右,还有就是软件仿真和实际硬件测试是非常不同的。以上速度都是我用示波器测试得到的。所以什么东西还是要看结果能让我们得到什么。
#include <stm32f10x.h>
#include "stm32f10x_conf.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_flash.h"
#include "stm32f10x_usart.h"
#define FLASH_Latency_2 ((uint32_t)0x00000002) /* FLASH Two Latency cycles */
#define FLASH_PrefetchBuffer_Enable ((uint32_t)0x00000010) /* FLASH Prefetch Buffer Enable */
#define RCC_PLLSource_HSE_Div1 ((uint32_t)0x00010000)
//#define RCC_PLLMul_2 ((uint32_t)0x00000000)
//#define RCC_PLLMul_3 ((uint32_t)0x00040000)
//#define RCC_PLLMul_4 ((uint32_t)0x00080000)
//#define RCC_PLLMul_5 ((uint32_t)0x000C0000)
//#define RCC_PLLMul_6 ((uint32_t)0x00100000)
//#define RCC_PLLMul_7 ((uint32_t)0x00140000)
//#define RCC_PLLMul_8 ((uint32_t)0x00180000)
#define RCC_PLLMul_9 ((uint32_t)0x001C0000)
//#define RCC_PLLMul_10 ((uint32_t)0x00200000)
//#define RCC_PLLMul_11 ((uint32_t)0x00240000)
//#define RCC_PLLMul_12 ((uint32_t)0x00280000)
//#define RCC_PLLMul_13 ((uint32_t)0x002C0000)
//#define RCC_PLLMul_14 ((uint32_t)0x00300000)
//#define RCC_PLLMul_15 ((uint32_t)0x00340000)
//#define RCC_PLLMul_16 ((uint32_t)0x00380000)
//时钟初始化
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_Div1); //APB2(高速)为HCLK的一半
RCC_PCLK1Config(RCC_HCLK_Div1); //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);
}
*/
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,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(GPIOA,&GPIO_InitStructure);
}
int main(void)
{
RCC_Configuration();
GPIO_config();
while (1)
{
// GPIOB->BRR=GPIO_Pin_11;
// GPIOB->BSRR=GPIO_Pin_11;
GPIOA->BRR=0x00000001;
GPIOA->BSRR=0x00000001;
}
} |