步骤:
(1)收集主控芯片型号英文datasheet和中文datasheet、内核手册、其他芯片的手册;可以在半岛小芯http://www.semiee.com/查询和下载
(2)需要分析的方面:
时钟频率,也叫时钟树,电气设备都要确定工作频率,不同工作频率的片上外设连接的芯片时钟总线不同,有AHBx、APBx,所以需要在代码中体现选择了哪条时钟总线,参考《STM32Fxxx 中文参考手册》第x章节,找到对应时钟总线的 “外设时钟使能寄存器”,之后操作相应的位即可,如GPIOF的时钟控制位在 AHB1 的外设时钟使能寄存器 的 bit5,写 1 使能。所有的片上外设在未使用时,时钟处于关闭状态,此时对寄存器的操作无效 ,所以要想用哪个片上外设,第一步雷打不动:开时钟
工作时序(IIC、SPI)
中断优先级;
(3)新建一个keil(含标准库,宏名在stm32fxxx.h中找#if !defined后面()里的内容 )工程;
CMSIS 程序结构。 规定程序开始运行时执行的第一个程序必须是 SystemInit()(用于对系统进行初始化设置) ,凡是标准库函数初始化函数名都是以 Init /init 结尾,在 SystemInit() 函数之后执行的函数才是 main 函数。
(4)GPIO
复用功能的说明(信号的流向):M4内核-->(非GPIO)片上外设-->GPIO
通用定时器用 GPIO 输出 pwm,这时 CPU 告诉通用定时器周期是多长,高电平时间占多长,其他不管,具体怎么输出的是通用定时器自己的事情
模拟功能 的说明:信号输入到 STM32 内部集成的 ADC 片上外设中
仅用于ADC,DAC
锁定机制的说明:可以冻结 IO 配置
在一些可能影响芯片运行的环境如磁场、电场中使用。
一组 GPIO的16个IO口共用一套完整寄存器,通过写入设置参数进相关寄存器来使用GPIO,设置步骤是定义一个指向固定地址的指针变量,固定地址查看stm32fxxx手册的“存储器映射”部分(一般在开头几章)和“各个片上外设的寄存器表(偏移地址)”,把0或1赋值给这个变量的对应位,具体对应的哪个位查看stm32fxxx手册的GPIO寄存器部分,这样,即完成对寄存器编程,进而所谓控制stm32芯片做我们想让它做的事。
用于输出:
要想独立输出高电平 ,则选用推挽模式
如果有能提高驱动能力的上拉电阻,这时要输出高电平,选用开漏模式
如果偏向稳定性,闹一个下拉电阻
实际开发产品时常用开漏模式,原因是要降低产品功耗,并且MCU更容易输出低电平,当要输出高电平时,用上拉电阻把电平拉高,程序的体现是库函数中对应结构体对象的上拉下拉成员设置成上拉。
数据流向是变量的值赋给ODR寄存器(数据输出寄存器)
实际操作思路:
查看官方芯片手册stm32fxxx手册的GPIO一章的电子器件图,从进入芯片的口顺着电路摸向出芯片的口,途中经历的可编程的元器件是代码的用武之地,主要是赋值成0或1,毕竟0代表低电平,1代表高电平。
输出速度由电子器件图的名为输出控制的框设置,所谓速度,是引脚输出高低电平的快慢。
设置输出数据寄存器可以直接赋值,也可以间接通过赋值置位复位寄存器,这里提供思路,具体实现看stm32fxxx手册的置位复位寄存器。
实际操作步骤(输出配置过程):
开启IO口的时钟(参考stm32fxxx手册的RCC寄存器部分,根据IO口工作频率所在的时钟时钟总线查看对应寄存器的位)
①、设置 IO 为输出模式
②、设置输出速度
③、设置推挽输出/开漏输出
④、设置上拉/下拉电阻
⑤、设置输出电平(设置输出数据寄存器ODR为 1 还是 0)
用于输入:
如果外电路接了上拉电阻和下拉电阻,则选择使用浮空
//在外围电路中没有接入上拉电阻/下拉电阻时根据情况选择选择使用一个,用于确定引脚悬空(外围没有接入任何东西)时的电平状态
//输入状态下使用上拉和下拉的如何判断?
输入时无法输出(正在输出时可以发生输入,但是发生输入后一旦开始了输入,关闭输出),每隔1个时钟总线的时钟周期检测IO口的电平并用0或1保存在输入数据寄存器(IDR)中,此时程序中用变量接收IDR的值的话,变量值为0或1即为IO口的电平信号。
实际操作步骤(输入配置过程):
//激活片上外设时钟
①、设置 IO 为输入模式
②、设置上拉/下拉电阻
③、获取检测结果(读取输入数据寄存器 ,1 个IO口对应芯片的1个银色细细短短的插针,同时对应 1 个二进制位,它不是 1 个引脚对应一整个寄存器)
总 结 :GPIO要么输入要么输出要么复用要么模拟,复用时每一个 IO 最多有 16 种复用功能,但一个时刻只能用一种,所以1组16个IO口,1个IO口有16个复用功能,共计1组有256个复用功能,如果对应stm32芯片有A-I组,那么组的数量*256
复位:
寄存器中的数据是易失性数据,即掉电丢失,所以每次上电都是在重新跑程序,每次复位都是在重新跑程序
(?)中断找stm32xxx.h中的typedef enum IRQn;
文章评论(0条评论)
登录后参与讨论