项目上使用了STM32F031F6P6这一款单片机,ST的芯片疯涨所以换了国产灵动微电子的MM32F031F6P6,
随笔分享一下使用该芯片的一些注意事项。
以MM32F031系列单片机为例,说一下使用情况。
这款国产单片机兼容ST同型号,ST的最高到48M主频,而MM的最高能到72M。
在灵动官网下载的示例程序系统时钟源是通过system_MM32F031x4x6_q.c中的宏选择的,如下图:
SYSCLK_FREQ_HSE:选择为外部高速时钟,默认是8M
SYSCLK_HSI_48MHz选择为内部时钟(这一款单片机的默认内部时钟就是48M,跟ST不同)
SYSCLK_HSI_72MHz选择并配置时钟为内部72M
如果是使用的是外部时钟8M,官方示例程序是没有倍频到48M的,所以系统时钟就是8M,如果你需要倍频到48M,使用我这个函数替换掉原来的即可:
static void SetSysClockToHSE(void)
{
/* 使能HSE */
RCC->CR |= RCC_CR_HSEON;
/* 等待HSE准备就绪 */
while(!(RCC->CR & RCC_CR_HSERDY));
/* 启用预取缓冲区并设置闪存延迟 */
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_1;
/* 设置HCLK时钟分频为1分频 */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* 设置PCLK1时钟分频1分频 */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;
/* 设置PCLK2时钟分频1分频 */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* 设置HSE作为PLL输入时钟 */
RCC->CFGR |= (1 << 16);
/* 设置HSE不分频输入PLL */
RCC->CFGR &= (~(1 << 17));
/* 设置PLL倍频6倍到48M */
RCC->CR &= (~(1 << 26));
RCC->CR |= (5 << 26); // PLLDN = 5
RCC->CR &= (~(1 << 20)); // PLLDM = 0
/* 使能PLL */
RCC->CR |= (1 << 24);
/* 等到PLL就绪 */
while(((RCC->CR & (1 << 25)) == 0));
/* 设置PLL输出作为系统时钟 */
RCC->CFGR &= (~RCC_CFGR_SW);
RCC->CFGR |= RCC_CFGR_SW_1;
/* 等待系统时钟切换就绪 */
while(((RCC->CFGR & (RCC_CFGR_SW_1 << 2)) == 0));
}