打印
[STM32F4]

STM32F429-DISCOVERY-寄存器上手评测

[复制链接]
3449|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 sjw1716094642 于 2015-11-22 08:05 编辑

F429-discovery是我最喜欢的一个开发板之一,高性价比,高性能,爱不释手。淘宝170左右一个,喜欢的同学可以买一个试试,很赞。
板上集成了ST-link便于下载与调试;
板载一个2.4寸 240×320像素的TFT液晶屏,还有64Mbits SDRAM,ST MEMS(三轴陀螺仪L3GD20),LED,按键及USB OTG micro-B接口。
在这个小巧的板子上集成了相当丰富、典型的外部器件给用户开发与体验。


板载的MCU:

开发板使用的是STM32F429I 芯片180MHz/225DMIPS Cortex-M4,一个单周期DSP MAC和浮点单元。2Mbytes在芯片双BANK FLASH 存贮器,256Kbytes SRAM,复位电路,内部RC,PLL,高速执行和快速传输数据。ART加速器:内存加速器。Chrom-Art Accelerator控制器:图形加速器。2个DMA控制器以及可变存储控制器 (FMC)。超级创新的外设接口:摄像头接口,AES GCM 和CCM 支持和SHA-256。互联网接口 MAC 10/100 2个OTG接口。多至20个通讯接口:4个USART,4个UART,6个SPI,3个I2C,2个CAN,及SDIO音频接口:2个I2S和一个SAI。LCD TFT接口。模拟接口:2个12比特的DAC,3个ADC,17个定时器。外设配备可以说是相当丰富任性,可以满足各种开发的需求。

好啦,直接进入正题,开始寄存器编程
在编程前要做两件事情:
①、如果你是新装的KEIL,或者从未写过纯寄存器代码,那么更改KEIL编辑器的系统头文件



将该文件夹下的文件全部复制
粘贴到



否则在编译时系统会找不着头文件(不知道有没有别的解决办法,我一直都是这么干的,谁有好的方法告诉我哈)


②、选择所需的汇编启动文件
在这里寻找



找到头文件后放置你所建工程文件夹下,并把该文件的只读属性取消,以便不时之需


好,接下来可以准备动手写程序了


1、新建工程、选择芯片



点击“OK”





随后弹出这个对话框,点击右上角关闭即可。寄存器程序用不着它,当然我也不清楚用库函数要不要用它。。。。


2、点击这个小药瓶一样的东西 ,会弹出“Manage Project Items”,配置分组



就这么分一下吧,,,点击OK


3、双击“start”组 ,将刚才找到的汇编代码文件添加进去



4、新建一个.c文件,保存,并添加进User组



相信很多人都学过51吧,代码特别简单,一个头文件,一个软件延时,就可以做闪灯程序或是流水灯程序了,然后学到ARM感觉就好麻烦,这里时钟那里时钟的。
其实,STM32也可以那么简单,
先包涵一个头文件,#include <stm32f429xx.h>
然后,先把主函数敲上



然后,写个软件延时,这里系统默认的时钟是内部振荡器频率,16M
我也懒得管具体延时多久了,随便来一个


void delay_some_time(u32 time)
{
  u32 tp=2000*time;
  while(tp--);
}

好,不错

然后,咱们来找找discovery上面的那两个LED长哪个引脚上面了
从图上可知,是PG13和PG14


下一步,坑爹了,比51麻烦去了,要是51的话,到这里就可以闪灯了,但是STM32不一样,还要开端口时钟!!还要配置管脚!!!!
但是不着急,先打开参考手册,
查看储存器映射



可以看到GPIO的时钟,在AHB1上,故找到AHB1ENR寄存器


我们将PG的时钟使能,即 RCC->AHB1ENR|=0x40;


先来看看429的IO模式介绍

功能很多,描述的很有趣,我们要的是推挽式输出,里面竟然没有!,,,,开玩笑的,里面第六个应该叫做“具有上拉或者下拉或者上下都不拉的推挽输出”,哈哈
GPIO配置表太麻烦了,我们就不看了,想看的自己看去


