搜索
bottom↓
楼主: xi_liang

免费为你定制STM32教程,还没学会的来,直播培训,持续更新

  [复制链接]

出0入0汤圆

 楼主| 发表于 2014-2-27 16:20:32 | 显示全部楼层
本帖最后由 xi_liang 于 2014-2-27 16:31 编辑

FLASH缓冲区
STM32刚上电时,它是从频率为8 MHz 的内部振荡器运行的。,因此内部FLASH 的访问时间不是一个问题。但当PLL启用并作为时钟源之后,对于运行在最高性能的Cortex CPU来说,FLASH的访问时间太长了(35ns)。为了使Cortex CPU运行在72 MHz具有零等待状态,FLASH 存储器具有由两个64 位缓存器组成的预取缓冲器。FLASH缓冲区是由FLASH 访问控制寄存器控制的。
0< SYSCLK <24MHz 0 waitstate
24< SYSCLK <48MHz 1 waitstate
48<SYSCLK <72MHz 2 waitstate

这个很少看到吧,可能好多网友看到后觉得这下头大了,考虑是不是不要研究这些cortex-m3的东西了,这么多东西这么复杂,直接上库函数多好。
是的,也不是不可以,但库函数里面也有这些相关的函数,并且会很快就用到,所以我们还是要了解一下比较好

出0入0汤圆

发表于 2014-2-27 16:45:42 | 显示全部楼层
学习一下32位的。

出0入0汤圆

发表于 2014-2-27 17:06:05 | 显示全部楼层
这是在帖子上教学吗?

出0入0汤圆

 楼主| 发表于 2014-2-27 17:08:47 | 显示全部楼层
littlelincoln 发表于 2014-2-27 17:06
这是在帖子上教学吗?

是的,今天是第三天,接下来还会继续,有百为STM32开发板就可以跟贴学习了,到写LED程序的时候我们就会开始用开发板。

出0入0汤圆

发表于 2014-2-27 20:04:24 | 显示全部楼层
xi_liang 发表于 2014-2-27 15:05
这个我没试过,如果是用加载文件就很容易,但估计好多人不会用。你试下在定义寄存器的时候后面加__attrib ...

谢谢楼主,这个方法我倒知道,不行的,无法做到所有的RAM与寄存器保持热复位前的值...是noinit

出5入8汤圆

发表于 2014-2-27 20:17:24 | 显示全部楼层
支持楼主  好好听讲学习啊。


请教楼主一个问题:


今天下载的时候出现这个警告,我下载到买的开发板上就没有这个警告呢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出5入8汤圆

发表于 2014-2-27 20:19:57 | 显示全部楼层
这个警告是说我堆栈地址指向不正确,怎么设置才能解决这个问题呢?用的是IAR6.30做的开发环境。

出0入0汤圆

 楼主| 发表于 2014-2-27 20:46:41 | 显示全部楼层
diyeyuye 发表于 2014-2-27 20:19
这个警告是说我堆栈地址指向不正确,怎么设置才能解决这个问题呢?用的是IAR6.30做的开发环境。 ...

上面意思是说堆栈不对齐,你检查一下看堆栈地址是不是4字节对齐的。

出0入0汤圆

 楼主| 发表于 2014-2-27 20:57:36 | 显示全部楼层
爱则倾心 发表于 2014-2-27 20:04
谢谢楼主,这个方法我倒知道,不行的,无法做到所有的RAM与寄存器保持热复位前的值...是noinit ...

还有一个办法,自定义Scatter File分散加载文件,网上有人说用OVERLAY,你可以google下"STM32 不初始化RAM"
LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00010000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

出0入0汤圆

发表于 2014-2-27 21:03:17 | 显示全部楼层
楼主  开发板再来几次优惠活动就好了

出0入0汤圆

 楼主| 发表于 2014-2-27 21:05:19 | 显示全部楼层
pcb_newbie 发表于 2014-2-27 21:03
楼主  开发板再来几次优惠活动就好了

关于开发板的销售私聊啊,这里只讨论技术

出0入0汤圆

发表于 2014-2-27 21:06:10 | 显示全部楼层
xi_liang 发表于 2014-2-27 20:57
还有一个办法,自定义Scatter File分散加载文件,网上有人说用OVERLAY,你可以google下"STM32 不初始化RA ...

谢谢楼主,我搜搜,这些代码是贴到程序里还是在启动代码里找到?不知道楼主有没有分析过STM32的启动代码,我从头到尾理了一遍也没发现在哪里执行的初始化或说零化RAM和寄存器.....郁闷

出0入0汤圆

 楼主| 发表于 2014-2-27 21:23:00 | 显示全部楼层
爱则倾心 发表于 2014-2-27 21:06
谢谢楼主,我搜搜,这些代码是贴到程序里还是在启动代码里找到?不知道楼主有没有分析过STM32的启动代码 ...

这个分散加载文件是在工程里设置的,具体可以我另一个帖子
http://www.stm32bbs.com/forum.php?mod=viewthread&tid=1771&extra=

出0入0汤圆

发表于 2014-2-27 21:24:56 | 显示全部楼层
xi_liang 发表于 2014-2-27 21:23
这个分散加载文件是在工程里设置的,具体可以我另一个帖子
http://www.stm32bbs.com/forum.php?mod=viewt ...

谢谢,学习一下

出0入0汤圆

发表于 2014-2-27 22:29:02 | 显示全部楼层
谢谢!楼主辛苦了!

出0入0汤圆

发表于 2014-2-27 22:38:28 | 显示全部楼层
建议USB那块讲一下107的内置USB怎么用。

出0入0汤圆

 楼主| 发表于 2014-2-28 00:54:51 | 显示全部楼层
本帖最后由 xi_liang 于 2014-2-28 12:23 编辑

