MCU:STM32F407
一、不配置时钟
cpp
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
delay_init(168); /* 延时初始化 */
led_init(); /* 初始化LED */
g_RCC_CR=RCC->CR;
g_RCC_PLLCFGR=RCC->PLLCFGR;
g_RCC_CFGR=RCC->CFGR;
g_RCC_CIR=RCC->CIR;
g_RCC_AHB1RSTR=RCC->AHB1RSTR;
g_RCC_AHB2RSTR=RCC->AHB2RSTR;
g_RCC_AHB3RSTR=RCC->AHB3RSTR;
g_RCC_APB1RSTR=RCC->APB1RSTR;
g_RCC_APB2RSTR=RCC->APB2RSTR;
g_RCC_AHB1ENR=RCC->AHB1ENR;
g_RCC_AHB2ENR=RCC->AHB2ENR;
g_RCC_AHB3ENR=RCC->AHB3ENR;
g_RCC_APB1ENR=RCC->APB1ENR;
g_RCC_APB2ENR=RCC->APB2ENR;
g_RCC_APB1LPENR=RCC->APB1LPENR;
g_RCC_APB2LPENR=RCC->APB2LPENR;
g_RCC_AHB1LPENR=RCC->AHB1LPENR;
g_RCC_AHB2LPENR=RCC->AHB2LPENR;
g_RCC_AHB3LPENR=RCC->AHB3LPENR;
g_RCC_BDCR=RCC->BDCR;
g_RCC_CSR=RCC->CSR;
g_RCC_SSCGR=RCC->SSCGR;
g_RCC_PLLI2SCFGR=RCC->PLLI2SCFGR;
while(1)
{
g_nnum++;
}
}

二、配置时钟
cpp
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
// sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
sys_stm32_clock_init(192, 4, 4, 2); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
led_init(); /* 初始化LED */
g_RCC_CR=RCC->CR;
g_RCC_PLLCFGR=RCC->PLLCFGR;
g_RCC_CFGR=RCC->CFGR;
g_RCC_CIR=RCC->CIR;
g_RCC_AHB1RSTR=RCC->AHB1RSTR;
g_RCC_AHB2RSTR=RCC->AHB2RSTR;
g_RCC_AHB3RSTR=RCC->AHB3RSTR;
g_RCC_APB1RSTR=RCC->APB1RSTR;
g_RCC_APB2RSTR=RCC->APB2RSTR;
g_RCC_AHB1ENR=RCC->AHB1ENR;
g_RCC_AHB2ENR=RCC->AHB2ENR;
g_RCC_AHB3ENR=RCC->AHB3ENR;
g_RCC_APB1ENR=RCC->APB1ENR;
g_RCC_APB2ENR=RCC->APB2ENR;
g_RCC_APB1LPENR=RCC->APB1LPENR;
g_RCC_APB2LPENR=RCC->APB2LPENR;
g_RCC_AHB1LPENR=RCC->AHB1LPENR;
g_RCC_AHB2LPENR=RCC->AHB2LPENR;
g_RCC_AHB3LPENR=RCC->AHB3LPENR;
g_RCC_BDCR=RCC->BDCR;
g_RCC_CSR=RCC->CSR;
g_RCC_SSCGR=RCC->SSCGR;
g_RCC_PLLI2SCFGR=RCC->PLLI2SCFGR;
while(1)
{
g_nnum++;
}
}
sys_stm32_clock_init(192, 4, 4, 2);的原型是
uint8_t sys_stm32_clock_init(uint32_t plln, uint32_t pllm, uint32_t pllp, uint32_t pllq)
其中plln的选择:
VCO 输出频率 = VCO 输入频率 × PLLN 并且 192 PLLN 432,
VCO 输出频率介于 192 和 432 MHz 之间
pllm的选择:VCO 输入频率 = PLL 输入时钟频率 / PLLM 并且 2 PLLM 63,VCO 输入频率介于 1 和 2 MHz 之间。
对于外部晶振为8MHz,pllm只能是8或4.其它值均不成功。
pllp的选择:PLL 输出时钟频率 = VCO 频率 / PLLP 并且 PLLP = 2、4、6 或 8
不超过 168 MHz
pplq的选择:USB OTG FS 时钟频率 = VCO 频率 / PLLQ,并且 2 PLLQ 15
pllm=4,则VCO输入频率为2MHz;
plln=192,则VCO的输出频率为384
pllp=4,则PLL的输出频率为384/4=96MHZ
即SystemCoreClock=96MHz

