DAY02-GPIO的寄存器和库函数编程

176 阅读5分钟

六.下载程序到开发板运行

使用jlink下载

1.安装jlink驱动

(1)将jlink接到电脑USB接口,打开设备管理器

0

(2)安装jlink驱动

0

0

2.使用jlink连接电脑和开发板

0

3.配置keil5

选择调试方式为jlink

0

点击settings按钮,在Debug中选择SW接口,在右边看到jlink设备

0

在Flash Download界面,选中Reset and Run(不然要手动重启),确认flash类型正确

0

4.下载编译好的程序到开发板运行

注:使用jlink烧写时,保证开发板从flash启动

0

点击下载按钮

0

下载程序到开发板运行

0

七.使用串口线(AA线)下载程序到开发板

1.设置stm32f407从串口启动

将启动跳线BOOT0连接到3.3V,BOOT1连接到GND,URAT1跳线连接到To USB,使用AA线连接开发板和电脑。

0

连接成功后电脑设备管理器上会出现COM口,如果没有出现就安装驱动(驱动精灵)

0

0

2.编译生成hex文件

0

3.打开串口烧录软件(FlyMcu.exe)

设置正确的CON口,波特率和HEX文件路径

0

点击开始编程,复位开发板,等待烧写成功

0

练习:

实现串口烧写,完成后恢复jink方式烧录(启动跳线复原)

八.GPIO编程

GPIO叫做通用输入输出端口,用作通用的输入输出功能,输入和输出0和1,用高电平表示1,低电平表示0。在ARM中,高电平是3.3V,低电平是0V。差分信号是电压差

以LED为例介绍GPIO的开发步骤。

1.看原理图(stm32资料\原理图\GEC-M4原理图2016-07-29.pdf)

注:原理图名字相同的引脚在物理上是连接在一起的

可以在原理图上搜索PCB上的丝印的名称找到硬件对应的原理图。

0

0

0

看原理图要达到以下两个目的:

(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)

0

芯片的硬件控制都是通过操作硬件寄存器来实现的。

0

(1)GPIO输入输出的选择

 输入:浮空,上/下拉,复用,模拟 
​
输出:推挽/开漏,上/下拉,复用,模拟 /
​
/推挽和开漏的区别:推挽是强上拉,开漏拉高必须外接上拉电阻                   
​
开漏具有吸收电流的功能,可以用做双向IO              

(2)输出速度

      快 高 中 低     

(3)锁定机制

       锁定GPIO的配置            

(4)数据寄存器

输入数据寄存器 ------------ 获取GPIO输入的电平
​
 输出数据寄存器 置位/复位寄存器 --------- 设置GPIO输出的电平   

(5)复用功能选择

           选择复用功能      

(6)配置寄存器

1)查表确定寄存器配置的值

0

0

2)查看硬件寄存器

注:stm32f407共有9组GPIO(AI),每组16个(015),stm32所有的寄存器都是32位

//查看硬件寄存器需要获取的信息 1.获取硬件寄存器的地址   
​
•     stm32寄存器的地址使用的是 基地址+偏移 的表示方式    
​
•    基地址在参考手册的2.3节的表中查询    
​
•    比如GPIOF的基地址 ------ 0x40021400  
​
•    每个寄存器的偏移在寄存器的说明上    
​
 2.寄存器每一位代表的内容                  

(7)配置PF9(通用推挽输出)需要的寄存器

1)模式寄存器

基地址 = 0x40021400

0

 volatile unsigned int *pxx = (unsigned int *)0x40021400; 

//18~19位设置为01 

*pxx &= ~(0x3<<18);//00 

*pxx |= (0x1<<18);//01              

2)输出类型选择寄存器

0

3)输出速度选择寄存器

0

4)上下拉选择寄存器

0

通过以上四个寄存器完成了PF9的初始化:推挽输出,无上下拉,高速

接下来是通过 置位/复位寄存器 来控制输出的电平

0

如果希望GPIO正常工作,必须开启GPIO时钟开关

通过外设时钟使能寄存器去配置

基地址:0x40023800

0

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中。

0

作业:

1.使用寄存器实现蜂鸣器的控制

2.使用库函数实现蜂鸣器的控制

0

0

高电平导通 ----------- 响

低电平断开 ----------- 不响

7.三极管

(1)作用

有放大和开关的作用

(2)分类和引脚

三极管的三个脚分别是 基极(b),集电极(c)和发射极(e)