然后,我们在找到GPIO的配置寄存器
第一个:模式寄存器


显然,我们要的是通用输出模式,故将G13、G14引脚配置为01即可,
也就是:GPIOG->MODER|=0x14000000;

额外说一下,大家应该注意一下复位值,这点在配置的时候还是很有讲究的


第二个:输出类型寄存器



好的,这个咱们用默认值就OK了,但我还是置零一下吧
GPIOG->OTYPER&=0x9FFF;


第三个:输出速度寄存器



点个灯用哪个速度都够了,这里就用最高速度那个吧
GPIOG->OSPEEDR|=0x3C000000;


第四个、上下拉寄存器




前面说了,我们用上下都不拉的模式,故选择00即可


GPIOG->PUPDR&=0xC3FFFFFF;


第五个、复用功能寄存器



这个寄存器不得不提一下,因为有些引脚复位值不是0,大家不注意可能会影响输出
这里通用推挽式输出选择AF0,G13G14的寄存器在高位上,故
GPIOG->AFR[1]&=0xF00FFFFF;


第六个、端口输出数据寄存器



这是用来输出高低电平的


好,经过一番努力,程序终于写差不多了



然后,记得把hex文件钩上


然后,编译。。。。。。。


果然。。。


这是因为没有提供“SystemInit”函数,到汇编文件将这几行代码注释掉即可


注释掉这三行即可


然而,,,,灯根本就没亮,,,,,这是为什么呢???
因为,程序代码没有使能FPU,但是在target里勾选了FPU选项



我们修改为not used(现在就是要赶紧闪灯,不管那么多了)


再来试一试,,,,LED终于闪起来了,



为了确认一下时钟是不是16M,我拿滴答定时器测一测,,,添加一个函数



之所以SysTick->LOAD=2*us,是因为时钟源8分频后输入SYSTICK,即输入时钟频率为2MHZ


修改后代码如下
int main(void)
{
  GPIOG_init();
  while(1)
  {
    ysu(500000);                    //延时0.5秒
    GPIOG->ODR&=0x9FFF;
    ysu(500000);
    GPIOG->ODR|=0x6000;
  }
}
好,我们试一试,,,好,果然没猜错



有点小误差,应该是内部振荡器频率偏高引起的
但是,这么猛的单片机,跑个16M也太憋屈了吧,还有,FPU还没开起来呢,那就先把FPU开了,
先在汇编里加几行代码,再把FPU设置勾回去



好,然后我们把时钟配到180M去,我们用外部晶振来做这个时钟(图太多了,这里就简单贴图片了,大家了解仔细的,对应手册看)
先看一眼时钟树吧


这里只关心这三个总线的速度,其他的暂时不予考虑

1、先把外部时钟使能了


RCC->CR|=0x10000;                      //HSE 时钟使能
  while(!(RCC->CR&0x20000))           //等待HSE 振荡器已就绪
  {
  }

2、给PLL选择时钟输入源

RCC->PLLCFGR|=1<<22;             //选择HSE做为PLL时钟源
3、设置HSE分频

RCC->PLLCFGR&=(u32)~0x3f;                          //清除分频设置
  RCC->PLLCFGR|=(u32)0x04;<span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">                           //HSE 4分频,得到2MHZ的VCO输入频率</span>
4、设置PLL分频系数

RCC->PLLCFGR&=(u32)~0X30000;                 //2分频
5、设置VCO倍频系数

RCC->PLLCFGR&=(u32)~0x7fc0;                       //清除倍频设置
RCC->PLLCFGR|=(u32)180<<6;<span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">                       //设置180倍频,得到400MHZ的VCO输出频率</span>
6、设置APB1与APB2总线的分频配置


