本帖最后由 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)
|