老哥学习网 - www.lg9.cn 2024年05月02日 10:38 星期四
当前位置 首页 >公文范文 > 公文大全 >

STM32案例式教学的汇编指令无缝融合方法

发布时间:2023-04-01 21:45:04 浏览数:

徐 磊,刘 瑜,许耀华,方红雨①

(安徽大学 集成电路学院,安徽 合肥 230601)

集成电路是现代信息技术的核心,属于高端设计与制造领域.在高校,集成电路是一个多学科交叉、高技术密集的专业,其基础与应用研究遍及从电子工程到计算机科学的整个信息技术领域,单片机课程的知识模块已成为集成电路专业教育与交叉融合研究的重要基础[1-2].单片机的类型很多,其中STM32单片机凭借其产品线的多样化、极高的性价比、简单易用的库开发方式,在大学生创新创业项目和科技文化赛中已经成为热门首选[3-5].

汇编指令系统是编程过程中极其重要的内容,学生如果对汇编指令的理解不够透彻、准确,将严重影响对单片机工作原理的了解和后期的使用[6-7].指令集作为软硬件之间的接口规范,是信息技术生态的起始原点.汇编指令与芯片设计密切相关,已经作为集成电路学院各专业必不可少的教学环节[8-10].但Proteus仿真案例的设计需基于C语言标准库,在教学课时有限的情况下,2种语言的同时讲授为教学开展带来极大挑战.另外,传统单片机教学往往以课堂理论教学为主,实验教学为辅,一般先理论后实践.如果理论教学和实验教学脱节,无法保证“新工科”建设对学生创新能力的培养要求,不能提升学生解决复杂工程问题的能力,也不能充分发挥学生自身的学习积极性[11].案例式教学通过课件与虚拟仿真案例的融合,注重真表现力、交互性、共享性3个特性,化静为动、化抽象为形象,最大限度地调动学生积极性,激发学生学习兴趣,为课程教学效果的提升提供可靠保障[12].Proteus平台能够将硬件系统软件化,能够模拟硬件系统的实现过程,并能够实时验证程序的正确性[13].另外,基于Proteus和STM32CubeMx的STM32联合开发方式的线上项目式教学方法可关联当前的产学研项目,并用以创建和讲解运用单片机技术解决复杂工程问题的新型案例[14].结合Proteus平台和案例式教学的优势,能够为汇编指令的无缝融合提供可行性,但在目前STM32教学中缺乏有效的教学案例.

综上所述,本文提出一种STM32案例式教学的汇编指令无缝融合方法.以软件延时的精准设计为例,基于Proteus虚拟仿真平台,详细说明所提方法的案例式教学设计.通过该案例式教学,使学生在完成单片机软硬件开发任务时,不仅知其然,而且知其所以然,理解计算与算法背后的芯片与指令基础,为大学生创新创业项目和科技文化竞赛中,创新性作品的制作奠定一个良好的基础.

在单片机应用开发中,经常会碰到较短的时间延时情况.当使用定时器/计数器不方便实现时,利用软件延时子程序完成一些延时的需求是非常有必要的.软件延时的精确性往往也直接关乎应用效果的实现.

1.1 案例简介

案例名称:系统工作指示灯[15].LED灯慢闪(间隔时间300 ms)表示系统正常运行.

该案例电路可在Proteus虚拟仿真平台上进行设计,其包含STM32单片机,具体型号为STM32F103R6;
包含示波器,用以观察延迟量的大小;
包含限流电阻和一端接地的LED灯,用以表示系统正常运行.

1.2 源程序

#include“stm32f10x.h”

void delay_ms(unsigned ms);
//函数声明

int main(void)

/*LED(PA2引脚)初始化*/

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;

GPIO_InitStructure.GPIO_Speed=

GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Ini(tGPIOA,&GPIO_InitStructure);

GPIO_ResetBits(GPIOA,GPIO_Pin_2);

/*正常运行,LED灯慢闪(间隔时间300 ms)*/

while(1)

GPIO_SetBits(GPIOA,GPIO_Pin_2);
//灯亮

delay_ms(300);

GPIO_ResetBits(GPIOA,GPIO_Pin_2);
//灯灭

delay_ms(300);

}}

/**

*@简介:软件延时函数,单位ms

*@参数:延时毫秒级

*@返回值:无

**/

void delay_ms(unsigned ms)

int32_t i;

while(ms--)

i=7500;
//外部晶振8Mhz时的经验值

while(i--);

}}

其中,1 ms软件延时函数void delay_ms(unsigned ms)需进行精确设计,其子程序中的局部变量i是重点调整对象.在源程序中,只给出“外部晶振8 Mhz时的经验值i=7 500”的注释说明,但并未给出对系统时钟进行配置的相关程序.此问题在大部分STM32开发板案例教程中也同样存在,这给学生的学习带来很大的困惑和障碍.

示波器的扫描速度为200 ms/div,如图1可以看出,低电平信号在水平方向所占的格数约为8.5 div,则实际低电平的延时量为200*8.5=1700 ms=1.7 s.这与预想设计的300 ms延时相差很大,问题的本质在于1 ms软件延时函数不够精确.

图1 i=7 500时,示波器显示的延时量

当STM32单片机上电启动的时候会首先启动文件“startup_stm32f10x_ld.s”,执行这里的汇编指令,从而建立起C语言的运行环境.因此需通过对启动文件的分析,进行汇编指令的教学开展和系统时钟的默认配置情况的明确.

2.1 启动文件