看了这么多,浏览完cortex-m3技术手册,STM32数据手册,是时候该来动手了,最小系统要上场了。怎样去设计这个最小系统呢?ST已经帮你做好了一份文档《STM32F10xxx硬件开发使用入门.pdf》,照着这个来就可以了,下面来摘要讲一下
电源控制
STM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器为cortex核心提供所需的1.8V电源。 当主电源VDD掉电后,通过VBAT脚为实时时钟(RTC)和备份寄存器提供电源。

这里有三个部分
VDD供电区域:这个就不用说了吧。
        如果使用ADC,VDD的范围必须在2.4V到3.6V之间
        如果没有使用ADC,VDD的范围为2V到3.6V
VDDA供电区域:独立的ADC电源
        VREF-引脚必须连接到VSSA,而VREF+必须在2.4V和VDDA之间
后备供电区域:STM32有一部分寄存器是位于这个区域的(备份寄存器和RTC模块),有电池供电时可以掉电保存的。具体是哪些寄存器,后面会有两个章节专门介绍:备份寄存器、RTC实时时钟。
        VBAT引脚必须被连接到外部电池(1.8V < VBAT < 3.6V),如果没有外部电池,这个引脚必须连接到VDD

复位电路

下面几种事件都会导致系统复位
1.NRST引脚上出现低电平(外部复位)
2.窗口看门狗计数终止(WWDG复位)
3.独立看门狗计数终止(IWDG复位)
4.软件复位(SW复位)
5.低功耗管理复位
这里暂时要是知道STM32是低电平复位的就行了。还有就是把复位信号和JTAG的复位信号连在一起,这样就可以在JLINK仿真的时候复位芯片了。

晶振时钟
这里主要有两个时钟,一个是系统主时钟,另一个主要RTC时钟
主时钟
1.HSI内部高速时钟   内部振荡器不够外部晶体振荡器准确和稳定,所以我们一般电路设计都用外部晶振
2.HSE外部高速时钟   外部晶振可以是有源的,也可以是无源的,4M~16M范围,因为系统频率72Mhz是通过内部PLL倍频即用整数值乘以HSE振荡器频率得来的,所以这个晶振频率最好是能被72Mhz整除。下图是HSE外部晶振


RTC时钟
1.LSI内部低速RC振荡器大约为40kHz,这个内部RC一般不太准(尽管可以进行LSI校准),所以电路设计时我们也是采用外部32.768kHz晶振
2.LSE外部低速时钟32.768kHz,如下图


JTAG接口
STM32的下载调试接口有两种方式,一个是标准的5根信号线JTAG方式,另一个种是2根信号线的SWD方式。这里讲JTAG方式的:


BOOT0 BOOT1启动

这个就是我们前面说过的STM32有3个启动模式,1、从system memory(出厂bootloader)启动  2、从user flash启动 3、从sram启动
那从电路上设计,boot0,boot1就要是高低电平可选的了,参考下图


这里有好多术语,不少朋友看到会说,这个我记不住啊,是的,记不住没关系,看多两遍它就跟你熟了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入16汤圆

发表于 2014-2-28 13:54:02 | 显示全部楼层
主闪存存储器和系统存储器都是从ROM启动运行,主要是开始的引导程序不同而已吧?而内置SRAM是从RAM启动吧?即程序存储在RAM中

出0入0汤圆

 楼主| 发表于 2014-2-28 14:00:13 | 显示全部楼层
liuruoshui 发表于 2014-2-28 13:54
主闪存存储器和系统存储器都是从ROM启动运行,主要是开始的引导程序不同而已吧?而内置SRAM是从RAM启动吧? ...

是的,没错。从ROM启动这个可能很多人不明白为什么它不是从0x00000000地址处启动的。如果学过ARM7,ARM9的就知道了,很多芯片内部有地址重映射的功能,硬件可以把非0的地址映射到0地址处。或者内部有个bootloader,可以调用运行非0地址的程序。内部SRAM启动,这个一般我们很少用。

出0入0汤圆

发表于 2014-2-28 14:43:28 | 显示全部楼层
真的很全面

出0入0汤圆

 楼主| 发表于 2014-2-28 15:04:29 | 显示全部楼层
cortex-m3还有很多内容没看完,但全部看完的话那要猴年马月哦,赶快开始了解编程吧,我们学单片机一开始不是学寻址方式,指令集吗对吧,这里也一样有同样的内容。
ARM 汇编程序设计
寻址方式
1.寄存器寻址
        MOV           R1, R2;                         //把R2的值存入R1
2.立即数寻址
        MOV           R0, #0;                        //把R0寄存器清0
        SUBS    R0, R0, #0x20;         //把R0寄存器的值减0x20
3.寄存器移位寻址
        MOV    R0, R2,LSL #3;            //R2的值左移3位,结果放入R0,即R0=R2*8       
4.寄存器间接寻址
        LDR     R1, [R2];                  //把R2指向的寄存器的内容保存到R1中
