六.下载程序到开发板运行
使用jlink下载
1.安装jlink驱动
(1)将jlink接到电脑USB接口,打开设备管理器
(2)安装jlink驱动
2.使用jlink连接电脑和开发板
3.配置keil5
选择调试方式为jlink
点击settings按钮,在Debug中选择SW接口,在右边看到jlink设备
在Flash Download界面,选中Reset and Run(不然要手动重启),确认flash类型正确
4.下载编译好的程序到开发板运行
注:使用jlink烧写时,保证开发板从flash启动
点击下载按钮
下载程序到开发板运行
七.使用串口线(AA线)下载程序到开发板
1.设置stm32f407从串口启动
将启动跳线BOOT0连接到3.3V,BOOT1连接到GND,URAT1跳线连接到To USB,使用AA线连接开发板和电脑。
连接成功后电脑设备管理器上会出现COM口,如果没有出现就安装驱动(驱动精灵)
2.编译生成hex文件
3.打开串口烧录软件(FlyMcu.exe)
设置正确的CON口,波特率和HEX文件路径
点击开始编程,复位开发板,等待烧写成功
练习:
实现串口烧写,完成后恢复jink方式烧录(启动跳线复原)
八.GPIO编程
GPIO叫做通用输入输出端口,用作通用的输入输出功能,输入和输出0和1,用高电平表示1,低电平表示0。在ARM中,高电平是3.3V,低电平是0V。差分信号是电压差
以LED为例介绍GPIO的开发步骤。
1.看原理图(stm32资料\原理图\GEC-M4原理图2016-07-29.pdf)
注:原理图名字相同的引脚在物理上是连接在一起的
可以在原理图上搜索PCB上的丝印的名称找到硬件对应的原理图。
看原理图要达到以下两个目的:
(1)明确要操作的硬件的工作方式(结合硬件的说明手册)
对应的引脚低电平 -------- LED亮
对应的引脚高电平 -------- LED灭
(2)要操作的硬件连接到了CPU的哪些引脚
D1 -------- PF9
D2 -------- PF10
D3 -------- PE13
D4 -------- PE14
//这些引脚都是GPIO引脚
2.查看CPU的芯片手册(stm32资料\资料文档\STM32F4xx中文参考手册.pdf)
(stm32资料\资料文档\Cortex-M3与Cortex-M4权威指南(中文).pdf)
芯片的硬件控制都是通过操作硬件寄存器来实现的。
(1)GPIO输入输出的选择
输入:浮空,上/下拉,复用,模拟
输出:推挽/开漏,上/下拉,复用,模拟 /
/推挽和开漏的区别:推挽是强上拉,开漏拉高必须外接上拉电阻
开漏具有吸收电流的功能,可以用做双向IO
(2)输出速度
快 高 中 低
(3)锁定机制
锁定GPIO的配置
(4)数据寄存器
输入数据寄存器 ------------ 获取GPIO输入的电平
输出数据寄存器 置位/复位寄存器 --------- 设置GPIO输出的电平
(5)复用功能选择
选择复用功能
(6)配置寄存器
1)查表确定寄存器配置的值
2)查看硬件寄存器
注:stm32f407共有9组GPIO(AI),每组16个(015),stm32所有的寄存器都是32位
//查看硬件寄存器需要获取的信息
1.获取硬件寄存器的地址
• stm32寄存器的地址使用的是 基地址+偏移 的表示方式
• 基地址在参考手册的2.3节的表中查询
• 比如GPIOF的基地址 ------ 0x40021400
• 每个寄存器的偏移在寄存器的说明上
2.寄存器每一位代表的内容
(7)配置PF9(通用推挽输出)需要的寄存器
1)模式寄存器
基地址 = 0x40021400
volatile unsigned int *pxx = (unsigned int *)0x40021400;
//18~19位设置为01
*pxx &= ~(0x3<<18);//00
*pxx |= (0x1<<18);//01
2)输出类型选择寄存器
3)输出速度选择寄存器
4)上下拉选择寄存器
通过以上四个寄存器完成了PF9的初始化:推挽输出,无上下拉,高速
接下来是通过 置位/复位寄存器 来控制输出的电平
如果希望GPIO正常工作,必须开启GPIO时钟开关
通过外设时钟使能寄存器去配置
基地址:0x40023800
3.编写驱动代码
stm32官方提供了寄存器地址的宏定义,可以直接使用
1.初始化
开启GPIOF的时钟
将PF9配置为推挽输出,无上下拉,高速
2.闪烁
while(1){
亮
延时
灭
延时
}
练习:
1.修改代码,实现PF10的闪烁
2.尝试PE13 PE14
4.库函数
stm32的库函数是官方封装好的函数,函数内部还是用寄存器操作来实现,如果工程中有库函数的环境,开发者只需要调用库函数即可完成对应的硬件操作,实现了和寄存器操作同样的效果,简化了编程。
库函数的使用方法,可以通过源码或者库函数手册来查询。
标准库 ------------- HAL库 --------- LL库.......
(1)GPIO初始化
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
参数:
GPIOx - 哪一组GPIO
GPIO_InitStruct - GPIO的初始化结构
typedef struct
{
uint32_t GPIO_Pin; /*!< 初始化改组的哪些引脚 @ref GPIO_pins_define */
*GPIOMode_TypeDef GPIO_Mode; /*!< 模式选择 @ref GPIOMode_TypeDef */
*GPIOSpeed_TypeDef GPIO_Speed; /*!< 输出速度 @ref GPIOSpeed_TypeDef */
*GPIOOType_TypeDef GPIO_OType; /*!< 输出模式 @ref GPIOOType_TypeDef */
*GPIOPuPd_TypeDef GPIO_PuPd; /*!< 上下拉选择 @ref GPIOPuPd_TypeDef */
}GPIO_InitTypeDef;
(2)AHB1总线时钟使能
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
参数:
RCC_AHB1Periph - 哪个时钟,比如:RCC_AHB1Periph_GPIOF
NewState - 使能/关闭 ENABLE/DISABLE
(3)设置GPIO的输出值
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//输出高 void
GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//输出低
参数:
GPIOx - 哪一组GPIO
GPIO_Pin - 改组的哪些引脚
6.如何在keil5中添加源码
源文件要加入工程左边的工程目录,头文件的路径加入到配置界面的C/C++的include paths中。
作业:
1.使用寄存器实现蜂鸣器的控制
2.使用库函数实现蜂鸣器的控制
高电平导通 ----------- 响
低电平断开 ----------- 不响
7.三极管
(1)作用
有放大和开关的作用
(2)分类和引脚
三极管的三个脚分别是 基极(b),集电极(c)和发射极(e)