一、基础知识
1.资料查找
(1)探索者STM32F4开发板光盘结构(必读).txt ctrl+F查找
(2)I/O口---注意查找数据手册(pin definitions)凡是带FT标志的I/O口都是兼容5V的,从原理图上看带ADC的都不兼容5V。
(3)I/O资源分配、使用说明---注意查找 引脚分配表.xsl
2.例程文档
(1)readme.txt(必读,包含提示)
(2)开发指南(库函数)具体解释
(3)中文参考手册
3.驱动(设备管理器可查看)
(1)快捷方式查看设备管理器---win+R----输入命令:devmgmt.msc
(2)程序下载到开发板上的方法
1.ISP串口下载:FLYMcu下载工具(D:\嵌入式开发STMF407V2\A盘-具体资料\6,软件资料\1,软件\STM32F4串口下载软件(FLYMCU))
(注意:根据设备管理器选择正确的Port; bps最好选择76800; 选择正确的.hex文件; 一定要选择DTR低 RTS高)
2.JLINK程序下载 :首先编译无误,小槌头配置(Debug:ST-Link 勾选Run to main() settings里面port选择 SW Flash Download选择1M),点击LOAD进行下载
4.程序模板
(1)基础知识:
1.组 FWLib 下面存放的是 ST 官方提供的固件库函数(引入src中相关外设固件库)
2.组 CORE 下面存放的是固件库必须的核心文件和启动文件。
3.组 SYSTEM 是 ALIENTEK 提供的共用代码
4.组 HARDWARE 下面存放的是每个实验的外设驱动代码,他的实现是通过调用 FWLib 下面的固件库文件实现的
5.C语言/电路知识
(1) 什么叫上\下拉电阻呢?
- 上拉是对器件输入电流,即灌电流
- 下拉是从器件输出电流,即拉电流
- WK_UP 按键中电阻为下拉电阻,KEY按键中电阻为上拉电阻。
- WK_UP下拉电阻,所以IO默认低电平。WK_UP 按键接VCC,当按键按下时WK_UP为高电平,给IO口输入高电平、 即高电平有效;
- KEY接上拉电阻,所以IO默认高电平。KEY0 KEY1 KEY2 接地,当按键按下时KEY为低电平,给IO口输入低电平、 即低电平有效
(2)static关键字作用
- 普通的局部变量创建后是放在栈区中,这种局部变量进入作用域时创建,出了作用域就销毁;但static修饰后的局部变量则放在静态区中,它改变了局部变量的存储位置,从而使得变量的生命周期延长,延长至程序结束才销毁
缩小作用域,仅能自己内部使用。全局变量本身是具有外部链接属性的,在A文件中定义的全局变量,在B文件中可以通过【链接】来使用;
但如果全局变量被static修饰,那这个外部链接属性就会被修改成内部链接属性,此时这个全局变量就只能在自己的源文件中使用;
(3)位操作
C语言输出位二进制:
/*char* itoa(int value,char*string,int radix); value: 要转换的整数,可以不是int类型但是整数必须在int的范围里 string: 转换后的字符串 radix: 转换进制数,范围是2~36 */ #define uint32 unsigned int void FuncOutputBin(uint32 value) { char string[32]={0}; //形参类型uint32最大为32位 itoa(value, string, 2); printf("库函数得到的二进制为:%s\r\n",string); }
设置位(Set Bit):将特定位设置为1,通常使用按位或(OR)操作。例如,如果要将第3位设置为1,可以执行
register |= (1 << 3);
清除位(Clear Bit):将特定位清除为0,通常使用按位与(AND)操作。例如,如果要将第5位清除为0,可以执行
register &= ~(1 << 5);
切换位(Toggle Bit):将特定位的值取反,通常使用按位异或(XOR)操作。例如,如果要切换第2位的值,可以执行
register ^= (1 << 2);
读取位(Read Bit):读取特定位的值,通常使用按位与(AND)操作。例如,要读取第4位的值,可以执行
bit_value = (register >> 4) & 1;
检查位(Check Bit):检查特定位是否为1或0,通常使用按位与(AND)操作。例如,要检查第6位是否为1,可以执行
bit_is_set = (register & (1 << 6)) != 0;
修改位(Modify Bit):通过先清除位然后再设置位的方式来修改特定位的值。例如,如果要将第1位修改为1,可以执行
register = (register & ~(1 << 1)) | (1 << 1);
(4)条件编译
#ifdef //标识符,常用ifndef 如果这个标识符没有被定义,就执行下面程序,防止命名重复
程序段1
#else
程序段2
#endif
.h去判断一个标识符是否被使用过,避免重复定义
(
#ifndef 标识符
#define 标识符
主体
#endif)
(5)extern
变量声明,可多次声明,定义只有一次
extern的引用方式比包含头文件要简洁得多!extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。
(6)typedef(类型别名)
例如 typedef WAN wan;
以后WAN就可以叫wan了
(7)数据类型定义
u8 unsigned char
u16 unsigned short
u32 unsigned int
二、固件库查找
1.GPIO 端口:stm32f4xx_gpio.h 和 stm32f4xx_gpio.c
二、实验-----初级
1.跑马灯---I/O口作为输出
(1)I/O口模式
(1)GPIO_Mode_AIN 模拟输入 :I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等等。
(2)GPIO_Mode_IN_FLOATING 浮空输入:在要读取外部信号时通常配置IO口为浮空输入模式。-----数据寄存器
(3)GPIO_Mode_IPD 下拉输入:在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在低电平;并且在I/O端口输入为高电平的时候,输入端为高电平。 -----数据寄存器
(4)GPIO_Mode_IPU 上拉输入:在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平为低电平。 -----数据寄存器
(5)GPIO_Mode_Out_OD 开漏输出:通过设置位设置/清除寄存器或者输出数据寄存器的值,控制MOS管的导通。这里要注意N-MOS管,当设置输出的值为高电平的时候,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口外部的上拉或者下拉决定;当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,I/O端口的电平不一定是输出的电平。通常使用开漏输出时外部要加一个上拉电阻。
(6)GPIO_Mode_Out_PP 推挽输出:通过设置位设置/清除寄存器或者输出数据寄存器的值,控制P-MOS管和N-MOS管的导通来控制IO口输出高电平还是低电平。这里要注意P-MOS管和N-MOS管,当设置输出的值为1的时候,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定为高电平;当设置输出的值为0的时候,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定为低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,此时I/O端口的电平一定是输出的电平。
(7)GPIO_Mode_AF_OD 复用开漏输出:与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。
(8)GPIO_Mode_AF_PP 复用推挽输出:与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。
///关键函数
RCC_AHB1PeriphClockCmd() //使能IO口时钟
GPIO_Init() // 初始化IO口模式 PF9,PF10
GPIO_SetBits();//操作IO口,输出高电平
GPIO_ResetBits();//操作IO口,输出低电平
2.蜂鸣器---I/O口作为输出
///关键函数
RCC_AHB1PeriphClockCmd() //使能IO口时钟
GPIO_Init() // 初始化IO口模式 PF8
GPIO_SetBits();//操作IO口,输出高电平
GPIO_ResetBits();//操作IO口,输出低电平
3.按键输入实验---I/O口作为输入
1. 调函数GPIO_ReadInputDataBit()来读取 来读取 IO口的状态
2.按键扫描(两种模式合二为一,是否支持连续按)的一般思路
u8