首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

学习STM32(3)-电源、时钟、复位电路(4)

学习STM32(3)-电源、时钟、复位电路(4)

根据STM32库函数设置时钟流程:
RCC_DeInit();     //设置RCC寄存器重新设置为默认值
RCC_HSEConfig(RCC_HSE_ON);   //打开外部高速时钟晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp();   //等待外部高速时钟晶振工作
if(HSEStartUpStatus == SUCCESS)        //外部就绪
{
       //Add here PLL ans system clock config
       RCC_HCLKConfig(RCC_SYSCLK_Div1);     //设置AHB时钟不分频
       RCC_PCLK2Config(RCC_HCLK_Div1);       //设置APB2时钟不分频
       RCC_PCLK1Config(RCC_HCLK_Div2);       //设置APB1时钟二分频
       RCC_ADCCLKConfig(RCC_PCLK2_Div6);    //设置ADC时钟六分频
       //设置PLL时钟将8M时钟9倍频到72M
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE); //使能PLL

FlagStatus Status;
Status = RCC_GetFlagStatus(RCC_FLAG_PLLRDY);
if(Status == RESET)
{

……
}
RCC_SYSCLKConfig(RCC-SYSCLKSource_PLLCLK);   //将PLL输出设置为系统时钟
while(RCC_GetSYSCLKSource()!=0x08) //测试PLL是否被用作系统时钟等待校验完成
{}
}
else
{
       //Add here some code to deal with this error
}
//使能外围接口总线时钟
RCC_APB2PeriphClockCmd() / RCC_APB1PeriphClockCmd()





具体配置过程:
第一步:
复位并配置向量表。
函数MYRCC_DeInit();
下面对该函数进行分析:
(1)       设置外设复位寄存器:RCC->APB1RSTR = 0x00000000
该寄存器中包含dac,电源复位,定时器等外设复位设置,某位为1表示对相应外设复位。开机启动时将该寄存器数据清空。
(2)       设置外设复位寄存器:RCC->APB2RSTR = 0x00000000
同第一步外设复位寄存器的设置。
解答:
RCC->APB1RSTR = 0x00000000;//复位结束     
RCC->APB2RSTR = 0x00000000;  
这里的复位结束具体是什么意思??我把它注释掉后发现也是可以运行的

1是复位.0当然是不复位了
不复位那就是复位结束了.

(3)       睡眠模式闪存和sram时钟使能,其他关闭。用于使用sram Sram相当于pc的内存。
STm32有三种启动模式:

1,ISP模式.这种模式就是STM32复位后就执行固化在内部的BOOTLOADER程序(固化的,我们无法读写.),然后等待串口数据,从而实现串口bootloader功能.
这种模式不会从用户存储区启动(除非用串口控制其从0X08000000启动),所以在更新了代码之后,需要设置为其他模式(FLASH模式).
2,FLASH启动模式.这种模式直接从0X08000000启动,也就是我们自己编写的代码的启动方式了.正常情况都应该用这种.
3,SRAM启动模式.这种模式我没有用过,是从0X20000000启动的,也就是说在sram模式开始之前,你要确保SRAM里面已经有代码了,否则就是死机.



RCC->AHBENR = 0x00000014
(4)       设置外设时钟使能寄存器:
RCC->APB1ENR = 0x00000000;
RCC->APB2ENR = 0x00000000; 将所有外设全部关闭
(5)       使能内部高速HSION
RCC->CR |=0x00000001;
stm32的时钟启动过程。
启动过程是:
1
,首先使用内部时钟(这也是为什么你不接晶振也可以下载代码了)。
2
,尝试开启外部时钟.
3
,如果开启成功,则使用外部时钟,否则使用内部。
4
,做其他事情。
当然以上代码都需要你自己写代码实现,当然内部时钟是默认的时钟,你不开启也可以.
(6)          复位SW,HPRE,PPRE1,PPRE2,ADCPRE,MCO
RCC->CFGR &= 0xF8FF0000;
这步有什么意思呢,我的理解是。Cfgr寄存器主要用于对时钟分频的控制,见下图:
继承事业,薪火相传
返回列表