清泉逐流

做着努力,等待幸福到来
» 日志

STM32F407中TIMER时钟

时间 : 2014-05-10 09:20 标签 : ARM  

STM32F407中,APB2最大总线时钟是AHB总线时钟的1/2,即84MHz(168MHz/2),APB1最大时钟为AHB总线的1/4,即42MH中(168MHz/4)。在用ST的库函数的时候,TIM1(APB2时钟)的时钟频率为168MHz,TIM2(APB1时钟)的时钟频率为84MHz,原因如下:

这个是Datasheet中85页的图。

可以看到APB1和APB2的时钟频率是AHB分频得来的。但是APB1和APB2在送往timer的时候,如果APB1和APB2对AHB的分频系数不为1,则要x2。默认的CMSIS库,APB1和APB2分别是经过了4分频和2分频的,因此,这里要x2,从而送往timer

查看全文 »

STM32F407上移植带FPU的UCOS-III

时间 : 2013-09-28 10:36 标签 : ARM  UCOS  

最近闲来无事将UCOS-III跑在STM32F407上试试,从Micrium官网上下载了最新的移植工程。

发现官网上的UCOS-III也是不带FPU的,看来只能自己动手了。

首先确定目标,我们主要的目的是移植一个带FPU的UCOS-III,因此首先将硬件FPU打开,关于如何打开硬件FPU,请看我之前发表的一篇文章:

http://www.eamonning.com/blog/view/416

查看全文 »

STM32F4xx 硬件浮点FPU的设置

时间 : 2013-09-25 15:09 标签 : ARM  STM32  

浮点运算一直是定点CPU的难题,比如一个简单的1.1+1.1,定点CPU必须要按照IEEE-754标准的算法来完成运算,对于8位单片机来说已经完全是噩梦,对32为单片机来说也不会有多大改善。虽然将浮点数进行Q化处理能充分发挥32位单片机的运算性能,但是精度受到限制而不会太高。对于有FPU(浮点运算单元)的单片机或者CPU来说,浮点加法只是几条指令的事情。

现在又FPU或者硬件浮点运算能力的主要有高端DSP(比如TI F28335/C6000/DM6XX/OMAP等),通用CPU(X87数学协处理器)和高级的ARM+DSP处理器等。

STM32-F4属于Cortex-M4F构架,这和M0、M3的最大不同就是多了一个F-float,即支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,还需要一些小小的设置,主要分为以下几步:

查看全文 »

Cortex-M3上跑emWin的问题

时间 : 2013-08-19 17:35 标签 : ARM  

近期一直在做的一块板子,LPC1788配7寸液晶屏,使用的1788片上显示驱动,跑的emWin V5.12,可以说是emWin确实还是一个功能很强大的GUI库,功能(包括各种控件、皮肤)还是很齐全的,相信使用Windows API写过窗口程序的朋友会发现两者很是相似,所以上手后开发效率也算是很高的。

再说说手上的这个项目,感觉LPC1788跑到120MHz然后驾驭emWin还是挺吃力的,首先,因为项目界面是专业美工设计,每个界面都会有比较多的图片,图片多了显示速度自然就会变慢。

查看全文 »

关于Keil里面的IRAM1和IRAM2

时间 : 2013-07-16 00:35 标签 : ARM  Keil  

最近依然在做LPC1788的程序,在移植开发板的TCP/IP程序时,遇到点问题。Demo程序单独运行,正常,但是移植过去之后就会出现问题,进入调试模式,发现竟然是讨厌的HardFault错误。仔细找了找,最后将问题定位到了以下这句。

按道理,这是CMSIS库,应该是不存在任何问题的,为何会如此呢?

进而查看这时候pDesc和pSource指针,发现指的都是0x2000XXXX的位置,就很莫名了。按道理,我是用的正常片内RAM应该不能到这个地址的,查看了下属性,竟然发现不知道什么时候把这个选项给勾

查看全文 »

UCOS-II中的三种临界区管理机制

时间 : 2013-06-20 21:24 标签 : ARM  UCOS  

