初学STM32,在main()函数之前的初始化上就出了很多问题,记一下笔记。
芯片是STM32F103RCT6,用IAR8.40.1编译下载。外部有源晶振24MHz,芯片主频72MHz,用的3.5的固件库。
程序修改
初始化时为了适配晶振频率和主频修改的部分:
stm32f10x.h里:
#define HSE_VALUE ((uint32_t)24000000) /*!《 Value of the External oscillator in Hz
修改了外部高速时钟频率为24MHz
system_stm32f10x.c里:static void SetSysClockTo72(void)函数
static void SetSysClockTo72(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/****************使用的有源晶振是挂载在PB1上的,在使能HSE之前需要先把PB1的值拉高(并设置为强输出状态)才能让有源晶振起振*************/
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PB1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //普通推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数配置 GPIO
GPIO_SetBits(GPIOB,GPIO_Pin_1);
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
/* Enable HSE */
RCC-》CR |= ((uint32_t)RCC_CR_HSEON);
RCC_HSEConfig(RCC_HSE_Bypass);
/*****************************************************************用的是有源晶振,所以用Bypass*************************************/
………………
#else
/* PLL configuration: PLLCLK = HSE * 3 = 72 MHz */
RCC-》CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC-》CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL3);
/**********************************************************更改PLLMULL的值,使得HSE*3=72MHz***************************/
………………
}
**
调试部分
1.怎么查看HSE是否成功起振
system_stm32f10x.c里void SetSysClockTo72()函数
在图示处设置断点,如果进入HSEStatus = (uint32_t)0x01;则成功起振,如果进入
HSEStatus = (uint32_t)0x00;则未成功起振,然后会自动切换成HSI。
2.PLLMULL参数忘了改导致超频了,出现了reset failed 和Failed to load flash loader错误,其实本身和这两个错误无关,只是因为板子在超频后进入某种保护状态(?不确定)导致无法再向仿真器ST-LINK中写入程序。解决方法是上电前将芯片上的一个引脚和3.3V短接(记不太清具体引脚),使得stm32进入boot1状态,然后上电一下。之后就可以重新烧入程序了。
3.多次出现ST-LINK NO MCU device found错误,是板子接触不太好,敲敲打打就解决了。
最后是一些很小的点:
1.建立环境的时候core_cm3.c不能用,要把后缀改了让系统不能识别,同时要在project_options_library configuration里勾选use CSMIS
2.记得修改stm32f10x.h中的#define USE_STDPERIPH_DRIVER,这句话在官方库中是注释掉的。