暑假这几天天气比较炎热,在宿舍和室友偶然谈起STM32芯片,他说他有块F411的核心板。鉴于我之前用的几款芯片主要是F103系列和F407系列,对于F411系列的核心板倒没怎么用过。我一时心血来潮,就想玩一玩这块F411核心板。无论是F103系列也好,F407系列也罢,原理都是一样的,F411也一样。既然这样,就和这块F411芯片打打招呼。
(一)资料准备
使用的F411核心板如下图:
拿到核心板后,拿到眼前细细查看,依稀看见丝印上的芯片型号:411CEU6 。确认芯片型号后,就前往ST官网去找这款411CEU6
顺利找到芯片的家门
在reference manual 里面先瞅一眼F411xC/E 系列芯片的片上外设情况:
F411CEU6芯片引脚信息如下:
数了一下,一共48个引脚,相较于F103系列的RCT6和ZET6,引脚资源不算很多,了解这些基本信息后,就可以进行下一步的实验了。
建立工程模板
因为要点亮F411板载LED,需要查询核心板的原理图。掏出原理图,CTRL+F,快速查找LED
上面这个就是核心板上F411CEU6的原理图
可以看到,PC13控制LED的亮灭。当PC13输出低电平,发光二极管就会导通。
(二)建立工程模板
既然硬件的情况已经清楚,接下来就可以直接写初始化外设,配置寄存器参数了。但暂时不忙写代码,测试一下这个空的工程先。
不出意外的话,肯定会报错的
报错是正常的,因为在这里,我没有定义芯片型号是STM411,导致stmf4xx.h文件内配置无法使用
修改一下上图中define的内容就好,改完后如下所示:
重新尝试编译,哈哈,不出意外的话还是会报错。没关系,我们把stm32f4xx_fsmc.c文件和stm32f4xx_fmc.c和不纳入编译就好了。
现在就没有问题了
(三)编写代码
因为只是做实验,我就直接在主函数内控制LED,不去写硬件宏定义那些
1、GPIO初始化
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED相关的GPIO外设时钟*/
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOC, ENABLE);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
/*设置引脚模式为输出模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
/*设置引脚的输出类型为推挽输出*/
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
/*设置引脚为上拉模式*/
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
/*设置引脚速率为2MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*关闭LED灯*/
GPIO_SetBits(GPIOC, GPIO_Pin_13);
}
2、主函数
int main(void)
{
LED_GPIO_Config();
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
while(1);
}
(四)代码烧录
编译通过后,就开始进行烧录,实验采用SWD烧录方式,SWD只需要四线,也比较方便。而且程序也比较小,烧录的速度差异也体现不出来。
(五)实验现象
为使实验现象更加明显,我增加了延时效果,让LED闪烁。烧录程序成功后,记得按下复位键:
实验成功,已经成功和F411CEU6打过招呼了,下次和它互动一下。