洛谷题分析总结
适应环境,认真分析题
if(((a/100)+(a/10%10)+(a%10)+(b/100)+(b/10%10)+
(b%10)+(c/100)+(c/10%10)+(c%10)==
1+2+3+4+5+6+7+8+9)&&
((a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*
(b%10)*(c/100)*(c/10%10)*
(c%10)==1*2*3*4*5*6*7*8*9))
//当初就看题解就明白了,之后听学长讲解,
//才知道1~9相加和1~9相乘才能限定住1~9不重复。
//仅对本题适用。
学习内容和笔记
一、STM32时钟精讲
1、时钟总述
时钟
三种不同的时钟源可被用来驱动系统时钟(SYSCLK):
1、HSI振荡器时钟
2、HSE振荡器时钟
3、SPLL时钟
这些设备有以下2种二级时钟源:
1、40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC, RTC用于从停机。
2、待机模式下自动唤醒系统。
3、32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。
4、当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。
2、时钟系统框图及简介
一、1、HSI RC:High speed internal高速内部时钟源,频率约8Hz,内部RC振荡器可被关闭,箭头表示系统时钟可以选择HSI
2、HSE OSC:High speed external:高速外部时钟源,频率4~16Hz,一般取8Hz,箭头表明可被系统时钟选择。
3、css时钟监控系统,一旦HSE切换失败,则自动切换到HSI系统
4、LSE OSC:Low speed external,低速外部时钟源,通过外接晶振来产生,32.768Hz,是给RTC时钟供电的
5、LSI RC:Low speed internal低速内部时钟源,内置RC晶振可关闭。
6、RTC可以来自三个时钟源,HSE, LSE, LSI。
二、RCC时钟(配置,控制提供给各模块时钟信号的通断)相关头文件和固件库源文件:
1、时钟使能配置:
RCC_ LSEConfig() 、RCC_ HSEConfig()、
RCC_ HSICmd()、RCC_ LSICmd()、RCC_ PLLCmd()
2、时钟源相关配置:
RCC_ PLLConfig ()、RCC_ SYSCLKConfig() 、RCC_ RTCCLKConfig()
3、分频系数选择配置:
RCC_ HCLKConfig()、 RCC_ PCLK1Config() 、RCC_ PCLK2Config.
4、外设时钟使能
RCC_ APB1 PeriphClockCmd(): //APB1线上外设时钟使能
RCC_APB2PeriphClockCmd(); //APB2线上外设时钟使能
RCC _AHBPeriphClockCmd(); //AHB线上外设时钟使能
5、其他外设时钟配置:
RCC_ ADCCLKConfig (); RCC_ _RTCCLKConfig()
6、状态参数获取参数:
RCC_ GetClocksFreq()
RCC_ GetSYSCLKSource()
RCC_ GetFlagStatus()
7、RCC中断相关函数
RCC_ ITConfig() 、RCC_ GetITStatus() 、RCC_ ClearITPendingBit()
二、SystemInit时钟系统初始化函数剖析
1、 设置时钟流程:
1、将RCC寄存器重新设置为默认值 RCC_DeInit
2、打开外部高速时钟晶振HSE
RCC_HSEConfig(RCC_HSE_ON);
3、等待外部高速时钟晶振工作
HSEStartUpStatus = RCC_WaitForHSEStartUp();
4、设置AHB时钟 RCC_HCLKConfig;
5、设置高速APB2时钟 RCC_PCLK2Config;
(预分频)按照上图我理解分频就是不同频率对应成相同的,然后才可以一起工作。
6、设置低速速APB1时钟 RCC_PCLK1Config
7、设置PLL RCC_PLLConfig
8、打开PLL RCC_PLLCmd(ENABLE);
9、等待PLL工作 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
10、设置系统时钟 RCC_SYSCLKConfig
11、判断是否PLL是系统时钟 while(RCC_GetSYSCLKSource() != 0x08)
12、打开要使用的外设时钟 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()
2、SetSysClock函数
<span style="font-size:14px;"><span style="font-size:14px;"
static void SetSysClock(void)</span></span>
配置系统时间源,PLL倍频器和分频器因子,AHB/APBX预分频器和FLASH(程序存储器)相关设置。
这个函数只能够被调用一次,那就是在systemInit函数里面
RCC->CR |= ((uint32_t)RCC_CR_HSEON);// ①</span></span>
//打开外部晶振,让其起振
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;//②
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));</span></span>
//打开任何一个时钟之后都要等待它的稳定,然后才能设置为系统时钟或者其他时钟
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;/</span><span style="font-size:18px;">
//CFRG时钟源的选择
3、之后的函数寄存器
我正在看,感觉比之前理解多一点了。