完整的代码还是上传到了我的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
的书写
⑤、还有一个特别容易犯的错误。对应的文件是否真的添加到了工程!!!