完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、准备工作
[tr]参数值[/tr]
二、STM32F103zet6 简介 STM32F103ZET6 拥有丰富的外设资源(USB,IIC,USART,TIMER,SPI等),大容量的RAM和ROM,以及上百个通用IO口,可满足普通嵌入式设备的大部分需求:
三、汇编 在 STM32 开发中,虽然极少使用汇编,但在操作系统中,由于需要控制一些C语言无法控制的内核寄存器,所以有一小部分功能需要汇编来实现。汇编语句是一个指令,通常带有1或者2个操作数: MOV R0, R1 ; 把寄存器R1中的数据移至R0 1 其中,MOV为指令,它表示数据的转移,以上只是众多指令的其中一个,在MCU中,需要多个指令,这样才可以实现各种功能。我们把这些指令称为指令集,STM32F1xx 系列使用的Cortex-M3内核,支持ARM和Thumb指令集。 程序员在计算机中使用C语言开发程序,通过编译器将C语言编译成汇编指令,汇编指令在进一步编译成机器码, MCU 就是一个指令一个指令不断的读取,并执行的,因为指令会按一定属性存储在ROM中。 关于编译流程以及MCU的工作方式,网上已经有大量微机原理的文章做介绍,不再赘述。 四、Cortex-M3 内核 1. 函数调用原理简析 操作系统最基础的任务调度功能,其原理其实就是使 MCU 不断的处理(准确是 MCU 的内核)不同的函数(任务)。 在函数的调用中,编译器会自动的保存父函数相关的数据,保证子函数返回以后,父函数可以正常的运行: //程序清单2.1 ...... void main(void) { foo(para1,para2); } int foo(int para1,int para2) { foo_sub(20); return (para1+para2); } int foo_sub(int para1) { return (para1) } 在程序清单2.1中,foo() 函数调用了 foo_sub(),由于在M3内核中,根据 AAPCS 标准,会使用 R0-R3 这个4个寄存器来保存函数的参数,所以在 foo() 调用 foo_sub() 时,需要保存当前的R0,R1的值,否则在子函数返回时,foo() 的参数将会被改变。 事实上,以上操作是编译器自动为C程序实现的,即是说,在函数的编译过程中,编译器会通过汇编指令来实现这些操作,所以C程序员无需关心参数的问题。中断机制的原理也是类似的,一旦 MCU 发生中断,第一时间应该是“保存现场”,即保存当前状态的值,然后再跳转执行中断函数,同样这些是编译器自动完成,无关C开发者。 2. Cortex-M3 寄存器组 M3 内核有17个寄存器在任务调度中是关键的,它们需要在任务发生调度的时候被保存,在 AAPCS 标准中,对这部分的ARM寄存器的定义如下: [tr]寄存器使用规则说明[/tr]
五、栈的概念 上文可知,内核有一部分寄存器可使用,其中有一些是特殊寄存器,它们有特定的意义,比如R15寄存器,M3内核的R15永远是存放一个指向当前程序运行的地址,若通过汇编修改这一寄存器,程序执行流程就变改变。其中也有通用的寄存器,它们只是提供一个存储功能,但是其功能是没有特定含义的,比如 R0 - R12,只是在不同的标准中,他们会有自己的含义。比如上文提及的 AAPCS 标准,它们别用来存放参数,或者是变量。 我们可以发现,内核虽然有一部分寄存器用来存放参数,一部分用来存放变量,但是如果一个函数变量个数为五个,当该函数被调用时,编译器将参数的值通过指令存放在R0-R4以后,第五个参数则无处可放,那是否意味着,在该标准中,函数的形参不可以超过五个?同理,变量寄存器的个数也十分有限,那是否意味着函数的内部临时变量也不可以超过七个呢?显然不是如此,对于这个问题,只需要在RAM开辟一些内存,来存放这些值即可。当使用到这些值的时候,从内存中读取,并进行计算等操作即可。那么这段有着特定的RAM,被称为 栈。栈一般存放函数的参数与返回值、局部变量等。 六、新建一个模板工程 1. 新建工程 有了前文的铺垫,我们可以来创建一个工程,并尝试在STM32在两个任务直接切换运行。本文使用 STM32CubeMx 创建一个 STM32F103ZET6 的工程,并重定义打印函数为ITM的0通道,与通常我打印到串口1中不同,这种操作可以直接使用IDE的子窗口来查看打印信息,并节省了一个串口外设。对于工程以及调试口,在学习阶段使用习惯的即可。关于 STM32CubeMx 创建工程,可以参考:STM32CubeMx 初始化和读/写 IO口操作 2. 验证 可以使用控制要给IO口高低电平等来测试模板工程是否正常,本文通过添在 main.c 文件中添加打印程序来验证: 当Debug [printf] Viewer 按程序正确的输出信息以后,工程的验证通过,既可以开始编写代码。 |
||
|
||
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1537 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1490 浏览 1 评论
910 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
654 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1538 浏览 2 评论
1843浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
593浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
496浏览 3评论
494浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
475浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-5 05:25 , Processed in 0.597667 second(s), Total 47, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号