我的硬件是STM32L152ZD,现在的状态是通过跟踪,程序一直运行在启动文件中。即启动文件中调用SystemInit (void),SystemInit (void)中又调用SetSysClock(void)。现在问题是 程序一直在do---wile()中循环,应该是在等待HSE稳定吧。资料上不是说STM32L1XX系列上电默认时钟就是HSI吗?附上SetSysClock(void)函数片段。库是V1.3.1.。。
先谢谢大家了
static void SetSysClock(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
此帖出自
小平头技术问答
1、对时钟的理解,不能抛开时钟树,这个是必须的。因为我个人觉得时钟树贯穿于stm32的每个程序中。(因为你初始化外设的时候,第一步总是在使能总线时钟);所以,您理解的时候,借助手册中RCC的时钟树那个章节。
2、如果时钟树理解起来比较麻烦,也可以使用CubeMX来配合理解时钟。
下图,我只是拿个图片来举个例子。
3、 SetSysClock(void)这个函数一开始,就执行RCC->CR |= ((uint32_t)RCC_CR_HSEON),所以这个地方就是使能HSE,具体的理解,您可以参考RCC的CR寄存器,和RCC_CR_HSEON的宏定义来理解。
我举个例子:
RCC_CR_HSEON被宏定义为((uint32_t)0x00010000),如果执行这个语句RCC->CR |= ((uint32_t)RCC_CR_HSEON),那么CR寄存器的第16位被置位,所以根据参考手册CR寄存器的说明。HSE振荡器打开。
后面的do,while循环。那么do,while循环有个特点,先执行,后判断。所以理解起来,应该是先去看do里面的语句, HSEStatus = RCC->CR & RCC_CR_HSERDY;这个的理解和刚才第一句的理解是一样的。(就是根据RCC_CR_HSERDY的宏定义值)。想必while的判断,也是如此。
4、后面你的这个 SetSysClock(void)没复制全,所以没法再做详细的说明。其实说白了,你理解了C语言,再结合时钟树及RCC的寄存器,这个时钟设置的理解就不困难了。
谢谢!大概明白了
恩恩,多想想,多看看。。。多比较。。。。多理解,你就清楚时钟树了。
呵呵,谢谢。每个人都是从不知道到知道过来的。或许有人这么耐心的讲解了,走的弯路可能会更少一些。
一周热门 更多>