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