RCC->CFGR&=(u32)~0xffff03ff;                      //清除APB1、APB2的分频配置
RCC->CFGR|=(u32)0x4<<13;                        //APB2总线2分频
RCC->CFGR|=(u32)0x5<<10;<span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">                       //</span><span style="line-height: 1.5;">APB1总线4分频</span>
7、差点忘了一件事情,FLASH等待忘设置了



使能预取,开启指令缓存数据缓存,这个功能确实厉害,亲测flash零等待,所以这么好的东西必须得用上
flash等待设为6个周期,放心,有了预取功能,就算设为7,也不会影响程序执行速度,这个我有点想不通,我总感觉4周期以上就会影响速率了,但是测试发现并没有影响。
FLASH->ACR=0x1800;                           //缓存复位
FLASH->ACR=(u32)0x706;                    //<span style="font-size: medium; line-height: 24px; background-color: rgb(255, 255, 255);">使能预取,开启指令缓存数据缓存,6个等待周期</span>
8、开启PLL

RCC->CR|=(u32)0x01000000;                           //开启PLL
while(!(RCC->CR&0x02000000))                         //等待PLL锁定
{
}


9、选择PLL位时钟源


RCC->CFGR&=0xfffffffc;                                      //清除时钟选择
RCC->CFGR|=0x02;                                           //选择PLLwei系统时钟
while((RCC->CFGR&0x0c)!=0x08)                      //等待PLL选为系统时钟
{
}
AHB不分频,故保持0值就可以了,这里也不做介绍了
系统时钟设置就大体结束了,其它个别外设设置在此也没有用到,故不展开讲解了,其实看着参考手册配置也并不麻烦
最后再加几句话
RCC->AHB1ENR=0;
RCC->AHB2ENR=0;
RCC->AHB3ENR=0;
RCC->APB1ENR=0;
RCC->APB2ENR=0;
RCC->CIR=0xffffffff;
时钟配置函数就这样了



修改一下SYSTICK的延时函数,把刚刚的乘2改为乘22.5,因为180/8=22.5

编译、烧写到单片机,,,用逻辑分析仪测一下时间。。。。


与意想的一样,而且可见外部晶振频率明显比内部的高


精力有限,只能浅显的带大家走一下寄存器,当前学寄存器的人真是相当的少,一个个都是学库函数的。
这个体验贴没有什么高大上的东西,但希望大家能对寄存器能有一个好的印象,也对这个板子有个好的印象,只要想玩,买回来就可以上手。
下载方式我不想再多说了,关于下载的介绍有很多 的帖子都有教学,十分详尽。
我这么折腾了半天,最后就是点了个灯,怪不得大家讨厌寄存器。


试用到此结束。谢谢阅读~




贴一下代码,虽然极其简易的几行程序,,,
test.zip (214.97 KB)






沙发
稳稳の幸福| | 2015-11-21 16:40 | 只看该作者
void delay_some_time(u32 time)
{
  u32 tp=2000*time;
  while(tp--);
}
很棒。

使用特权

评论回复
板凳
稳稳の幸福| | 2015-11-21 16:42 | 只看该作者



然后,记得把hex文件钩上

-----
问一下楼主,这个背景如何设置成黑色啊,我看默认是白色的,感觉黑色好酷,省电。

使用特权

评论回复
地板
天灵灵地灵灵| | 2015-11-21 17:20 | 只看该作者
多至20个通讯接口:4个USART,4个UART,6个SPI,3个I2C,2个CAN,及SDIO音频接口:2个I2S和一个SAI。LCD TFT接口。模拟接口:2个12比特的DAC,3个ADC,17个定时器。外设配备可以说是相当丰富任性,可以满足各种开发的需求。

使用特权

评论回复
5
sjw1716094642|  楼主 | 2015-11-21 21:23 | 只看该作者
稳稳の幸福 发表于 2015-11-21 16:42
然后,记得把hex文件钩上

-----

在Configuration,就是点那个小扳手,Colors&Fonts里面改颜色,一大推呢,有点麻烦的

使用特权

