好了,终于可以写第二篇了。
本学习计划关于STM32103计划写5篇。都是平时用的比较多,而且每次都需要注意的。
1.BOOT0和BOOT1
2.时钟设置
3.USART和UART
4.关于按键和屏的设置,以及设计程序的结构。
5.UCOS系统
基本上这5个就够了。之后再写一写FPGA 和 STM32F407的。ヾ(◍°∇°◍)ノ゙
之前都是用库函数来设置RCC,如下:
void RCC_Configuration(void)
{
RCC_DeInit();//RCC寄存器重置
RCC_HSICmd(ENABLE);//使能内部时钟
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)//等待HSI使能成功
{
}
if(1)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1);//很多人喜欢用这个: RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
//设置PLL 时钟源及倍频系数
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);
//使能或者失能PLL,这个参数可以取:ENABLE或者DISABLE
RCC_PLLCmd(ENABLE);//如果PLL被用作系统时钟,那么他不能被失能
//等待指定的标志位RCC 设置成功 等待PLL设置成功
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
//设置系统时钟(SYSCLK) 设置PLL为系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//等待PLL成功作用于系统时钟的时钟源
// 0x00:HSI 作为系统时钟
// 0x04:HSE 作为系统时钟
// 0x08:PLL 作为系统时钟
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //SPI2 GPIOB-12,13,14,15
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE); //SPI2
}
也是之前在网上down的,属于内部时钟。当需要使用外部时钟时,修改
“//设置PLL 时钟源及倍频系数
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16); ”
这部分即可。
后来有网友说可以使用SystemInit()函数(位于文件“system_stm32f10x.c”)。
如果定义了这个宏(#define SYSCLK_FREQ_72MHz 72000000),则会将时钟系统初始化为如下状态:
SYSCLK:72MHz / AHB:72MHz / PCLK1:36MHz / PCLK2:72MHz / PLL:72MHz。
如此一来便大大简化了编程,只需在设置中预先DEFINE这个宏(SYSCLK_FREQ_72MHz)即可。
这一点,我试过几次,先定义宏(#define SYSCLK_FREQ_72MHz 72000000),然后RCC函数里写SystemInit();也没出过别的问题。但是为什么能用还是有点不明觉厉。现在都是先后一种方式,如果不行,再用第一种方式对时钟进行配置。
另外据说初始化以后可以通过SystemCoreClock变量来获取系统时钟(SYSCLK)的状态,例如,SYSCLK为72MHz,那么SystemCoreClock的值为72000000。这个还没有试过,下次试试。