三、pllm=4时,可以配置几个频率呢?
先不考虑USB OTG FS 时钟频率,如果pllp=2,则时钟会超出168MHz,但是成功。
cpp
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(192, 4, 2, 2); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
led_init(); /* 初始化LED */
g_RCC_CR=RCC->CR;
g_RCC_PLLCFGR=RCC->PLLCFGR;
g_RCC_CFGR=RCC->CFGR;
g_RCC_CIR=RCC->CIR;
g_RCC_AHB1RSTR=RCC->AHB1RSTR;
g_RCC_AHB2RSTR=RCC->AHB2RSTR;
g_RCC_AHB3RSTR=RCC->AHB3RSTR;
g_RCC_APB1RSTR=RCC->APB1RSTR;
g_RCC_APB2RSTR=RCC->APB2RSTR;
g_RCC_AHB1ENR=RCC->AHB1ENR;
g_RCC_AHB2ENR=RCC->AHB2ENR;
g_RCC_AHB3ENR=RCC->AHB3ENR;
g_RCC_APB1ENR=RCC->APB1ENR;
g_RCC_APB2ENR=RCC->APB2ENR;
g_RCC_APB1LPENR=RCC->APB1LPENR;
g_RCC_APB2LPENR=RCC->APB2LPENR;
g_RCC_AHB1LPENR=RCC->AHB1LPENR;
g_RCC_AHB2LPENR=RCC->AHB2LPENR;
g_RCC_AHB3LPENR=RCC->AHB3LPENR;
g_RCC_BDCR=RCC->BDCR;
g_RCC_CSR=RCC->CSR;
g_RCC_SSCGR=RCC->SSCGR;
g_RCC_PLLI2SCFGR=RCC->PLLI2SCFGR;
while(1)
{
g_nnum++;
}
}

cpp
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(193, 4, 2, 2); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
led_init(); /* 初始化LED */
g_RCC_CR=RCC->CR;
g_RCC_PLLCFGR=RCC->PLLCFGR;
g_RCC_CFGR=RCC->CFGR;
g_RCC_CIR=RCC->CIR;
g_RCC_AHB1RSTR=RCC->AHB1RSTR;
g_RCC_AHB2RSTR=RCC->AHB2RSTR;
g_RCC_AHB3RSTR=RCC->AHB3RSTR;
g_RCC_APB1RSTR=RCC->APB1RSTR;
g_RCC_APB2RSTR=RCC->APB2RSTR;
g_RCC_AHB1ENR=RCC->AHB1ENR;
g_RCC_AHB2ENR=RCC->AHB2ENR;
g_RCC_AHB3ENR=RCC->AHB3ENR;
g_RCC_APB1ENR=RCC->APB1ENR;
g_RCC_APB2ENR=RCC->APB2ENR;
g_RCC_APB1LPENR=RCC->APB1LPENR;
g_RCC_APB2LPENR=RCC->APB2LPENR;
g_RCC_AHB1LPENR=RCC->AHB1LPENR;
g_RCC_AHB2LPENR=RCC->AHB2LPENR;
g_RCC_AHB3LPENR=RCC->AHB3LPENR;
g_RCC_BDCR=RCC->BDCR;
g_RCC_CSR=RCC->CSR;
g_RCC_SSCGR=RCC->SSCGR;
g_RCC_PLLI2SCFGR=RCC->PLLI2SCFGR;
while(1)
{
g_nnum++;
}
}

cpp
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(432, 4, 2, 2); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
led_init(); /* 初始化LED */
g_RCC_CR=RCC->CR;
g_RCC_PLLCFGR=RCC->PLLCFGR;
g_RCC_CFGR=RCC->CFGR;
g_RCC_CIR=RCC->CIR;
g_RCC_AHB1RSTR=RCC->AHB1RSTR;
g_RCC_AHB2RSTR=RCC->AHB2RSTR;
g_RCC_AHB3RSTR=RCC->AHB3RSTR;
g_RCC_APB1RSTR=RCC->APB1RSTR;
g_RCC_APB2RSTR=RCC->APB2RSTR;
g_RCC_AHB1ENR=RCC->AHB1ENR;
g_RCC_AHB2ENR=RCC->AHB2ENR;
g_RCC_AHB3ENR=RCC->AHB3ENR;
g_RCC_APB1ENR=RCC->APB1ENR;
g_RCC_APB2ENR=RCC->APB2ENR;
g_RCC_APB1LPENR=RCC->APB1LPENR;
g_RCC_APB2LPENR=RCC->APB2LPENR;
g_RCC_AHB1LPENR=RCC->AHB1LPENR;
g_RCC_AHB2LPENR=RCC->AHB2LPENR;
g_RCC_AHB3LPENR=RCC->AHB3LPENR;
g_RCC_BDCR=RCC->BDCR;
g_RCC_CSR=RCC->CSR;
g_RCC_SSCGR=RCC->SSCGR;
g_RCC_PLLI2SCFGR=RCC->PLLI2SCFGR;
while(1)
{
g_nnum++;
}
}
PLLN设置为最大值432,则时钟设置为432MHz,烧录直接失败!



烧录不了。