评论回复
6
湛只为无双| | 2015-11-21 21:30 | 只看该作者
楼主研究得真详细,可以看出来是个认真做学问的人,能让人理解的透彻,令人敬佩,给楼主赞一个~

使用特权

评论回复
7
lkl0305| | 2015-11-21 23:34 | 只看该作者
多谢楼主分享

使用特权

评论回复
8
our单片机| | 2015-11-22 01:54 | 只看该作者
虽然楼主的意图我看出来了,但是楼主这么认真的贴图还是赞一个,还有,楼主你的延时用得真棒

使用特权

评论回复
9
sjw1716094642|  楼主 | 2015-11-22 07:58 | 只看该作者
湛只为无双 发表于 2015-11-21 21:30
楼主研究得真详细,可以看出来是个认真做学问的人,能让人理解的透彻,令人敬佩,给楼主赞一个~ ...

谢谢支持

使用特权

评论回复
10
sjw1716094642|  楼主 | 2015-11-22 08:00 | 只看该作者
our单片机 发表于 2015-11-22 01:54
虽然楼主的意图我看出来了,但是楼主这么认真的贴图还是赞一个,还有,楼主你的延时用得真棒 ...

谢谢不揭穿,哈哈

使用特权

评论回复
11
wgydes| | 2015-11-22 09:23 | 只看该作者
贴这么多图~ 楼主辛苦了

使用特权

评论回复
12
稳稳の幸福| | 2015-11-23 18:26 | 只看该作者
最近遇到一个事情,那个在Keil里面,我设置的都好好的,就是点LOAD无法下载,说是找不到编程器,但是我使用那个独立的软件STM32 ST-LINK Utility就可以下载,好奇怪。我配置的都对。

使用特权

评论回复
13
稳稳の幸福| | 2015-11-23 21:35 | 只看该作者
模拟接口:2个12比特的DAC,3个ADC,17个定时器。外设配备可以说是相当丰富任性,可以满足各种开发的需求。

使用特权

评论回复
14
sjw1716094642|  楼主 | 2015-11-24 14:30 | 只看该作者
稳稳の幸福 发表于 2015-11-23 18:26
最近遇到一个事情,那个在Keil里面,我设置的都好好的,就是点LOAD无法下载,说是找不到编程器,但是我使用 ...

是不是同时开着STM32 ST-LINK Utility?

使用特权

评论回复
15
FireRiver9| | 2015-11-24 19:54 | 只看该作者
感谢楼主分享,讲的比较细

使用特权

评论回复
16
稳稳の幸福| | 2015-11-28 16:10 | 只看该作者
这么猛的单片机,跑个16M也太憋屈了吧,还有,FPU还没开起来呢,那就先把FPU开了,先在汇编里加几行代码,再把FPU设置勾回去

使用特权

评论回复
17
sjw1716094642|  楼主 | 2015-11-29 14:53 | 只看该作者
稳稳の幸福 发表于 2015-11-28 16:10
这么猛的单片机,跑个16M也太憋屈了吧,还有,FPU还没开起来呢,那就先把FPU开了,先在汇编里加几行代码, ...

是对这里有疑问吗

使用特权

评论回复
18
稳稳の幸福| | 2015-12-11 21:34 | 只看该作者
背景是如何调整成黑色的呢,我的默认的都是白底黑字,看着没有你们的酷

使用特权

评论回复
19
sjw1716094642|  楼主 | 2015-12-11 23:57 | 只看该作者
[img]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\1716094642\QQ\WinTemp\RichOle\[D16Z_AVPD](OL~$GGM6Z2F.jpg[/img]

点那个小扳手~~

使用特权

评论回复
20
sjw1716094642|  楼主 | 2015-12-11 23:58 | 只看该作者
稳稳の幸福 发表于 2015-12-11 21:34
背景是如何调整成黑色的呢,我的默认的都是白底黑字,看着没有你们的酷

看上一楼

使用特权

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

本版积分规则

个人签名:欢迎加入微控制家园,讨论微控制技术:群号 258891985

24

主题

302

帖子

8

粉丝