KST-STM32学习之小实战(按键+数码管+蜂鸣器编程初探)

完整的代码还是上传到了我的Github上<传送门>


这里主要记录一下程序需要注意以及学习的地方吧。

1、猝不及防的寄存器操作

这里写图片描述

当时读到这里,竟然卡住了,吓得我赶紧回去查查书。
果不其然,书里是有提到的,在第一章的19页

这里写图片描述

当然它还是摘自《STM32中文参考手册》的P115页

再结合一下当初的51,也就不难理解此处的含义,就是清0当前低8位的值,也就是数码管对应的段选,然后接下来要进行读取缓冲区的值,写入到该寄存器中,最下面的if else,当然就是进行位选了,较51只是段选,位选的顺序反了而已。

当然,查阅资料的过程中,还发现一个有意思的函数,《STM32固件库使用手册》

这里写图片描述

阅读函数实现后发现其实本质也是ODR寄存器的操作,不信看图。。。
这里写图片描述

2、关于不同外设对应GPIO的初始状态

蜂鸣器LED ,把引脚配置为推挽输出

按键把引脚配置成浮空输入

3、外设对应引脚的说明

数码管
这里写图片描述

按键
这里写图片描述

蜂鸣器

这里写图片描述
这里写图片描述

4、关于GPIO与APB的关系。

STM32F1系列的GPIO是挂载到APB2上面的。《STM32F103 数据手册》的P12

这里写图片描述

而F2系列,是挂载到APB1上面的。。。
这里写图片描述

5、当GPIO为输入模式的时候,配置GPIO_Speed是无意义的!

可参考这篇博文<传送门>。

所以我们写按键的相关驱动程序,进行KeyInit的时候,是没有必要设置Speed的!

6、还有一个小问题

这里写图片描述

这个TIM6_IRQn《STM32固件库手册》中查NVIC_IRQChannel的取值是没有的,然后咨询下老师,如下回复
这里写图片描述

再拐回头看下教程,着实一不一样

这里写图片描述

看来要不看最新的手册,要不就是直接参考头文件才行!

7、TIM6是挂载在APB1上的,而APB1通过前面的学习,我们知道最高是36M,而实际我我们写程序并不是36M计算的,而是72M,实际正确的答案也应该是72M,这个是为什么呢?

实际写程序的代码再现

TIM6Init(10000, 7200); //初始化定时器 6,预装载值为 10000,预分频值为 7200,定时时间 10000/(72000000/7200)=1s

其实教程也给出了答案,仔细阅读的话也会初见端倪,从第三章第七页可看到,
这里写图片描述

那么对应到这个问题就是,当AHB为72M时,我们知道APB1此时最小预分频为2,所以APB1对应为36M,
这里写图片描述
然后我们再比照上面那段教程里的话,这个时候定时器会起倍频作用,所以TIM6的最大频率为72MHz!

摘一个从数据手册里看到的更详细的图,
这里写图片描述


关于编程必须要总结的:

①、通常在.h文件中通过宏定义把函数的调用具体化,比如
这里写图片描述

②、GPIO配置的套路举例

这里写图片描述

③、static关键字以及按键的更新又忘了。。。

这里写图片描述
这里写图片描述

④、LedNumScan以及LedNumShowDec的书写
这里写图片描述

⑤、还有一个特别容易犯的错误。对应的文件是否真的添加到了工程!!!

猜你喜欢

转载自blog.csdn.net/ReCclay/article/details/81228897