热度 12
2021-5-13 12:07
2286 次阅读|
0 个评论
步骤: (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 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;