这几天刚刚接触STM32,遇到几个问题,记录一下,也分享个其他朋友。
关于学习方法的体会:
虽然领导催的很急,但是,拿到资料也不能太着急,要按部就班的看资料,特别是芯片参考手册和固件库的参考手册的前几节。固件库的开始页面介绍了应该怎样使用固件库,怎样开始,等等,阅读这些资料其实会节省一些时间。虽说公司有同事会STM32,但是大家都有自己的任务,不可能像再学校一样老师手把手的教,还是要靠自己。
建立第一个工程中遇到的问题:
虽然有工程模板,但是感觉不建立工程就很难真正弄清库的文件结构,所以自己建立工程。
1.选择芯片和是否使用固件库
编译时提示让我先选择使用的芯片 “Please select first the target STM32F10x device used in your application (in stm32f10x.h file)”.当时一看傻眼了,咋回事,都是按教程一步一步来的啊,怎么会有错误?文件都不缺啊。静下心来看就会明白,人家已经说得清清楚楚,在 stm32f10x.h 文件中先选择器件。如果先读手册,就可以知道应该在该文件里配置芯片型号和是否使用固件库
/*#define USE_STDPERIPH_DRIVER*/
另外,如果注意看,还能发现一个小提示:
Tip: To avoid modifying this file each time you need to switch between these
devices, you can define the device in your toolchain compiler preprocessor.
意思是可以使用编译器的preprocessor选项来定义芯片型号等,免得反复更新这个文件。具体的使用方法就是在preprocessor选项中定义如下的宏:
STM32F10X_HD,USE_STDPERIPH_DRIVER
即选择器件类型为 HD、使用固件库。
2.生成hex文件
在仿真里可以跑了,接下来当然是要下载到板子上,那么第一步就是要生成hex文件。使用EW430时可以在linker里选择生成的文件的格式,EWARM里linker选项中没有这个选项,但我确信应该是可以生成hex文件的,挨个查看各个选项,发现OutputConveter就是设置输出文件格式的,哈哈,选择输出hex。
3.程序下载(ISP)
有了hex接下来就是下载了。下载需要把Boot1接低电平,Boot0接高电平,然后通过USART1口进行下载。首先的首先,应该保证硬件连接正确。我连上硬件,无法通行,检查Boot0和Boot1,正确,检查UART口连线,正确,还是通行不成功,反复折腾后直接量TX、RX与MCU的管脚是否连接正确,结果发现坑爹的硬件工程师把MCU的TX标了RX,MCU的RX标了TX,无语。
4.程序真的能烧进去吗?
ISP下载工具跟板子能通信了,但是发现文件烧录不进去,提示“…………不是0×8000000和0×20000000区域”。郁闷呢啦。同事告诉我应该是Flash和RAM没有配置,但他也不了解IAR应该怎样配置。我晕,网上搜索,没有找到相关资料。折腾到下班,没有结果。
给一个朋友打电话请教,一看错误,告诉我应该使用一个连接配置文件,该连接配置文件对Flash、SRAM、堆栈等做了设置。
从工程模板中拷贝来配置文件,在linker选项中勾选使用配置文件,编译通过,烧入。Boot0短接到低电平,复位MCU,LED点亮。哈哈哈,此时的心情,难以言表啊。
5.串口为啥发不出来
没有JTAG,没有J-Link,那串口就是调试工具了,首先得把串口跑起来。拷贝串口的代码,下载。通信有收到数据,但是是乱码。仔细检查串口的配置,没有问题。不知道该怎么找问题了。
怀疑软件有什么地方不对,软件仿真,发现没有产生发送中断。使用工程模板和串口example,编译、下载,依然乱码。纠结。因为同事比较熟悉Keil,所以安装Keil,建立工程,在线仿真,串口正常。(看来IAR的仿真不靠谱啊!!)一般情况下,如果软件仿真正常,那在硬件上跑应该正常,反之则不一定。所以很奇怪。怀疑串口硬件连接是否有电阻电容的影响,但是能ISP下载,说明串口应该是工作正常的。最后还是同事帮我找到了原因,代码中外部晶振配置的8MHz,而我们板子上焊的16MHz,晕死。其实在库函数的手册有中说明应该根据实际的外部晶振来配置晶振频率。
To change few application-specific parameters such as the HSE crystal frequency
看来,看使用手册还是很重要的,一定要静下心来看。
呵呵,先到这里啦,有新的收获再接着写。