5.基址变址寻址
        LDR     R2,[R3,#0x02];             //读取R3+0x02地址指向的存储单元的内容,放入R2
6.多寄存器寻址
        STM     R0!, {R4-R11};                 //把R0指向的单元中的数据读出到R4~R11中(R0自动加1)

指令集

这些不用每条都会,但如果要了解汇编启动代码,移植UCOS底层,那至少要会那几条基本的指令吧,MOV,LDR,STR,ADD,SUB,LDM,STM,B,BL,BLX,BX,MRS,MSR,PUSH,POP,CPIE,CPID,PUSH,POP
这些在启动代码和UCOS汇编底层里会用到的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入16汤圆

发表于 2014-2-28 16:14:14 | 显示全部楼层
楼主一定不要急躁,我认为把硬件架构掌握好,熟悉各个各个外设与系统总线的连接,这样做起程序来也知根知底!系统时钟、复位电路、DMA、AHP、APB总线连接的各个外设,若是楼主能一一道来,深入挖掘一下!能造福众网友,但是可能费很大脑力,我也没权利要求这些,在这里能跟随楼主一起学习!

出0入0汤圆

 楼主| 发表于 2014-2-28 18:56:07 | 显示全部楼层
liuruoshui 发表于 2014-2-28 16:14
楼主一定不要急躁,我认为把硬件架构掌握好,熟悉各个各个外设与系统总线的连接,这样做起程序来也知根知底 ...

RCC时钟是必须的,还有NVIC中断优先级,IO复用等等都是每个程序必要要考虑的,各种外设可能要具体外设使用的时候再去看吧。虽然我现在在整理,发现还是要反复看,很多内容有交叉。

出0入16汤圆

发表于 2014-2-28 19:55:47 | 显示全部楼层
xi_liang 发表于 2014-2-28 18:56
RCC时钟是必须的,还有NVIC中断优先级,IO复用等等都是每个程序必要要考虑的,各种外设可能要具体外设使 ...

这也是一个学习的过程,有收获是对自己最好的回报!

出0入0汤圆

发表于 2014-2-28 20:12:46 | 显示全部楼层
顶起啊,好贴。

出0入16汤圆

发表于 2014-3-1 17:07:41 | 显示全部楼层
楼主怎么没有更新啊!期待呢!

出0入0汤圆

 楼主| 发表于 2014-3-1 19:11:39 | 显示全部楼层
liuruoshui 发表于 2014-3-1 17:07
楼主怎么没有更新啊!期待呢!

今天去工厂跟生产去了,课程明天继续

出0入0汤圆

 楼主| 发表于 2014-3-1 19:13:58 | 显示全部楼层
本帖最后由 xi_liang 于 2014-3-2 14:54 编辑






看了那么多资料,蠢蠢欲动要开始编程了吧,我们又有疑问了,这个是用什么来编译程序的呢?怎么样编译呢,怎样下载程序到开发板运行呢?
1、编译STM32程序有很多种方法,用得比较多的有两个工具,一个是KEIL,一个是IAR。这里以KEIL为例,首先我们得装一个KEIL软件吧,按照文档《KEIL MDK安装教程.pdf》的步骤装完软件。
2、然后要写程序来编译,那得先建个工程,编写代码,按照文档《KEIL MDK新建工程和编译程序步骤.pdf 》来弄就可以了
3、编译完程序之后,就可以下载程序到开发板看结果了,这里介绍两种常用的烧写方法,一种是KEIL(软件)+JLINK(硬件)的,一种是Flash Loader Demo(软件)+USB转串口线的,
具体步骤可以参考文档《如何通过KEIL MDK下载程序.pdf》和文档《如何通过USB转串口线下载程序.pdf 》

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-3-1 22:09:37 | 显示全部楼层
MARK!讲解非常详细!

出0入0汤圆

发表于 2014-3-2 10:20:00 | 显示全部楼层
会一直关注楼主,讲的很通俗易懂。希望楼主坚持下去。

出0入0汤圆

 楼主| 发表于 2014-3-2 17:15:23 | 显示全部楼层
本帖最后由 xi_liang 于 2014-3-2 20:43 编辑

前面liuruoshui提到这个硬件架构,是有那么一个情况,我们对系统的框架了解不深入,确实不好下手写程序,不知道外设在什么情况下能控制,在什么情况下不能控制;不知道哪些开关要打开,哪些寄存器要设置。那这里来看下系统的框架
STM32系统构架


从上面图中可以看出,STM32内部有一个Cortex-M3核心:像SysTick定时器,Nvic嵌套向量中断控制,JTAG调试端口这些模块都是在这个核心里面的。

STM32有两个DMA控制器,其中DMA1有7个通道,DMA2有5个通道。

AHB总线,APB总线:在程序控制的角度来看,它们对应两个时钟,后面我们会看到,其中一个是AHB时钟(HCLK),一个是APB时钟(PCLK)。而APB时钟又为APB1,APB2两个时钟,APB1操作速度最高是36MHz,APB2操作速度最高是72MHz,怎么去设置这些时钟频率?这个又对应有几个预分频器,AHB预分频器,APB1预分频器,APB2预分频器。STM32的各个模块都有对应的时钟源,当要使用模块时,要把对应的时钟打开。比如我们要使用GPIOF,就要打开APB2的时钟(设置APB2外设时钟使能寄存器(RCC_APB2ENR))

DMA(Direct Memory Access)是什么东西?其实就是内存搬运工,CPU指定好源地址,目的地址,方向,数据宽度等等,启动DMA之后,它就会自动帮你搬运数据,CPU可以去干别的事情去了,等它搬运完成它会设置寄存器的标志位或者产生中断,告诉CPU它已经搬运完成了。上面还有个DMA通道,这个也不知道什么意思?比如SPI要用DMA传输,I2C也要用DMA传输,那他们就可以用两个不同的通道。具体用哪个通道,不是随便用的,数据手册上有规定的

外设才是我们要学习的主要内容,学那么多不就为了控制各种外设吗
那先从GPIO开始,这个STM32有多少个IO口?这个我真没去数过,每个芯片的IO数目都不一样,但我知道STM32F103ZET6有GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG这些端口,其中每个GPIO端口又有16个管脚,如PA0~PA15。怎么去控制这个IO口的电平,我们在稍后的GPIO章节里会详细介绍。AFIO是IO复用功能,比如可以通过设置寄存器,把某些管脚当作I2C来用,也可以通过设置寄存器把它作为GPIO来用。那芯片管脚默认的功能是复用功能还是GPIO功能呢,这个可以查《数据手册STM32F103xC STM32F103xD STM32F103xE.pdf》

SPI,硬件就是四个管脚,MOSI主机输出/ 从机输入,MISO主机输入/ 从机输出,SCLK 时钟信号(由主设备产生),CS使能信号(由主设备控制)。软件是设置好数据宽度,时钟沿,传输速度等等,然后开始传输8位或16位数据。

I2C,硬件就是两个管脚,SDA,SCL,分别是串行数据线和串行时钟线。

IWDG(独立看门狗),WWDG(窗口看门狗),这两个是51,AVR,ARM7,ARM9都没有的概念,一开始看到觉得很好奇吧,在想两个有什么不同?这个两句话说不完,暂时对编写LED程序没什么影响,后面具体再详细讲。

发现没,要学的东西好多,我就写这么一段,也把三四个PDF翻来翻去。翻到后面,发现前面漏了,又给补上。我发现自己学东西需要翻阅很多资料,几乎我们开发板光盘里跟STM32有关的PDF我都翻过,中英文的都有,有些没看完但至少浏览过。但我觉得自己不笨啊,我想学的技术基本都学会了,像uCOS作者那本书,当初看得很头痛啊,但坚持一两个月,每天也就看那么一两页,后来发现居然看懂了。linux很难啊,我读书的时候就想,会linux的都是什么人啊,绝不可能是我。但没想到后来自己也做嵌入式linux软件了,这里想说的是,坚持很重要。










本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-3-2 23:41:39 | 显示全部楼层
别沉了,顶起来!

出0入0汤圆

发表于 2014-3-3 00:43:44 来自手机 | 显示全部楼层
谢谢楼主,确实,坚持很重要

出0入0汤圆

发表于 2014-3-3 08:19:59 | 显示全部楼层
顶起来,一起学习

出0入0汤圆

发表于 2014-3-3 08:55:12 | 显示全部楼层
“像uCOS作者那本书,当初看得很头痛啊,但坚持一两个月,每天也就看那么一两页,后来发现居然看懂了。”真是感觉楼主讲的东西对胃口。呵呵,希望大家一起和楼主学习,最后楼主也出一本大话STM32。

出0入0汤圆

发表于 2014-3-3 10:05:55 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2014-3-3 10:34:06 | 显示全部楼层
不错哦!

出0入0汤圆

发表于 2014-3-3 10:34:25 | 显示全部楼层
支持!!!!

出0入0汤圆

 楼主| 发表于 2014-3-3 17:22:15 | 显示全部楼层
本帖最后由 xi_liang 于 2014-3-4 19:15 编辑

要对GPIO进行操作,那首先要知道我们在程序中要控制的是哪个引脚。然后说到这个引脚,这里又有一个新的概念:AFIO。AFIO是复用功能,意思是芯片引脚都有一个默认的复用功能的,但也可以通过设置寄存器把引脚映射到另一个位置。如果不是默认的复用功能,还要打开AFIO时钟(这个具体怎样打开后面再介绍),下面来看下AFIO复用功能到底是怎样的:

AFIO复用功能

以100脚芯片为例

从上图可以看出芯片引脚可以从默认的位置重映射到另一个位置的


从上图可以看出,引脚上电后的功能,还有一个默认的复用功能和重定义功能。怎样把上电后的功能设置为默认的复用功能呢?比如上面的PA0什么时候是USART2_CTS的功能?这个是通过设置端口配置低寄存器(GPIOx_CRL)来实现的。
怎样把引脚用做重定义功能呢,这个也就是引脚的重映射功能,先来看个图



可以通过设置下面这个寄存器来实现引脚的重映射:复用重映射和调试I/O配置寄存器(AFIO_MAPR),上图中的USART2_REMAP就是这个寄存器中的一位。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-3-3 17:29:06 | 显示全部楼层
关注,先赞一个

出0入0汤圆

发表于 2014-3-3 19:29:36 | 显示全部楼层
      顶起!            

出0入0汤圆

 楼主| 发表于 2014-3-3 20:21:41 | 显示全部楼层
yujietangying 发表于 2014-3-3 08:55
“像uCOS作者那本书,当初看得很头痛啊,但坚持一两个月,每天也就看那么一两页,后来发现居然看懂了。”真 ...

这个教程有点根据回忆来写的意思,尽量回忆自己当时学的时候遇到什么问题,让大家少走弯路。其实UCOS没有想象中那么难,只是有很多概念没接触过需要花多点时间而已

出0入0汤圆

发表于 2014-3-4 00:11:58 来自手机 | 显示全部楼层
本帖最后由 ijlc1314 于 2014-3-4 14:56 编辑

今天在百为板子上移植开源的tjpgdec这个解码程序,从tf卡上打开读取jpg图片正常,但解码时总是返回格式错误,不知道楼主有没有遇到过?

PS:今天尝试单独把 tjpgd.c 这个文件的优化级别降低,可以正常解码显示了。感觉好奇怪,以前在其它的板子上也移植过,优化开到最高没问题,
       不知道是不是MDK版本不同的原因了

出0入0汤圆

发表于 2014-3-4 00:15:37 来自手机 | 显示全部楼层
本帖最后由 ijlc1314 于 2014-3-4 14:57 编辑

还有一个奇怪的问题,程序在MDK中用JLINK   JTAG模式下载到板子上运行正常,可如果进入调试,就老是进HardFault,始终找不到原因

PS:今天继续调试,发现好像跟断点有关

出0入0汤圆

发表于 2014-3-4 00:18:03 | 显示全部楼层
希望LZ能够着重讲下USB和UCOS,谢谢

出0入0汤圆

发表于 2014-3-4 09:02:40 | 显示全部楼层
楼主有空如果可以也可以写写自己的学习生活经历,一边学一边看,哈哈,一直跟随楼主。

出0入0汤圆

 楼主| 发表于 2014-3-4 16:54:50 | 显示全部楼层
本帖最后由 xi_liang 于 2014-3-4 17:22 编辑

听说STM32可以跑到72Mhz,甚至更高,那这个频率是怎么来的呢?我们板上的主晶振只有8Mhz,怎么通过8Mhz来得到72Mhz?这个就是复位和时钟控制系统(RCC)的内容了

RCC时钟系统

STM32主要有以下几个时钟源:

三种不同的时钟源可被用来驱动系统时钟(SYSCLK),这个SYSCLK就是我们所说的系统时钟,最大为72Mhz。
HSI:内部高速时钟,8Mhz左右
HSE:外部高速时钟,即百为STM32开发板上的标号为X1的主晶振,8Mhz
PLL:PLL时钟,可以是HSI或HSE的倍频,倍频后可达到72Mhz

两种二级时钟源:
LSI:内部低速时钟,40Khz左右。可以用于驱动独立看门狗和通过程序选择驱动RTC
LSE:外部低速时钟,即百为STM32开发板上的标号为X2的RTC晶振,32.768Khz晶振,用来驱动RTC时钟

因为内部时钟不太准确,所以我们一般都是用外部时钟,系统时钟一般是通过HSE倍频后得到72Mhz。选择哪个时钟,设置什么频率是由程序来决定的



上面这个图怎么看呢?可以先从左边开始看,HSE OSC连接的就是我们开发板上的主晶振8Mhz,LSE OSE连接的就是我们开发板上的RTC晶振32.768Khz。
PLLMUL是PLL倍频系数,比如设置倍频值为9,那PLL时钟就等于8Mhz*9 = 72Mhz
SW是系统时钟切换选择,可以选择HSI,HSE,PLL其中一个作为系统时钟SYSCLK。
HCLK一般是设置为等于SYSCLK,对应AHB预分频器。
PCLK1,PCLK2是连接到各个外设的时钟,分别对应APB1预分频器,APB2预分频器。

以上几个参数都是在时钟配置寄存器(RCC_CFGR)里设置的

上面这里主要是研究寄存器,因为我们对底层不了解,对STM32是个什么东西没底,所以要去了解它。当我们知道它大概是什么东西以后,就可以触类旁通,就不用每个寄存器都去这么研究了,要用到的时候再去翻阅技术手册就可以了。
在这里也是主要提供一个学习的思路,很多技术的细节还是要以数据手册为准。

另外说说我为什么会移植LWIP,为什么能看懂USB协议?
大家都知道这方面资料比较少,可能现在会多一些。有段时间几个月都在看网上能搜到的LWIP资料,焦海波的,老衲五木的,看了好久,几个月,只知道个大概,要移植LWIP无从下手,
后来有一天我在英文官方网站看到了关于LWIP移植的介绍,一看有种豁然开朗的感觉。
USB协议,电脑圈圈大家都知道,好象我和他还是同一年毕业的,当时他出了那本USB的书,我看了觉得原来USB是那么一回事,但我对USB还不是完全了解,直到我看了官方的USB协议文档,才发现原来全部东西都在这里。
PS:LWIP和USB,我看中文的没有看英文的时间多。初学者还是别看英文吧,如果想有更大的提高,英文会让你快人一步



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-3-4 17:01:43 | 显示全部楼层
ijlc1314 发表于 2014-3-4 00:11
今天在百为板子上移植开源的tjpgdec这个解码程序,从tf卡上打开读取jpg图片正常,但解码时总是返回格式错误 ...

怎么不用UCGUI,里面也有显示JPEG的函数:GUI_JPEG_Draw

出0入0汤圆

 楼主| 发表于 2014-3-4 17:06:13 | 显示全部楼层
yujietangying 发表于 2014-3-4 09:02
楼主有空如果可以也可以写写自己的学习生活经历,一边学一边看,哈哈,一直跟随楼主。 ...

学习经历也有写过一些,不过是几年前的了,学ARM+Linux的

[原创]我的arm+linux入门学习经历
http://www.amobbs.com/thread-5509423-1-1.html

出0入0汤圆

发表于 2014-3-4 17:11:21 | 显示全部楼层
xi_liang 发表于 2014-3-4 17:01
怎么不用UCGUI,里面也有显示JPEG的函数:GUI_JPEG_Draw

谢谢,回头我试一下使用uCGUI的解码。其实我觉得在STM32上解码JPG没太大意义吧,只能当是学习,解码很慢。

现在把解码后的数据先存在外部SRAM,看起来还可以。但感觉没BMP实用

出0入0汤圆

发表于 2014-3-4 17:30:07 | 显示全部楼层
xi_liang 发表于 2014-3-4 17:06
学习经历也有写过一些,不过是几年前的了,学ARM+Linux的

[原创]我的arm+linux入门学习经历

听说周立功出200多的A系列板子了,现在stm32加ucos还没怎么学,心里还想学linux。一直给老师做ERP的项目,太累了。

出0入0汤圆

发表于 2014-3-4 18:15:53 | 显示全部楼层
非常感谢楼主的教材。我现在使用的M4 ,学的也不好,看楼主的,感觉自己还是很菜的,

出0入16汤圆

发表于 2014-3-4 18:30:47 | 显示全部楼层
楼主可以抓重点讲,或者是谈一下自己的认识,例如GPIO的基本模式可能大家都知道,但是关于重映射和复用功能就不一定了,STM32的定时器功能非常强大,能够完全掌握了解,就非常了不起,期待搂着对这部分的通俗讲解!

出0入0汤圆

发表于 2014-3-4 18:42:04 | 显示全部楼层
yujietangying 发表于 2014-3-3 08:55
“像uCOS作者那本书,当初看得很头痛啊,但坚持一两个月,每天也就看那么一两页,后来发现居然看懂了。”真 ...

深有同感啊,很多资料第一遍看一头雾水,第二遍看拨云见月,第三遍看只剩下裤衩了,第四遍看 都裸了
所以很多东西不是看不懂,是自己不想看!

出0入0汤圆

发表于 2014-3-4 19:00:04 | 显示全部楼层
楼主可以做一个详细的关于stm32的程序调试的视频,介绍点调试技巧什么的

出0入0汤圆

发表于 2014-3-4 19:41:43 | 显示全部楼层
谢谢楼主分享,谢谢!

出0入0汤圆

发表于 2014-3-4 21:09:47 | 显示全部楼层
xi_liang 发表于 2014-3-2 17:15
前面liuruoshui提到这个硬件架构,是有那么一个情况,我们对系统的框架了解不深入,确实不好下手写程序,不 ...

但没想到后来自己也做嵌入式linux软件了,这里想说的是,坚持很重要。

这句话说的好,最近在学stm32很纠结真的

看不懂,之前51玩的很火很溜

出0入0汤圆

发表于 2014-3-4 21:23:02 | 显示全部楼层
感觉可以这样写写,比如PA1 = 0怎么去操作,该怎么操作,流程是什么,这样就能懂了  嘿嘿

出0入0汤圆

发表于 2014-3-4 22:23:12 | 显示全部楼层
顶起。。

出0入0汤圆

发表于 2014-3-4 22:59:20 | 显示全部楼层
mark!!!!!!!!!!!!!!

出0入0汤圆

发表于 2014-3-4 23:09:26 | 显示全部楼层
顶LZ,最近也开始学习STM32呢..............

出0入0汤圆

发表于 2014-3-4 23:12:02 | 显示全部楼层
话说,我现在只是用库函数弄亮了LED,LZ,我现在应该去学寄存器版本的么------求建议

出0入0汤圆

发表于 2014-3-5 00:24:32 来自手机 | 显示全部楼层
32用了差不多一年了,不过还是有很多没有搞清楚,跟LZ学习下。

出0入0汤圆

发表于 2014-3-5 00:38:14 | 显示全部楼层
来学习了,刚买了原子的mini,准备开始

出0入0汤圆

发表于 2014-3-5 09:13:38 | 显示全部楼层
楼主辛苦
这个要坚持看,坚持顶^_^

出0入0汤圆

发表于 2014-3-5 11:16:51 | 显示全部楼层
bosia仔 发表于 2014-3-5 00:38
来学习了,刚买了原子的mini,准备开始

什么价格?有网址没有呢。。。

出0入0汤圆

发表于 2014-3-5 13:26:23 | 显示全部楼层
我要上课,注意不错,多初学者有 好处。谢谢!

出0入0汤圆

 楼主| 发表于 2014-3-5 13:34:35 | 显示全部楼层
湛泸骏驰 发表于 2014-3-5 11:16
什么价格?有网址没有呢。。。

注意,这个是用百为STM32来上课的哦,不讨论销售问题,开发板销售请到淘宝咨询

出0入0汤圆

 楼主| 发表于 2014-3-5 16:30:04 | 显示全部楼层
中断向量表
学过单片机都知道,我们程序复位后是从0地址开始执行的,然而Cortex-M3的中断向量表不是从零开始而是从地址0x00000004开始,因为前四个字节被用来存储堆栈指针的起始地址。
每个中断向量入口占4个字节,并保存有每个中断服务程序的起始地址。前15个中断入口表示Cortex-M3内核的异常,包括复位向量,不可屏蔽的中断,故障和错误管理,调试异常,还有SysTick定时器中断等。
厂商自定义的外设中断从第16个中断入口开始。下图是STM32F10xxx产品(小容量、中容量和大容量)的中断向量表,STM32F103ZET6属于大容量产品,512K ROM,64K RAM




对照我们之前用KEIL建工程时加入的启动代码startup_stm32f10x_hd.s,有下面内容:
  1. __Vectors      
  2.                 DCD     __initial_sp               ; Top of Stack
  3.                 DCD     Reset_Handler              ; Reset Handler
  4.                 DCD     NMI_Handler                ; NMI Handler
  5.                 DCD     HardFault_Handler          ; Hard Fault Handler
  6.                 DCD     MemManage_Handler          ; MPU Fault Handler
  7.                 DCD     BusFault_Handler           ; Bus Fault Handler
  8.                 DCD     UsageFault_Handler         ; Usage Fault Handler
  9.                 DCD     0                          ; Reserved
  10.                 DCD     0                          ; Reserved
  11.                 DCD     0                          ; Reserved
  12.                 DCD     0                          ; Reserved
  13.                 DCD     SVC_Handler                ; SVCall Handler
  14.                 DCD     DebugMon_Handler           ; Debug Monitor Handler
  15.                 DCD     0                          ; Reserved
  16.                 DCD     PendSV_Handler             ; PendSV Handler
  17.                 DCD     SysTick_Handler            ; SysTick Handler

  18.                 ; External Interrupts
  19.                 DCD     WWDG_IRQHandler            ; Window Watchdog
  20.                 DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
  21.                 DCD     TAMPER_IRQHandler          ; Tamper
  22.                 DCD     RTC_IRQHandler             ; RTC
  23.                 DCD     FLASH_IRQHandler           ; Flash
  24.                 DCD     RCC_IRQHandler             ; RCC
  25.                 DCD     EXTI0_IRQHandler           ; EXTI Line 0
  26.                 DCD     EXTI1_IRQHandler           ; EXTI Line 1
  27.                 DCD     EXTI2_IRQHandler           ; EXTI Line 2
  28.                 DCD     EXTI3_IRQHandler           ; EXTI Line 3
  29.                 DCD     EXTI4_IRQHandler           ; EXTI Line 4
  30.                 DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
  31.                 DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
  32.                 DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
  33.                 DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
  34.                 DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
  35.                 DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
  36.                 DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
  37.                 DCD     ADC1_2_IRQHandler          ; ADC1 & ADC2
  38.                 DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
  39.                 DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
  40.                 DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
  41.                 DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
  42.                 DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
  43.                 DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
  44.                 DCD     TIM1_UP_IRQHandler         ; TIM1 Update
  45.                 DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
  46.                 DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
  47.                 DCD     TIM2_IRQHandler            ; TIM2
  48.                 DCD     TIM3_IRQHandler            ; TIM3
  49.                 DCD     TIM4_IRQHandler            ; TIM4
  50.                 DCD     I2C1_EV_IRQHandler         ; I2C1 Event
  51.                 DCD     I2C1_ER_IRQHandler         ; I2C1 Error
  52.                 DCD     I2C2_EV_IRQHandler         ; I2C2 Event
  53.                 DCD     I2C2_ER_IRQHandler         ; I2C2 Error
  54.                 DCD     SPI1_IRQHandler            ; SPI1
  55.                 DCD     SPI2_IRQHandler            ; SPI2
  56.                 DCD     USART1_IRQHandler          ; USART1
  57.                 DCD     USART2_IRQHandler          ; USART2
  58.                 DCD     USART3_IRQHandler          ; USART3
  59.                 DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
  60.                 DCD     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI Line
  61.                 DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend
  62.                 DCD     TIM8_BRK_IRQHandler        ; TIM8 Break
  63.                 DCD     TIM8_UP_IRQHandler         ; TIM8 Update
  64.                 DCD     TIM8_TRG_COM_IRQHandler    ; TIM8 Trigger and Commutation
  65.                 DCD     TIM8_CC_IRQHandler         ; TIM8 Capture Compare
  66.                 DCD     ADC3_IRQHandler            ; ADC3
  67.                 DCD     FSMC_IRQHandler            ; FSMC
  68.                 DCD     SDIO_IRQHandler            ; SDIO
  69.                 DCD     TIM5_IRQHandler            ; TIM5
  70.                 DCD     SPI3_IRQHandler            ; SPI3
  71.                 DCD     UART4_IRQHandler           ; UART4
  72.                 DCD     UART5_IRQHandler           ; UART5
  73.                 DCD     TIM6_IRQHandler            ; TIM6
  74.                 DCD     TIM7_IRQHandler            ; TIM7
  75.                 DCD     DMA2_Channel1_IRQHandler   ; DMA2 Channel1
  76.                 DCD     DMA2_Channel2_IRQHandler   ; DMA2 Channel2
  77.                 DCD     DMA2_Channel3_IRQHandler   ; DMA2 Channel3
  78.                 DCD     DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
复制代码


上面的Reset_Handler就我们复位后的入口地址,这里不是从0地址开始,而是从0x00000004地址开始,0地址处存放的是堆栈指针的起始地址__initial_sp
DCD是什么意思?DCD是定义一个4字节地址,并初始化。
那程序跳进来之后,就会跳转到Reset_Handler地址处执行了,从下面可以看到Reset_Handler处一是段程序,没错,它其实是一个汇编函数,相当于我们C语言里的一个函数,汇编函数以PROC开头,以ENDP结束

  1. Reset_Handler   PROC
  2.                 EXPORT  Reset_Handler             [WEAK]
  3.                 IMPORT  __main
  4. ;                IMPORT  SystemInit
  5. ;                LDR     R0, =SystemInit
  6. ;                BLX     R0               
  7.                 LDR     R0, =__main
  8.                 BX      R0
  9.                 ENDP
复制代码

在这里就看到__main了,这个是KEIL里面的函数,最终会跳转到我们C语言里的main函数,后面我就在main函数里写点亮LED程序。直接在.s文件用汇编点亮LED也不是不可以,论坛有汇编高手弄过,这里就不详细介绍了。

关于启动代码介绍详细也可以参考我们开发板的配套视频

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-3-5 16:37:16 | 显示全部楼层
liuruoshui 发表于 2014-3-4 18:30
楼主可以抓重点讲,或者是谈一下自己的认识,例如GPIO的基本模式可能大家都知道,但是关于重映射和复用功能 ...

时间有限,只能抓重点,抓基础的讲。有思路了学什么都容易了

出0入0汤圆

 楼主| 发表于 2014-3-5 16:47:46 | 显示全部楼层
jacky_yhy 发表于 2014-3-4 19:00
楼主可以做一个详细的关于stm32的程序调试的视频,介绍点调试技巧什么的

其实KEIL调试我是自己摸索的,只会看下内存,看下寄存器内容。调试视频现在暂时还没有。

出0入0汤圆

 楼主| 发表于 2014-3-5 16:51:49 | 显示全部楼层
四轴飞行器 发表于 2014-3-4 21:23
感觉可以这样写写,比如PA1 = 0怎么去操作,该怎么操作,流程是什么,这样就能懂了  嘿嘿 ...

刚开始的简单例程会弄成这样的,等对寄存器有一定了解后,就可以用ST提供的函数来写程序了,也就是库函数了

出0入0汤圆

 楼主| 发表于 2014-3-5 16:58:42 | 显示全部楼层
小车 发表于 2014-3-4 23:12
话说,我现在只是用库函数弄亮了LED,LZ,我现在应该去学寄存器版本的么------求建议 ...

这个看自己兴趣爱好了,寄存器、库函数、51、AVR、STM32、LPC1788这些都是工具,能实现功能,做出产品才是最终目的。个人认为寄存器编程的可移植性和可读性不太好,未来的编程开发可能会倾向于库函数的方式。

出0入0汤圆

发表于 2014-3-5 17:04:48 | 显示全部楼层
期待继续更新

出0入0汤圆

发表于 2014-3-5 17:40:59 | 显示全部楼层
支持楼主使用库函数,不仅可以快速学习,使用还挺方便。熟悉到一定程度了,喜欢弄得自己再去学习寄存器的就很简单了!

出0入4汤圆

发表于 2014-3-5 17:41:55 | 显示全部楼层
谢谢 正好想学习这个

出0入0汤圆

发表于 2014-3-5 19:48:20 | 显示全部楼层
支持楼主 哈哈

出0入0汤圆

发表于 2014-3-5 20:11:30 | 显示全部楼层
湛泸骏驰 发表于 2014-3-5 11:16
什么价格?有网址没有呢。。。

淘宝有,官方出售的,137裸板

出0入0汤圆

发表于 2014-3-5 20:13:24 | 显示全部楼层
四轴飞行器 发表于 2014-3-4 21:23
感觉可以这样写写,比如PA1 = 0怎么去操作,该怎么操作,流程是什么,这样就能懂了  嘿嘿 ...

我也觉得这样好..........像当初学51一样,先讲点第一个LED的流程啥样的

出0入0汤圆

发表于 2014-3-5 20:34:59 | 显示全部楼层
新手小白,看得有点不大明白。

出0入0汤圆

 楼主| 发表于 2014-3-5 21:48:03 | 显示全部楼层
本帖最后由 xi_liang 于 2014-3-5 23:44 编辑
bosia仔 发表于 2014-3-5 20:11
淘宝有,官方出售的,137裸板


百为的裸板只要48,还是STM32F103ZET6的!哥们你被坑了! 那个是RBT6的。尼妈的再在这里聊开发板买卖不讲了

出0入0汤圆

 楼主| 发表于 2014-3-5 21:51:09 | 显示全部楼层
acuman 发表于 2014-3-5 20:34
新手小白,看得有点不大明白。

有哪些地方不明白的可以提出

出0入0汤圆

发表于 2014-3-5 22:10:33 | 显示全部楼层
xi_liang 发表于 2014-3-5 21:48
百为的裸板只要88,还是STM32F103ZET6的!哥们你被坑了! 那个是RBT6的。尼妈的再在这里聊开发板买卖不讲 ...

好吧,我买什么开发板是我的事,你用不着在这里吼,也是别人问起我才说,你是在推销你的开发板罢了,我可没推销,我只是初学者在这里浏览资料和其他人交流罢了,你要是狗的话就继续吼吧,乱叫

出0入0汤圆

 楼主| 发表于 2014-3-5 22:24:19 | 显示全部楼层
此贴暂停更新,我接受不了那些SALES无孔不入

出0入0汤圆

 楼主| 发表于 2014-3-5 22:24:47 | 显示全部楼层
买了百为开发板的,需要后续教程请与我联系

出0入0汤圆

 楼主| 发表于 2014-3-5 22:35:17 | 显示全部楼层
湛泸骏驰 发表于 2014-3-5 11:16
什么价格?有网址没有呢。。。

那个是STM32F103RBT6的,没有FSMC,SDIO接口。百为的精简版主芯片是STM32F103ZET6,有FSMC,SDIO接口,只要48元,加10元还有SPI FLASH,I2C温度传感器,CAN通信芯片

出0入0汤圆

发表于 2014-3-5 23:37:13 来自手机 | 显示全部楼层
希望楼主能继续更新下去

出0入0汤圆

发表于 2014-3-5 23:49:59 | 显示全部楼层
强帖留名,跟着楼主混了!

出0入0汤圆

发表于 2014-3-5 23:55:11 来自手机 | 显示全部楼层
百为开发板不错,支持

出0入0汤圆

发表于 2014-3-5 23:58:04 | 显示全部楼层
本帖最后由 yu2008 于 2014-3-6 00:03 编辑

支持   “  10、USB协议 ”    以前一直用串口与电脑通讯,同时现在一直想学习STM32的USB,用好了,就可以不用串口与电脑通讯了,相信很多人都想用USB,但是复杂的USB协议,让人望而止步,这也是我迟迟没有着手USB的原因,归根结底还是自己的问题啊,希望百为搞个这方面的资料,包括stm32usb,上位机驱动(只知道目前很多是用一个软件生成的)如何搞。

出0入0汤圆

发表于 2014-3-6 00:21:16 | 显示全部楼层
您好,我用SDIO驱动SD卡,用的fatfs,向SD卡中存储文件,绝大多数是正常的,可是有时候上电之后第一次存储会死机,也查看不了里面的文件,而且SD卡插到电脑上后变成了RAW格式,无法访问sd,请教这是什么原因啊。

出0入0汤圆

发表于 2014-3-6 02:02:39 | 显示全部楼层
xi_liang 发表于 2014-2-26 22:43
Cortex-M3处理器的存储器映射
Cortex-M3处理器是一个标准的微控制器核心,它具有一个明确定义的内存映射。 ...

顶楼主,标签1

出0入0汤圆

发表于 2014-3-6 07:18:12 | 显示全部楼层
楼主跟新下去吧,

出0入0汤圆

发表于 2014-3-6 09:12:46 | 显示全部楼层
希望楼主继续更新,愿意学习的人还是占大多数的。

出0入0汤圆

发表于 2014-3-6 09:44:35 | 显示全部楼层
果断mark,有空来看

出0入0汤圆

发表于 2014-3-6 09:53:52 | 显示全部楼层
xi_liang 发表于 2014-2-26 14:42
你要坚持看,我就坚持写。之前是试过写到中间就没什么人看了

不是没人看,我们一直潜水,支持楼主,多谢楼主。

出0入0汤圆

发表于 2014-3-6 10:06:19 | 显示全部楼层
楼主不要听那些杂音了,希望继续更新下去!

出0入0汤圆

发表于 2014-3-6 10:08:19 | 显示全部楼层
不错不错,学习学习

出0入0汤圆

发表于 2014-3-6 10:57:47 | 显示全部楼层
支持楼主,希望继续更新啊!!!

出0入0汤圆

发表于 2014-3-6 13:05:43 | 显示全部楼层
xi_liang 发表于 2014-3-5 16:47
其实KEIL调试我是自己摸索的,只会看下内存,看下寄存器内容。调试视频现在暂时还没有。 ...

楼主抓紧摸索。 我觉得这才是有技术含量的地方。实际开发中几乎写代码一半,调试一半。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-19 04:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表