熟悉ucos,或者读过Jean.J.La

osse写过的ucos书籍的人,一定会知道ucos中著名的临界区管理宏:

OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。

同样是通过关中断来保护临界区,OS_ENTER_CRITICAL/OS_EXIT_CRITICAL一共实现了三种实现方式,如下所示:

#if OS_CRITICAL_METHOD == 1 #define OS_ENTER_CRITICAL() __asm__("cli") #define OS_EXIT_CRITICAL() __asm__("sti") #endif

查看全文 »

说说JTAG和SWD

时间 : 2013-06-20 00:21 标签 : ARM  硬件  

SWD 和传统的调试方式区别

1. SWD 模式比 JTAG 在高速模式下面更加可靠。在大数据量的情况下面 JTAG 下载程序会失败, 但是 SWD 发生的几率会小很多。基本使用 JTAG 仿真模式的情况下是可以直接使用 SWD 模式的, 只要你的仿真器支持。所以推荐大家使用这个模式。

2. 在大家 GPIO 比较少的时候, 可以使用 SWD 仿真, 这种模式支持更少的引脚。

3. 在大家板子的体积有限的时候推荐使用 SWD 模式, 它需要的引脚少, 当然需要的 PCB 空间就小!比如你可以选择一个很小的 2.54 间距的 5 芯端子做仿真接口

查看全文 »

LPC1788开发板中Nandflash和LCD同时使用闪屏问题

时间 : 2013-06-11 00:10 标签 : ARM  

  这个问题一直困扰了好久,也就一直那么放着,今天突然拿出来说还是仔细找找原因吧。

  LPC1788自带了LCD控制器,可以说是很好很强大的一个功能,前段时间发现的问题是,LCD显示屏时,当读取Nandflash的时候,LCD屏会不断闪烁。当然出现这个问题肯定是总线冲突了,查找资料,发现可以设置总线优先级,在手册的P19页,通常可以这么设置:

  *(volatile INT32U  *)(0x400fc188) = 0xc09;

  这样就设置了总线优先级:

  LCD > DATA > CODE

  到这里,理论上应该是解决了,但是事实上还是差一点,依然闪烁。但是上面设置的总线优先级应该是没什么问题了,而且合情合理,所以就先加着吧。

  接着仔细分析,发生冲突肯定是因为SDRAM和Nandflash的冲突,为什么?因为LCD屏的显存是在外部的SDRAM中的,并且SDRA

查看全文 »

NandFlash的基本操作

时间 : 2013-03-30 15:43 标签 : ARM  

  又一个NandFlash搞了好几天,终于好了。大概记录一下自己以前不明白的几点,也方便大家遇到问题后查找。

  

  NandFlash的写入:

  写入,只能把数据(bit)从1改为0;擦除,只能把所有数据(bit)从0改为1。

  所以,要想写入数据,而不擦除,是有条件的:保证写入数据的每一个bit,不会从 0 变成 1。

  另外,确切来讲,其实只要写入的目标地址的原数据是FF,就可以写入。擦除就是把目标地址的数据变成FF。

  所以写入数据,必须写到已经擦除过的PAGE,否则数据会乱掉。

  所以,如果要写入一个Page,一个比较笨的办法是,先读取Page所在Block的所有值,先将已经写入的数据读到RAM中,更新数据,擦除Block,然后写入。

  

  NandFlash的擦除:

  一般的nand flash,擦除是以

查看全文 »

MR25H40的C语言驱动程序

时间 : 2013-03-22 20:07 标签 : ARM  

最近使用到MR25H40,MR25H40是一款4194304bit的随机存储器(MRAM),可以存储512K字节的数据。并且很大的特点是

能够提供串行EEPROM和串行Flash兼容的读写方式,并且能够容忍无限制的读和擦鞋次数。

苦于一直调试不出来,后来才发现是因为电路的焊接问题。

本着和谐友好的互联网分享态度,这里也分享一下该驱动:

下载位置:

查看全文 »
» 日志标签