徐 磊,劉 瑜,許耀華,方紅雨①
(安徽大學(xué) 集成電路學(xué)院,安徽 合肥 230601)
集成電路是現(xiàn)代信息技術(shù)的核心,屬于高端設(shè)計(jì)與制造領(lǐng)域.在高校,集成電路是一個(gè)多學(xué)科交叉、高技術(shù)密集的專業(yè),其基礎(chǔ)與應(yīng)用研究遍及從電子工程到計(jì)算機(jī)科學(xué)的整個(gè)信息技術(shù)領(lǐng)域,單片機(jī)課程的知識(shí)模塊已成為集成電路專業(yè)教育與交叉融合研究的重要基礎(chǔ)[1-2].單片機(jī)的類型很多,其中STM32單片機(jī)憑借其產(chǎn)品線的多樣化、極高的性價(jià)比、簡單易用的庫開發(fā)方式,在大學(xué)生創(chuàng)新創(chuàng)業(yè)項(xiàng)目和科技文化賽中已經(jīng)成為熱門首選[3-5].
匯編指令系統(tǒng)是編程過程中極其重要的內(nèi)容,學(xué)生如果對(duì)匯編指令的理解不夠透徹、準(zhǔn)確,將嚴(yán)重影響對(duì)單片機(jī)工作原理的了解和后期的使用[6-7].指令集作為軟硬件之間的接口規(guī)范,是信息技術(shù)生態(tài)的起始原點(diǎn).匯編指令與芯片設(shè)計(jì)密切相關(guān),已經(jīng)作為集成電路學(xué)院各專業(yè)必不可少的教學(xué)環(huán)節(jié)[8-10].但Proteus仿真案例的設(shè)計(jì)需基于C語言標(biāo)準(zhǔn)庫,在教學(xué)課時(shí)有限的情況下,2種語言的同時(shí)講授為教學(xué)開展帶來極大挑戰(zhàn).另外,傳統(tǒng)單片機(jī)教學(xué)往往以課堂理論教學(xué)為主,實(shí)驗(yàn)教學(xué)為輔,一般先理論后實(shí)踐.如果理論教學(xué)和實(shí)驗(yàn)教學(xué)脫節(jié),無法保證“新工科”建設(shè)對(duì)學(xué)生創(chuàng)新能力的培養(yǎng)要求,不能提升學(xué)生解決復(fù)雜工程問題的能力,也不能充分發(fā)揮學(xué)生自身的學(xué)習(xí)積極性[11].案例式教學(xué)通過課件與虛擬仿真案例的融合,注重真表現(xiàn)力、交互性、共享性3個(gè)特性,化靜為動(dòng)、化抽象為形象,最大限度地調(diào)動(dòng)學(xué)生積極性,激發(fā)學(xué)生學(xué)習(xí)興趣,為課程教學(xué)效果的提升提供可靠保障[12].Proteus平臺(tái)能夠?qū)⒂布到y(tǒng)軟件化,能夠模擬硬件系統(tǒng)的實(shí)現(xiàn)過程,并能夠?qū)崟r(shí)驗(yàn)證程序的正確性[13].另外,基于Proteus和STM32CubeMx的STM32聯(lián)合開發(fā)方式的線上項(xiàng)目式教學(xué)方法可關(guān)聯(lián)當(dāng)前的產(chǎn)學(xué)研項(xiàng)目,并用以創(chuàng)建和講解運(yùn)用單片機(jī)技術(shù)解決復(fù)雜工程問題的新型案例[14].結(jié)合Proteus平臺(tái)和案例式教學(xué)的優(yōu)勢(shì),能夠?yàn)閰R編指令的無縫融合提供可行性,但在目前STM32教學(xué)中缺乏有效的教學(xué)案例.
綜上所述,本文提出一種STM32案例式教學(xué)的匯編指令無縫融合方法.以軟件延時(shí)的精準(zhǔn)設(shè)計(jì)為例,基于Proteus虛擬仿真平臺(tái),詳細(xì)說明所提方法的案例式教學(xué)設(shè)計(jì).通過該案例式教學(xué),使學(xué)生在完成單片機(jī)軟硬件開發(fā)任務(wù)時(shí),不僅知其然,而且知其所以然,理解計(jì)算與算法背后的芯片與指令基礎(chǔ),為大學(xué)生創(chuàng)新創(chuàng)業(yè)項(xiàng)目和科技文化競(jìng)賽中,創(chuàng)新性作品的制作奠定一個(gè)良好的基礎(chǔ).
在單片機(jī)應(yīng)用開發(fā)中,經(jīng)常會(huì)碰到較短的時(shí)間延時(shí)情況.當(dāng)使用定時(shí)器/計(jì)數(shù)器不方便實(shí)現(xiàn)時(shí),利用軟件延時(shí)子程序完成一些延時(shí)的需求是非常有必要的.軟件延時(shí)的精確性往往也直接關(guān)乎應(yīng)用效果的實(shí)現(xiàn).
案例名稱:系統(tǒng)工作指示燈[15].LED燈慢閃(間隔時(shí)間300 ms)表示系統(tǒng)正常運(yùn)行.
該案例電路可在Proteus虛擬仿真平臺(tái)上進(jìn)行設(shè)計(jì),其包含STM32單片機(jī),具體型號(hào)為STM32F103R6;包含示波器,用以觀察延遲量的大??;包含限流電阻和一端接地的LED燈,用以表示系統(tǒng)正常運(yùn)行.
#include“stm32f10x.h”
void delay_ms(unsigned ms);//函數(shù)聲明
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);
/*正常運(yùn)行,LED燈慢閃(間隔時(shí)間300 ms)*/
while(1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);//燈亮
delay_ms(300);
GPIO_ResetBits(GPIOA,GPIO_Pin_2);//燈滅
delay_ms(300);
}}
/**
*@簡介:軟件延時(shí)函數(shù),單位ms
*@參數(shù):延時(shí)毫秒級(jí)
*@返回值:無
**/
void delay_ms(unsigned ms)
{
int32_t i;
while(ms--)
{
i=7500;//外部晶振8Mhz時(shí)的經(jīng)驗(yàn)值
while(i--);
}}
其中,1 ms軟件延時(shí)函數(shù)void delay_ms(unsigned ms)需進(jìn)行精確設(shè)計(jì),其子程序中的局部變量i是重點(diǎn)調(diào)整對(duì)象.在源程序中,只給出“外部晶振8 Mhz時(shí)的經(jīng)驗(yàn)值i=7 500”的注釋說明,但并未給出對(duì)系統(tǒng)時(shí)鐘進(jìn)行配置的相關(guān)程序.此問題在大部分STM32開發(fā)板案例教程中也同樣存在,這給學(xué)生的學(xué)習(xí)帶來很大的困惑和障礙.
示波器的掃描速度為200 ms/div,如圖1可以看出,低電平信號(hào)在水平方向所占的格數(shù)約為8.5 div,則實(shí)際低電平的延時(shí)量為200*8.5=1700 ms=1.7 s.這與預(yù)想設(shè)計(jì)的300 ms延時(shí)相差很大,問題的本質(zhì)在于1 ms軟件延時(shí)函數(shù)不夠精確.
圖1 i=7 500時(shí),示波器顯示的延時(shí)量
當(dāng)STM32單片機(jī)上電啟動(dòng)的時(shí)候會(huì)首先啟動(dòng)文件“startup_stm32f10x_ld.s”,執(zhí)行這里的匯編指令,從而建立起C語言的運(yùn)行環(huán)境.因此需通過對(duì)啟動(dòng)文件的分析,進(jìn)行匯編指令的教學(xué)開展和系統(tǒng)時(shí)鐘的默認(rèn)配置情況的明確.
啟動(dòng)文件“startup_stm32f10x_ld.s”的功能主要為:①初始化堆棧指針SP;②初始化程序計(jì)數(shù)器指針PC;③設(shè)置堆、棧的大小;④初始化中斷向量表;⑤配置外部SRAM作為數(shù)據(jù)存儲(chǔ)器;⑥調(diào)用SystemIni(t)函數(shù)配置系統(tǒng)時(shí)鐘.⑦設(shè)置C庫的分支入口“__main”,用來調(diào)用main函數(shù).其中,STM32單片機(jī)復(fù)位后執(zhí)行的匯編指令段如下所示.
Line1:;Reset handler routine
Line2:Reset_Handler PROC
Line3:EXPORT Reset_Handler[WEAK]
Line4:IMPORT__main
Line5:IMPORT SystemInit//說明SystemInit這個(gè)標(biāo)號(hào)在鏈接的時(shí)候需要到其他文件去尋找
Line6:LDR R0,=SystemInit//把SystemInit的地址加載到寄存器R0
Line7:BLX R0//程序跳轉(zhuǎn)到R0中的地址執(zhí)行程序,即執(zhí)行SystemInit函數(shù)的內(nèi)容
Line8:LDR R0,=__main
Line9:BX R0
Line10:ENDP
上述匯編指令是Cortex-M3內(nèi)核支持的指令,可以在MDK->Help->Uvision Help中搜索到,也可參考《ARM Cortex-M3權(quán)威指南》中指令集章節(jié)進(jìn)行指令格式、尋址方式和指令功能的規(guī)范性講解,從而實(shí)現(xiàn)匯編指令和STM32案例式教學(xué)的無縫融合.結(jié)合啟動(dòng)文件的功能描述,并完成這段指令的分析后,可以明確:STM32單片機(jī)上電后,會(huì)執(zhí)行SystemIni(t)函數(shù),最后執(zhí)行C語言源程序中的main函數(shù).System-Ini(t)是一個(gè)標(biāo)準(zhǔn)的庫函數(shù),在system_stm32f10x.c這個(gè)庫文件中被定義,其主要作用是配置系統(tǒng)時(shí)鐘.因此要明確系統(tǒng)時(shí)鐘的默認(rèn)配置情況,還需對(duì)SystemIni(t)進(jìn)行深入剖析.
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內(nèi)部高速時(shí)鐘(HSI,High-Speed Internal)
//關(guān)閉外部高速時(shí)鐘(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的預(yù)分頻系數(shù)均為1
Line9:#else
Line10:RCC->CFGR &=(uint32_t)0xF0FF0000;
Line11:#endif/*STM32F10X_CL*/
寄存器的具體配置效果可查看STMF103xx參考手冊(cè).經(jīng)過上述代碼的剖析,可以明確案例中的系統(tǒng)時(shí)鐘的默認(rèn)配置為8 MHz內(nèi)部高速時(shí)鐘,并且AHB、AP1、AP2的預(yù)分頻系數(shù)均為1.結(jié)合STMCubeMX圖形界面化的優(yōu)勢(shì),將STM32單片機(jī)系統(tǒng)時(shí)鐘的默認(rèn)配置效果進(jìn)行顯示,如圖2所示.
由圖2可以看出,STM32單片機(jī)系統(tǒng)時(shí)鐘的默認(rèn)配置與啟動(dòng)文件的分析結(jié)論是一致的.在案例中使用的是PA2引腳,其隸屬于APB2外設(shè),所以其工作時(shí)鐘與APB2外設(shè)時(shí)鐘保持一致,具體為8 MHz.
圖2 基于STMCubeMX的系統(tǒng)時(shí)鐘默認(rèn)配置效果
為保障1 ms軟件延時(shí)函數(shù)的精確性,將源程序中2處delay_ms(300)改為delay_ms(1).根據(jù)示波器顯示的延時(shí)量,不斷調(diào)整i的數(shù)值,最終確定1 ms軟件精確延時(shí)的經(jīng)驗(yàn)值為1 320,其對(duì)應(yīng)的示波器顯示的延時(shí)量如圖3所示.
圖3 i=1 320時(shí),示波器顯示的延時(shí)量
示波器的掃描速度為1 ms/div,如圖3可以看出,高、低電平信號(hào)在水平方向所占的格數(shù)為1 div,則實(shí)際的高電平延時(shí)量為1 ms/div*1 div=1 ms.將示波器的掃描速度設(shè)置為更小數(shù)值時(shí),可以得到同樣的結(jié)果.因此,驗(yàn)證1 ms軟件延時(shí)函數(shù)的精確性和上述分析過程的正確性.
結(jié)合案例式教學(xué)的優(yōu)勢(shì),本文提出一種STM32案例式教學(xué)的匯編指令無縫融合方法.首先,以軟件延時(shí)的精確設(shè)計(jì)為例,設(shè)計(jì)Proteus虛擬仿真電路.其次,以問題為導(dǎo)向,通過啟動(dòng)文件和系統(tǒng)啟動(dòng)函數(shù)的聯(lián)合分析,明確系統(tǒng)時(shí)鐘的默認(rèn)配置情況,并進(jìn)行匯編指令的無縫融合.最后,進(jìn)行延時(shí)變量的不斷修正,得到保障1 ms軟件精確延時(shí)的延時(shí)變量經(jīng)驗(yàn)值.通過該方法,能夠引導(dǎo)學(xué)生不僅掌握STM32單片機(jī)的工作原理,促進(jìn)課堂教學(xué)內(nèi)容、教學(xué)過程的全面優(yōu)化,而且能夠有效提升學(xué)生的實(shí)踐及創(chuàng)新能力.