打印

STM32菜鸟级学习心得

[复制链接]
2496|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
宏雕琢opt|  楼主 | 2010-11-24 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 宏雕琢opt 于 2010-11-26 10:04 编辑

菜鸟级对基于ARM cortex-M3内核的STM32F10X芯片乍看
    其实,心里挺没底的,因为单从芯片的位数上来说,大学期间接触的是16位的MCS-51单片机,而现在要应用的是32位的STM32这让人挺发憷的,毕竟一下子又多了16位,算了算了,别学了。如果你要是被这个吓到了,便是没有努力就退缩。那么不妨邪恶的战胜下自己。硬着头皮下去。
    然后你会发现,16和32,没什么大不了的,只是芯片的运算速度快了。你要看的寄存器位数多了。那么清醒一下继续奋斗下去吧。
    归正题。STM32处理器,它的寄存器功能是很庞大的,我个人认为由于其集成了很多功能模块,诸如ADC,PWM发生器,强大的定时器,中断,还有从A……E八十个I/O,甚至工作频率都能通过寄存器确定等,为了低功耗,通电后不易让所有的功能开放,或者在同一时间不易让你不需要的功能开放,所以要配置寄存器来管理它们。这点不像在单片机里,通电后所有I/O口使能。因此在STM32中有一些寄存器是用来决定是否打开这些功能的。好了先打断在这儿。告诉你一些我从菜鸟到菜鸟过程中遇到的每一个弱弱的问题。
    从应用层来说,学习STM32也就应该从寄存器配置来着手,寄存器不仅决定片内功能模块是否工作,还决定了那些功能模块按什么方式工作。那么找STM32F10X的寄存器PDF看吧,我的一共432页,看它们需要些时日,看完以后,还是有很多不懂,怎么办?答案是,没必要懂,毕竟你还没有在实践中遇到这些问题。当你以后遇到问题的时候,只要你能想起解决它需要的原理出处,建议你看,只是让你有个印象。对寄存器功能上有个大概认识。
看完那个PDF了吗?是不是迫不及待的想用开发板跑个灯玩儿玩儿了?具体程序是需要根据硬件定的,那我现在就说些思路和我遇到的菜鸟问题。那么好,先准备两样东西,第一IAR或KEIL软件,第二STM32对IAR或keil的代码文件(里面包括很多.H的系统文件,这些文件是让编译器知道你用C语言写的名字和操作对应怎样的硬件地址,就像51机里的51.h一样里面是C语言对单片机硬件系统的描述)。
我用的开发环境是IAR,如何一步一步建立一个STM32的工程,我也不会,但STM32那个文件里有一个模版,名字为project,它里面把文件的包含关系都设置好了,你需要做的是在main.c里写自己的程序,并要会添加自己其他程序的.h文件和.c文件,记住在my workspace单击鼠标右键(对于右手握鼠标的人),你会有意外收获的,多试试。
首先,在main.c里你要#include  (系统文件),比如跑灯程序,你要开灯所接I/O口的时钟,那么就要对RCC->APB2ENR寄存器配置(也就是赋值),开A^E哪个口,你就看看那432页的PDF对该寄存器的说明。所以在mian.c里申明stm32f10x_rcc.h文件,还要声明stm32f10x_gpio.h文件(敢说你没用到IO口么?这文件是初始化IO口的).
好,开说最关键的,LED.C。先建立一个LED.H,这就是头文件,在你的project文件包内的temple文件包内创一个.txt后缀改为.h。在IAR里找到main.c下拉菜单中的led.h输入
#ifndef _LED_H_
#define _LED_H_   //防止重复定义。
extern void LED(void);//在文件外找LED(void)函数
extern void delay_ms(void);//同上(记住extern和viod,我之前就不知道它们什么                           
                           //意思,extern是外部的就是指在本文件外的,void是            
                           //无返回值的函数内要写的类型定义符号.                  
#endif //结束定义
那么在main.c里你就一定要#include "LED.H"喽,因为你要调用LED.C内的函数么!
那么在LED.C里你需要写LED(void),别看它函数名字是LED,其实它就是配置IO口的,具体是设置APB2ENR->RCC决定开A^E的哪个口,设置GPIOA^E->CRH/L决定什么输出方法,开漏输出?推挽输出?(两输出的区别:前者输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,器吸收电流能力相对强.后者可以输出高,低点评,连接数字器件),然后设置GPIOA^E->ODR决定A^E中的16个口哪个口输出什么电平。
还要写延时程序delay_ms(void)通过频率计算你的机器周期,频率在syestem_stm32f10x.c文件里你会找到如下的程序。如何设置频率,你懂的。如果不能改动,把这个文件的只读属性改了就好。
//#define SYSCLK_FREQ_HSE    HSE_Value
//#define SYSCLK_FREQ_20MHz  20000000
//#define SYSCLK_FREQ_36MHz  36000000
//#define SYSCLK_FREQ_48MHz  48000000
//#define SYSCLK_FREQ_56MHz  56000000
#define SYSCLK_FREQ_72MHz  72000000
然后写自己的for语句吧,设置循环的次数*机器周期=需要的时间。值得一提的是,这样的时间是不准确的,很粗略,想要准,记得用定时器哈。
现在罗列一下自己要的跑马灯效果吧……看看在main.c里的main()中如何写自己的程序。
关于在线调试准备,在IVR里有drivers这个文件,里面有J-link的驱动文件,插上你的J-link,然后在硬件管理器里手动添加它的驱动吧。
我也是菜,文中只是我单薄的认识,不足之处希望大家给我改正哈。学习STM32的人,要坚挺!适当的时候看看它的内核哈。

相关帖子

沙发
windertakers| | 2010-11-24 11:14 | 只看该作者
不错

使用特权

评论回复
板凳
qjmxxgui| | 2010-11-24 12:59 | 只看该作者
mark

使用特权

评论回复
地板
diweo| | 2010-11-25 10:02 | 只看该作者
mcs51是16位?

使用特权

评论回复
5
宏雕琢opt|  楼主 | 2010-11-26 10:04 | 只看该作者
PC和DPTR是16位,那就应该是16位的芯片吧……

使用特权

评论回复
6
HWM| | 2010-11-26 10:29 | 只看该作者
本帖最后由 HWM 于 2010-11-26 10:30 编辑

to 5L:

看某MCU/MPU的位数需考察其CPU的“自然”数据处理长度(通常和其数据总线宽度一致)。MCS-51的PC/DPTR为16位只是说明其数据和程序存储器的地址宽度为16位(即各为64K字节)。象早期X86(16位)CPU,它的地址宽度可达24位,这不说明其就是24位的数据自然处理宽度。

学“计算机”,建议从基本的原理和结构学起。找本《计算机体系机构》之类的书看看,也许比单学个XX核的玩意儿更有价值。

使用特权

评论回复
7
宏雕琢opt|  楼主 | 2010-11-29 19:50 | 只看该作者
6# HWM
谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

0

粉丝