启动文件“startup_stm32f10x_ld.s”的功能主要为:①初始化堆栈指针SP;
②初始化程序计数器指针PC;
③设置堆、栈的大小;
④初始化中断向量表;
⑤配置外部SRAM作为数据存储器;
⑥调用SystemIni(t)函数配置系统时钟.⑦设置C库的分支入口“__main”,用来调用main函数.其中,STM32单片机复位后执行的汇编指令段如下所示.

Line1:;
Reset handler routine

Line2:Reset_Handler PROC

Line3:EXPORT Reset_Handler[WEAK]

Line4:IMPORT__main

Line5:IMPORT SystemInit//说明SystemInit这个标号在链接的时候需要到其他文件去寻找

Line6:LDR R0,=SystemInit//把SystemInit的地址加载到寄存器R0

Line7:BLX R0//程序跳转到R0中的地址执行程序,即执行SystemInit函数的内容

Line8:LDR R0,=__main

Line9:BX R0

Line10:ENDP

上述汇编指令是Cortex-M3内核支持的指令,可以在MDK->Help->Uvision Help中搜索到,也可参考《ARM Cortex-M3权威指南》中指令集章节进行指令格式、寻址方式和指令功能的规范性讲解,从而实现汇编指令和STM32案例式教学的无缝融合.结合启动文件的功能描述,并完成这段指令的分析后,可以明确:STM32单片机上电后,会执行SystemIni(t)函数,最后执行C语言源程序中的main函数.System-Ini(t)是一个标准的库函数,在system_stm32f10x.c这个库文件中被定义,其主要作用是配置系统时钟.因此要明确系统时钟的默认配置情况,还需对SystemIni(t)进行深入剖析.

2.2 SystemInit()函数

system_stm32f10x.c中SystemIni(t)的部分代码如下

Line1:void SystemInit(void)

Line2:{

Line3:/*Reset the RCC clock configuration to the default reset state(for debug purpose)*/

Line4:/*Set HSION bit*/

Line5:RCC->CR|=(uint32_t)0x00000001;
//开启8MHz内部高速时钟(HSI,High-Speed Internal)

//关闭外部高速时钟(HSE,High-Speed Enternal)

Line6:/*Reset SW,HPRE,PPRE1,PPRE2,ADCPRE and MCO bits*/

Line7:#ifndef STM32F10X_CL

Line8:RCC->CFGR &=(uint32_t)0xF8FF0000;
//选择HSI作为SYSCLK;

//AHB、AP1、AP2的预分频系数均为1

Line9:#else

Line10:RCC->CFGR &=(uint32_t)0xF0FF0000;

Line11:#endif/*STM32F10X_CL*/

寄存器的具体配置效果可查看STMF103xx参考手册.经过上述代码的剖析,可以明确案例中的系统时钟的默认配置为8 MHz内部高速时钟,并且AHB、AP1、AP2的预分频系数均为1.结合STMCubeMX图形界面化的优势,将STM32单片机系统时钟的默认配置效果进行显示,如图2所示.

由图2可以看出,STM32单片机系统时钟的默认配置与启动文件的分析结论是一致的.在案例中使用的是PA2引脚,其隶属于APB2外设,所以其工作时钟与APB2外设时钟保持一致,具体为8 MHz.

图2 基于STMCubeMX的系统时钟默认配置效果

为保障1 ms软件延时函数的精确性,将源程序中2处delay_ms(300)改为delay_ms(1).根据示波器显示的延时量,不断调整i的数值,最终确定1 ms软件精确延时的经验值为1 320,其对应的示波器显示的延时量如图3所示.

图3 i=1 320时,示波器显示的延时量

示波器的扫描速度为1 ms/div,如图3可以看出,高、低电平信号在水平方向所占的格数为1 div,则实际的高电平延时量为1 ms/div*1 div=1 ms.将示波器的扫描速度设置为更小数值时,可以得到同样的结果.因此,验证1 ms软件延时函数的精确性和上述分析过程的正确性.

结合案例式教学的优势,本文提出一种STM32案例式教学的汇编指令无缝融合方法.首先,以软件延时的精确设计为例,设计Proteus虚拟仿真电路.其次,以问题为导向,通过启动文件和系统启动函数的联合分析,明确系统时钟的默认配置情况,并进行汇编指令的无缝融合.最后,进行延时变量的不断修正,得到保障1 ms软件精确延时的延时变量经验值.通过该方法,能够引导学生不仅掌握STM32单片机的工作原理,促进课堂教学内容、教学过程的全面优化,而且能够有效提升学生的实践及创新能力.

猜你喜欢 示波器延时时钟 别样的“时钟”数学小灵通·3-4年级(2021年9期)2021-10-12古代的时钟小学生学习指导(低年级)(2020年10期)2020-11-09日光灯断电关闭及自动延时开关设计电子制作(2019年14期)2019-08-20一款教学示波器的Y通道设计与实现电子制作(2017年13期)2017-12-15可携带式虚拟双踪示波器电子制作(2017年20期)2017-04-26有趣的时钟数学大王·中高年级(2017年2期)2017-02-08基于CD4060 的室内换气系统延时关机电路设计电子制作(2017年19期)2017-02-02时钟会开“花”学苑创造·A版(2016年4期)2016-04-16宋湘延时答妙对对联(2015年22期)2015-06-11汽车示波器——为绿色维修保驾护航汽车维修与保养(2015年1期)2015-04-17

推荐访问:无缝 指令 汇编

相关文章:

Top