STM32开发入门系列之一:开发环境搭建及Keil5的使用

之前一直在研究51系列的单片机,这段时间开始研究STM32,准备连载一个STM32的入门系列博客,一边写一边自己实践,跟大家一起分享STM32的编程经验。

系列的第一篇先介绍一下STM32的开发环境。

首先手上得有一个STM32的开发板。这一点跟51有些不同,常见的直插式51有40个针脚,几块钱买回来,配个晶振和两个电容,在洞洞板或者面包板上就能自己做51的最小系统。STM32虽然型号众多,但至今还没见过直插式封装的,大多是PQFP组件式封装,没办法弄到洞洞板和面包板上,一定要有PCB板承载,所以需要提前买好stm32的开发板,就像我手上这块STM32F103VC6T一样:
STM32F103VC6T

接下来在windows10上下载Keil5,注意需要破解,不破解的话无法编译大于2KB的文件,破解方法和破解软件自行百度。

新建工程,选择STM32F103VC系列Device:

根据自己需求选择需要引入的库文件,我们这里仅使用GPIO功能做个测试,勾选Device/StdPeriph Drivers下的GPIO选项,此时下方会提示你依赖一些其他库,分别勾选一下。这里要注意一定要勾选Device下的Startup选项,要不然项目将无法编译,虽然这个选项不会强制提示,但一定勾选!

接下来我们就可以开始写代码了,右击左侧Project窗体中的Source Group1,选择Add New Item…或者Add Existing Files…就可以新建源文件或者添加已有文件了,这里跟Keil编写51单片机的程序很类似,如果开发过程中需要引入其他库文件,可以点击上方绿色菱形按钮进行重新配置。

下一章将会介绍如何在stm32中使用GPIO,以及控制LED小灯。

单片机中UART通信,通过波特率求定时器溢出值公式

``` 12T: TH1 = TL1 = 256 - 系统晶振 / (12 * 32 * 波特率) 举例:需要波特率9600,系统晶振11.0592MHz TH1 = TL1 = 256 - 11059200 / (12 * 32 * 9600) = 256 - 3 = 253 = 0xFD ``` 这下知道TH1,TL1的值怎么来的吧。 对于STC12以上新型1T单片机系列来说,分母上的12就可以取掉了,计算公式不变。

ISSUE:STM32学习板RTC晶振不起振、起振慢,以及串口通信混乱的问题排查

根据教程配置STM32F103的RTC实时时钟
运行后,一直停留在

while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

等待晶振起振时间长达30秒到1分钟左右,并且走时不准
后来发现我买的学习板结构是这样的:
STM32F103VCT6学习板
他的PC14,PC15两个IO暴露在外面左侧双排针上,而我又是用双排母排线去接这个双排针的。
经过查询手册,PC14,PC15原来是外部RTC时钟使用的32.768KHz晶振,一旦我接上排线,相当于把这两个晶振引脚加了个非常长的天线,晶振当然很难起振。
解决办法:

  1. 弃用排线,用一根一根的杜邦线连接外部面包板(会很难看)
  2. 使用右侧双排针脚(会影响到PA9,PA10两个USART针脚,导致串口数据混乱)
  3. 剪断PC14,PC15两个针脚(这种方法一劳永逸,但会影响日后学习板的使用,今后不想使用RTC而想利用PC14,PC15作为GPIO时就尴尬了)

总之没有完美的解决办法,自己评估一下利弊做选择吧,最终产品设计PCB板时不会出现这种问题。

同样的问题:USART1串口通信混乱
就是因为我是用了上述第二种方法,将排线接到了右侧针脚上,而右侧恰恰有PA9,PA10两个USART1的针脚,万用表一量,这两个针脚与学习板上的RXD、TXD是连通的,用双排线接上去,相当于给串口引脚加了两个天线,当然传输会出错。

解决办法:评估了RTC和USART两大功能的实用程度,果断剪断了PA9,PA10两个引脚,保留了PC14,PC15.这样RTC和串口都能用了,日后RTC也能换成GPIO,而UART功能应该是必要的,没有特殊情况是不会将UART换成GPIO的。

丁丁生于 1987.07.01 ,30岁,英文ID:newflydd

  • 现居住地 江苏 ● 泰州 ● 姜堰
  • 创建了 Jblog 开源博客系统
  • 坚持十余年的 独立博客 作者
  • 大学本科毕业后就职于 中国电信江苏泰州分公司,前两年从事Oracle数据库DBA工作,两年后公司精简技术人员,被安排到农村担任支局长(其本质是搞销售),于2016年因志向不合从国企辞职,在小城镇找了一份程序员的工作。
  • Git OSChina 上积极参与开源社区