关于STM32的启动流程
展开全部 单片机执行程序的过程,实际上就是执行我们所编制程序的过程。
即逐条指令的过程。
计算机每执行一条指令都可分为三个阶段进行。
即取指令-----分析指令-----执行指令。
取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。
分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。
如指令要求操作数,则寻找操作数地址。
计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。
一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。
但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。
因而一开机即可执行指令。
下面我们将举个实例来说明指令的执行过程:开机时,程序计算器PC变为0000H。
然后单片机在时序电路作用下自动进入执行程序过程。
执行过程实际上就是取出指令(取出存储器中事先存放的指令阶段)和执行指令(分析和执行指令)的循环过程。
例如执行指令:MOV A,#0E0H,其机器码为“74H E0H”,该指令的功能是把操作数E0H送入累加器,0000H单元中已存放74H,0001H单元中已存放E0H。
当单片机开始运行时,首先是进入取指阶段,其次序是:1 程序计数器的内容(这时是0000H)送到地址寄存器;2 程序计数器的内容自动加1(变为0001H);3 地址寄存器的内容(0000H)通过内部地址总线送到存储器,以存储器中地址译码电跟,使地址为0000H的单元被选中;4 CPU使读控制线有效;5 在读命令控制下被选中存储器单元的内容(此时应为74H)送到内部数据总线上,因为是取指阶段,所以该内容通过数据总线被送到指令寄存器。
至此,取指阶段完成,进入译码分析和执行指令阶段。
由于本次进入指令寄存器中的内容是74H(操作码),以译码器译码后单片机就会知道该指令是要将一个数送到A累加器,而该数是在这个代码的下一个存储单元。
所以,执行该指令还必须把数据(E0H)从存储器中取出送到中PC=0002H,PC在CPU每次向存储器取指或取数时自动加1,单片机又进入下一取指阶段。
这一过程一直重复下去,直至收到暂停指令或循环等待指令暂停。
CPU就是这样一条一条地执行指令,完成所有规定的功能。
...
哪位朋友帮忙给个基于STM32的呼吸灯程序,能有原理图和流程图,谢...
展开全部 有以下几个原因:1:图像的尺寸与程序中显示的范围不一致。
例如图像原本是20*10的,而程序图像显示范围中却错误地设为30*10,显示出来的东西就会乱。
2:取模时候的取模顺序要与显示时候的显示顺序相一致。
例如取模时候是水平、自上而下取的,显示时候也要设为水平、自上而下显示出每个像素。
这个至关重要,一般都是这个设错了所以会乱码。
3:液晶屏一般以16位二进制数表示一个像数的颜色,例如蓝色是0xFF00。
而取模软件取模后,数据一般存放在一个char型的数组里,这样一个像素的颜色被拆成两半放在数组的两个元素中,如const char xxx[]={0xFF,0x00},这时候用户要自己把它合成一个16位的数据,这时候用户就要注意高低位数据的顺序了,不要合成0x00FF,这样图像出来后就会乱。
...
如何在IAR EWARM下建立工程和配置STM32开发环境
展开全部 一、生成一个新项目要使用IAR进行STM32嵌入式系统开发,必须从建立一个项目(project)开始,下面以在E:\下建立一个名为Example的项目为例介绍。
1. 创建项目目录、复制公共文件(1)在E盘下创建名为的Example文件夹,即项目根目录为E:\Example。
(2)在项目根目录下建立一个EWARMv5文件夹用于存放项目文件、工作空间文件和项目配置相关文件。
(3)解压标准外设驱动文件库(stm32f10x_stdperiph_lib_V3.1.2.zip),将其中的“Libraries”文件夹复制到Example目录下。
(4)复制标准外设驱动库目录Project\Template下的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h三个文件到Example文件夹下。
main.c可以不用复制,自己写。
复制标准外设驱动库目录Project\Template\EWARMv5下的stm32f10x_flash.icf、stm32f10x_flash_extsram.icf、stm32f10x_nor.icf和stm32f10x_ram.icf到Example\EWARMv5文件夹下。
复制好的目录。
2. 创建新的工作空间嵌入式系统开发大都是面向项目(Project)的,需要建立Project来管理项目开发。
IAR EWRAM又是基于工作空间(Workspace)的集成开发环境,Project必须放在工作空间里面,所以我们首先应该建立工作空间。
一个工作空间里面可以放多个项目。
开始?程序?IAR Systems?IAR Embedded Workbench,进入IDE环境。
File ?New?Workspace。
这样工作空间就建好了,但是这个工作空间里面还没有项目,所以还不能保存,下面将在这个工作空间里面建立新项目。
3. 创建新项目在上面第2步已经建立好的工作空间里创建新项目。
Project?Create New Project。
弹出“Create New Project”对话框,“Tool Chain”选择ARM,“Project Template”选择Empty project模板,这样所有的文件都由用户自己来写。
点击OK,弹出“另存为…”对话框,选择我们刚刚建好的Example目录下的EWARMv5文件夹下,然后输入工程名 ,这里我输入Template,然后点击保存。
这样一个名为Template的IAR EWARM项目就建好了,下面我们添加一些文件,然后再修改一些参数,使得这个项目真正地能够使用。
4. 添加文件到项目(1)文件分组按说现在就可以往项目里面添加文件了,但是由于ARM系统开发涉及文件较多,类型繁杂,加上我们使用ST公司的标准固件库驱动文件,这样就要添加很多文件到项目里,随着项目的复杂程度加大,文件的数量是很多的。
为了便于管理,将这些文件在项目里分组保存,IAR EWARM支持文件分组。
在IDE左侧的Workspace里面,在刚刚建立的Template项目上点右键,选择Add? Add Group…。
在弹出的对话框里面输入组名(Group Name),点OK即可。
将添加如下几个组。
项目名字后面有个星号(*),这是说明项目或工作空间已经修改,但是还没有保存,现在点File?Save All,这时弹出对话框让保存工作空间。
还记得工作空间吗?第2步新建的工作空间,但是当时没有保存,因为当时工作空间里面没有项目,不能保存。
输入工作空间名Template,然后点保存,这时候项目后面的星号*消失。
注:工作空间扩展名.eww,项目扩展名
stm32板的usart2设置与usart1有什么区别啊
展开全部 过期的问题,还是来回答一下吧。
首先我的理解,你的问题应该是问usart2的编程设置。
代码就不贴了,主要是说下思路和流程: (1) RCC配置; (2) GPIO配置; (3)USART配置; (4)NVIC配置; (5)发送/接收数据。
在RCC配置中,除了常规的时钟设置以外,要记得打开USART相对应的IO口时钟,USART时钟,还有管脚功能复用时钟。
在GPIO配置中,将发送端的管脚配置为复用推挽输出,将接收端的管脚配置为浮空输入。
在USART的配置中,通过USART_InitTypeDef结构体对USART进行初始化操作,按照自己所需的功能配置好就可以了。
在NVIC的配置中,主要是USART2_IRQChannel的配置(类似USART1_IRQChannel的配置)。
全部配置好之后就可以开始发送/接收数据了。
发送数据用USART_SendData()函数,接收数据用USART_ReceiveData()函数。
注意在对数据进行发送和接收的时候,要检查USART的状态,只有等到数据发送或接收完毕之后才能进行下一帧数据的发送或接收。
采用USART_GetFlagStatus()函数。
同时还要注意的是,在发送数据的最开始,需要清除一下USART的标志位,否则,第1位数据会丢失。
因为在硬件复位之后,USART的状态位TC是置位的。
当包含有数据的一帧发送完成之后,由硬件将该位置位。
只要当USART的状态位TC是置位的时候,就可以进行数据的发送。
然后TC位的置零则是通过软件序列来清除的,具体的步骤是“先读USART_SR,然后写入USART_DR”,只有这样才能够清除标志位TC,但是在发送第一帧数据的时候,并没有进行读USART_SR的操作,而是直接进行写操作,因此TC标志位并没有清空,那么,当发送第一帧数据,然后用USART_GetFlagStatus()检测状态时返回的是已经发送完毕(因为TC位是置1的),所以程序会马上发送下一帧数据,那么这样,第一帧数据就被第二帧数据给覆盖了,所以看不到第一帧数据的发送。
好了,stm32总体上来说,使用很广,基本上问题都被发现和解决,例程也是很多,找到可用的例程,然后做改动,基本没有大问题。
stm32的引脚PB6/PB7默认是什么,我想让他作为普通的i/o口,怎样配...
我不得不给你看看GPIO的结构图,如下:看到没有,如果你把IO配置为输入的话,输出回路的那个开关就断开了,输出寄存器的值不会影响到输入状态的。
注意看,输入回路有上拉开关和下拉开关,而这个上下拉开关就是由输出寄存器来控制的。
你说你配置的高低电平能生效,如果你的硬件电路没问题,而你又是配置的输入的话,只有一种情况,那就是你把IO配置为上下拉输入了。
比如像下面的代码:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(GPIOB, &GPIO_InitStructure); 或者:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOB, &GPIO_InitStructure); 在GPIO_Init这个函数中,会判断你配置的GPIO_Mode,如果是GPIO_Mode_IPU或GPIO_Mode_IPD的话,它会有下面的代码来设置输出寄存器为高或为低:/* Reset the corresponding ODR bit */if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD){GPIOx->BRR = (((uint32_t)0x01) }else{/* Set the corresponding ODR bit */if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU){GPIOx->BSRR = (((uint32_t)0x01) }} 所以,你配置为浮空输入就好了,像下面这样:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);
转载请注明出处51数据库 » stm32软件流程图
烟花易冷3971624