注意事项
1.最新版本的MDK软件Keil的编译器版本已更新到v6,且与v5版本不兼容。之前老的项目编译使用v6版编译器都会出错,建议使用老版本的Keil(如v5.36等)。单纯安装v5版本的编译器比较麻烦。Keil v536同时自带v5、v6两个版本的编译器。
MDK下载地址(536为版本号):https://armkeil.blob.core.windows.net/eval/MDK536.EXE
2.使用STLink下载程序时,每次首次打开并连接开发板时都要在“Flash Download”界面中设置“Programming Algorithm”。
3.ST-Link升级固件时报错“ST-link is not in the DFU mode”:
①拔掉stlink
②插上stlink(需要确保stlink没有连上MCU,或者把实验板关机)
③不要搞别的,直接点击ST-LINK->Firmware update->device connect
GPIO内容总结
1.上电复位后,GPIO默认为浮空状态,部分特殊功能引脚为特定状态。IO口不能直接驱动大功率器件。IO口的电流很小,一般只做判断或基本驱动,需要会外接三极管放大电流。
2.输出模式:
①推挽输出:可以输出强高低电平,连接数字器件 。
②开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。
3.GPIO_Init函数初始化
GPIO_InitTypeDef GPIO_InitStructure;//这一行必须放在第一行
//①使能GPIOF时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
//②GPIOF9,F10初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOF9,F10
//③IO口操作,设置高电平(低电平:GPIO_ResetBits())。这里也可以使用位段输出。
GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
位段输出定义:(led.h头文件中定义)
#define LED0 PFout(9)
#define LED1 PFout(10)
时钟系统内容总结
1. STM32有5个时钟源:HSI、HSE、LSI、LSE、PLL。
①HSI是高速内部时钟,RC振荡器,频率为16MHz,精度不高。可直接作为系统时钟或者用作PLL时钟输入。
②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz。
③LSI是低速内部时钟,RC振荡器,频率为32kHz,提供低功耗时钟。主要供独立看门狗和自动唤醒单元使用。
④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。可作为RTC的时钟源。
⑤PLL为锁相环倍频输出。STM32F4有两个PLL:
主PLL(PLL)由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟:
第一个输出PLLP用于生成高速的系统时钟(最高168MHz)
第二个输出PLLQ用于生成USB OTG FS的时钟(48MHz),随机数发生器的时钟和SDIO时钟。
专用PLL(PLLI2S)用于生成精确时钟,从而在I2S接口实现高品质音频性能。
2. 系统时钟SYSCLK可来源于三个时钟源:
①HSI振荡器时钟 ②HSE振荡器时钟 ③PLL时钟
3.STM32F4时钟信号输出MCO1(PA8)和MCO2(PC9)。
MCO1:用户可以配置预分频器(1~5)向MCO1引脚PA8输出4个不同的时钟源:HIS、LSE、HSE、PLL
MCO2:用户可以配置预分频器(1~5)向MCO2引脚PC9输出4个不同的时钟源:HSE、PLL、SYSCLK、PLLI2S
MCO最大输出时钟不超过100MHz。PLL=8MHz*N/(M*P)=8MHz*336/(8*2)=168MHz
4.任何一个外设在使用之前,必须首先使能其相应的时钟。
5.最常用的几个寄存器:RCC_CR、RCC_PLLCFGR、RCC_CRGR、RCC_AHB1ENR三个、RCC_APB1ENR两个。
注意:固件库里面基本没有调用HSI,HSE等时钟源配置函数,因为默认系统时钟初始化是在SystemInit里面设置,它是直接操作寄存器来设置的。
6.系统时钟初始化之后的状态:
SYSCLK(系统时钟) =168MHz
AHB总线时钟(HCLK=SYSCLK) =168MHz
APB1总线时钟(PCLK1=SYSCLK/4) =42MHz
APB2总线时钟(PCLK2=SYSCLK/2) =84MHz
PLL主时钟 =168MHz
初始化之后可以通过变量SystemCoreClock获取系统变量。如果SYSCLK=168MHz,那么变量SystemCoreClock=168000000。
7.Systick是24位倒计时定时器,常用来做延时,或实时系统的心跳时钟。捆绑在NVIC中,用于产生SYSTICK异常。
GPIO引脚使用记录
LED灯:PF9,PF10
蜂鸣器:PF8
按键:KEY_UP--PA0;KEY0\1\2--PE2\3\4