版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
*注:未指明返回值的函數(shù)為無返回值,資源來自周立功單片機(jī)網(wǎng)站
一:GPIO函數(shù)
1:voidGPIODirModeSet(unsignedlongulPort,unsignedcharucPins,
unsignedlongulPinlO)
設(shè)置所選GPIO端口指定管腳的方向和模式
如GPIODirModeSe(GPIO_PORTA_BASE,GPIO_PIN_2,GPIO_DIR_MODE_IN)函
數(shù)設(shè)置PA2為輸入,但第三個(gè)參數(shù)為KGPIO_DIR_MODE_HW//硬件控制”時(shí)指此
管腳啟用第二功能;
2:unsignedlongGPIODirModeGet(unsignedlongulPort,unsignedchar
ucPin)
獲取所選GPIO端口指定管腳的方向和模式
如unsignedlongSetValue=GPIODirModeGet(GPIO_PORTA_BASE,GPIO_PIN_2);
返回PA2腳的方向和模式,返回的值為上一個(gè)函數(shù)第三個(gè)參數(shù)的取值,分別為
GPIO-DIR_MODE_IN//輸入方向
GPI0-DIR-M0DE_0UT//輸出方向
GPI0_DIR_M0DE_HW//硬件控制
3:voidGPIOPadConfigSet(unsignedlongulPort,
unsignedcharucPins,
unsignedlongulStrength,
unsignedlongulPadType)
設(shè)置所選GPIO端口指定管腳的驅(qū)動(dòng)強(qiáng)度和類型
如GPIOPadConfigSet(GPIO_PORTA_BASE,GPIO-PIN.2,
GPIO-STRENGTH_4MA,GPIO-PIN_TYPE_STD)設(shè)置PA2腳的驅(qū)動(dòng)強(qiáng)度為4MA的推
挽輸出;
ulStrength:指定輸出驅(qū)動(dòng)強(qiáng)度,應(yīng)當(dāng)取下列值之一:
GPI0-STRENGTH_2MA//2mA驅(qū)動(dòng)強(qiáng)度
GPI0.STRENGTH_4MA//4mA驅(qū)動(dòng)強(qiáng)度
GP10_STRENGTH_8MA//8mA驅(qū)動(dòng)強(qiáng)度
GPI0_STRENGTH_8MA_SC//帶轉(zhuǎn)換速率(SlewRate)控制的8mA驅(qū)動(dòng)
ulPadType:指定管腳類型。應(yīng)當(dāng)取下列值之一:
GPTO-PIN_TYPE_STD//推挽
GPIO-PIN-TYPE-STD-WPU//帶弱上拉的推挽
GPIO_PIN_TYPE_STD_WPD//帶弱下拉的推挽
GPIO_PIN_TYPE_OD//開漏
GPIO-PIN-TYPE-OD-WPU//帶弱上拉的開漏
GPIO_PIN-TYPE-OD_WPD//帶弱下拉的開漏
GP1O_PIN_TYPE_ANALOG//模擬比較器
4:voidGPIOPadConfigGet(unsignedlongulPort,
unsignedcharucPin,
unsignedlong*pulStrength,
unsignedlong*pulPadType)
獲取所選GPIO端口指定管腳的配置信息
如GPIOPadConfigGet(GPIO-PORTA-BASE,GPIO-PIN_2,pulStrength,
pulPadType);輸出驅(qū)動(dòng)強(qiáng)度信息保存到pulStrength指向的地址中,輸出驅(qū)動(dòng)
類型信息保存到pulPadType指向的地址中,返回的值為上一個(gè)函數(shù)設(shè)置的內(nèi)容。
5:voidGPIOPinTypeGPIOInput(unsignedlongulPort,unsignedchar
ucPins)
設(shè)置所選GPIO端口指定的管腳為高阻輸入模式
如GPIOPinTypeGPIOInput(GPIO-PORTA.BASE,GPIO-PIN.2);設(shè)置PA2腳為
高阻輸入模式
6:voidGPIOPinTypeGPIOOutput(unsignedlongulPort,unsignedchar
ucPins)
設(shè)置所選GPIO端口指定的管腳為推挽輸出模式
如GPIOPinTypeGPIOOutput(GP1O_PORTA_BASE,GP1O_PIN_2)設(shè)置PA2腳為
推挽輸出模式
7:voidGPIOPinTypeGPIOOutputOD(unsignedlongulPort,unsignedchar
ucPins)
設(shè)置所選GPIO端口指定的管腳為開漏輸出模式
如GPIOPinTypeGPIOOutputOD(GPIO_PORTA_BASE,GPIO_PIN_2)設(shè)置PA2為
開漏輸出模式
但由于函數(shù)5,6,7函數(shù)名太長一般做如下簡化:
#defineGPIOPinTypelnGPIOPinTypeGPIOInput
#defineGPIOPinTypeOutGPIOPinTypeGPIOOutput
#defineGPIOPinTypeODGPIOPinTypeGPIOOutputOD
8:voidGPIOPinTypeADC(unsignedlongulPort,unsignedcharucPins)
設(shè)置所選GPIO端口指定的管腳為ADC功能
這個(gè)函數(shù)只對(duì)有adc功能復(fù)用的管腳有用如LM3s811的1,2,3,4腳。。
9:voidGPIOPinTypeCAN(unsignedlongulPort,unsignedcharucPins)
設(shè)置所選GPIO端口指定的管腳為CAN功能
10:voidGPIOPinTypeComparator(unsignedlongulPort,unsignedchar
ucPins)
設(shè)置所選GPIO端口指定的管腳為CAN功能
11:voidGPIOPinTypeComparator(unsignedlongulPort,unsignedchar
ucPins)
設(shè)置所選GPIO端口指定的管腳為模擬比較器功能
12:voidGPIOPinTypeI2C(unsignedlongulPort,unsignedcharucPins)
設(shè)置所選GPIO端口指定的管腳為12c功能
13:voidGPIOPinTypePWM(unsignedlongulPort,unsignedcharucPins)
設(shè)置所選GPIO端口指定的管腳為PWM功能
14:voidGPIOPinTypeQEI(unsignedlongulPort,unsignedcharucPins)
設(shè)置所選GPIO端口指定的管腳為QEI功能
15:voidGPIOPinTypeSSI(unsignedlongulPort,unsignedcharucPins)
設(shè)置所選GPIO端口指定的管腳為SSI功能
16:voidGPIOPinTypeTimer(unsignedlongulPort,unsignedcharucPins)
設(shè)置所選GPIO端口指定的管腳為Timer的CCP功能
17:voidGPIOPinTypeUART(unsignedlongulPort,unsignedcharucPins)
設(shè)置所選GPIO端口指定的管腳為UART功能
18:voidGPIOPinTypeUSBDigital(unsignedlongulPort,unsignedchar
ucPins)
設(shè)置所選GPIO端口指定的管腳為USB數(shù)字功能
對(duì)GPIO管腳的讀寫操作是通過函數(shù)GPIOPinWrite()和GPIOPinRead()
實(shí)現(xiàn)的,這是兩個(gè)非常重要而且很常用的庫函數(shù)。
19:voidGPIOPinWrite(unsignedlongulPort,unsignedcharucPins,
unsignedcharucVa1);
向所選GPIO端口的指定管腳寫入一個(gè)值,以更新管腳狀態(tài),ucVal:寫入
指定管腳的值
注:ucPins指定的管腳對(duì)應(yīng)的ucVal當(dāng)中的位如果是1,則置位相應(yīng)的管
腳,如果是0,則清零相應(yīng)的管腳;ucPins未指定的管腳不受影響。
如GPIOPinWrite(GPIO-PORTA_BASE,GPIO-PIN.3,0x00);//清除PA3
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_5,OxFF);//置位PB5
GPIOPinWrite(GPIO_PORTD_BASE,GPIO-PIN-2|GPIO-PIN_6,OxFF);//同
時(shí)置位PD2、PD6
GPTOPinWrite(GPIO-PORTA_BASE,OxFF,ucData);//變量ucData輸出到
PA0-PA7
20:longGPIOPinRead(unsignedlongulPort,unsignedcharucPins)
讀取所選GPIO端口指定管腳的值,返回1個(gè)位組合的字節(jié)。該字節(jié)提供了
由ucPins指定管腳的狀態(tài),對(duì)應(yīng)的位值表示GPIO管腳的高低狀態(tài)。ucPins未
指定的管腳位值是0。返回值已強(qiáng)制轉(zhuǎn)換為long型,因此位31:8應(yīng)該忽略。這
個(gè)函數(shù)應(yīng)該在相應(yīng)管腳已經(jīng)設(shè)置為輸出狀態(tài)的情況下,由于GPIO得管腳結(jié)構(gòu)我
們知道在輸出模式下,不管是開漏還是推挽用此函數(shù)讀回來的值都是管腳的輸出
鎖存值,
如//讀取PA4,返回值保存在ucData里,可能的值是0x00或0x10
ucData=GPIOPinRead(GPIO_PORTA_BASE,GPI0_PIN_4);
//同時(shí)讀取PB1、PB2和PB6,返回PBLPB2和PB6的位組合保存在ucData
里
ucData=GPIOPinRead(GPIO-PORTB.BASE,GPIO-PIN.l|GPIO-PTN.2I
GPIO-PIN-6);
//讀取整個(gè)PF端口
ucData=GPIOPinRead(GPIO-PORTF.BASE,OxFF);
在Stellaris系列ARM里,每個(gè)GPIO管腳都可以作為外部中斷輸入。中
斷的觸發(fā)類型分為邊沿觸發(fā)和電平觸發(fā)兩大類,共5種,用起來非常靈活。配
置GPIO管腳的中斷觸發(fā)方式可以通過調(diào)用函數(shù)GPIOIntTypeSet()來實(shí)現(xiàn),函
數(shù)GPIOlntTypeGet()用來獲取配置情況。函數(shù)GPIOPinlntEnable()和
GPIOPinIntDisable()用來使能和禁止GPIO管腳中斷。函數(shù)
GPIOPinIntStatus()用來獲取GPIO管腳的中斷狀態(tài).在同一個(gè)GPIO端口上,
8個(gè)GPIO管腳的中斷向量都是共用的。如果同時(shí)配置了同一端口上的多個(gè)管腳
中斷,則可以先利用函數(shù)GPIOPinIntStatus()讀取中斷狀態(tài),再進(jìn)一步確認(rèn)
具體是哪個(gè)管腳產(chǎn)生的中斷請(qǐng)求。函數(shù)GPIOPinIntClear()用來及時(shí)清除GPIO
管腳的中斷狀態(tài)。函GPIOPortIntRegister()用來注冊(cè)一個(gè)GPIO端口中斷服務(wù)
函數(shù),而注銷的方法是調(diào)用函數(shù)GPlOPortlntUnregister()。
2012CSDN網(wǎng)站六大類職位火熱招聘中!點(diǎn)擊了解英特爾云計(jì)算2012年1月當(dāng)
選微軟MVP的CSDN會(huì)員名單揭曉!
Im3s811學(xué)習(xí)筆記(四)[gpio]
分類:cortexm32011-08-0315:24295人閱讀評(píng)論(0)收藏舉報(bào)
今天主要是熟悉下gpio的一些應(yīng)用。最簡單的就是LED燈的控制。
下面的例子就拿L5來說明吧。
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//enablegpiob
GPIOPinTypeGPIOOutput(GPIO-PORTB-BASE,GPIO-PIN-O);//setPBOoutput
還有一種模式設(shè)置的方法GPIODirModeSet(GPIO_PORTB_BASE,GPIO_PIN_0,
GPIO_DIR_MODE_OUT);//這個(gè)方案可以設(shè)置多個(gè)引腳,參數(shù)2為位引腳的或
控制LED燈地亮滅,就是往引腳寫入值
ledstatus=GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_0);
GPIOPinWrite(GPIO-PORTD.BASE,GPIO-PIN_0,GPIO-PIN_0&Cledstatus));
上面的程序是讀取L5對(duì)應(yīng)管腳的值,然后使燈地狀態(tài)進(jìn)行翻轉(zhuǎn)。
這里說下GPIOPinWriteO該函數(shù)的用法。
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_1,GPIO_PIN_1);
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_1,_GPIO_PIN_1);
例程上常用上面的方法。主要也就是你要讓哪個(gè)管腳置一,參數(shù)3的值中管腳對(duì)
應(yīng)的位必須置一。
如下各條指令都能點(diǎn)亮響應(yīng)端口(假設(shè)已經(jīng)都定義成輸出了)。
GPIOPinWrite(GPIO-PORTD-BASE,GPIO-PIN-O,1);
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_1,2);
GPIOPinWrite(GPIO-PORTD.BASE,GPIO-PIN.2,4);
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_3,8);
GPIOPinWrite(GPIO-PORTD.BASE,GPIO-PIN.4,0x10);
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_5,0x20);
GPIOPinWrite(GPIO-PORTD.BASE,GPIO-PIN.6,0x40);
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_7,0x80);
下面我主要講述下鍵控LED的流程,其實(shí)就是利用按鍵中斷控制燈的亮滅。
首先是配置KEY。
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);//EnableGPIOC
GPIOPinIntEnable(GPIO-PORTC-BASE,GPIO-PIN.4);//EnableGPIOCpin4
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE,GPI0_PIN_4);//setthepinmodeis
input
GPIOIntTypeSet(GPIO-PORTC-BASE,GPIO_PIN_4,GPIO_LOW_LEVEL);//set
interrupttypeislowFallingedge
IntEnable(INT-GPIOC);//enableGPIOCinterrupt
下面是按鍵中斷的處理函數(shù)
voiduserkey-handler(void)
(
unsignedcharucVal;
unsignedlongulStatus;
ulStatus=GPIOPinlntStatus(GPIO_PORTC_BASE,true);//getgpioc
interruptstatus
GPIOPinlntClear(GPIO_PORTC_BASE,ulStatus);//clearinterruptstatus
if(ulStatus&GPIO-PIN_4)//如果KEY的中斷狀態(tài)有效
ucVal=GPIOPinRead(GPIO-PORTD_BASE,GPIO_PIN_0);//翻轉(zhuǎn)LED
GPIOPinWrite(GPIO-PORTD_BASE,GPIO-PIN-O,~ucVal);
SysCtlDelay(10*(SysCtIClockGet0/3000));//延時(shí)約)0ms,消除按鍵
抖動(dòng)
while(GPIOPinRead(GPIO-PORTC.BASE,GPIO_PIN_4)==0x00);//等待KEY
抬起
SysCtlDelay(10*(SysCtIClockGet0/3000));//延時(shí)約10ms,消除松鍵
抖動(dòng)
)
)
既然用到了SysCtlDelayO函數(shù)。在這里也順道分析下。
#ifdefined(ewarm)||defined(DOXYGEN)〃iar環(huán)境下
void
SysCt1Delay(unsignedlongulCount)
(
__asm("subsrO,#l\nH
"bne.nSysCtlDelay\nn
"bxlrH);
)
#endif
#ifdefined(codered)IIdefined(gcc)IIdefined(sourcerygxx)//codered.
gcc、sourcerygcc環(huán)境下
void--.attribute--((naked))
SysCt1Delay(unsignedlongulCount)
(
__asm("subsrO,#l\nH
"bneSysCtlDelay\nn
"bxlrH);
)
#endif
#ifdefined(rvmdk)|Idefined(--ARMCC_VERSION)//kei1MDK環(huán)境下
一asmvoid
SysCt1Delay(unsignedlongulCount)
(
subsrO,#1;
bneSysCtIDelay;
bxIr;
)
#endif
#ifdefined(ccs)//ccs
volatileunsignedlongg_ulIniineCCSWorkaround;
void
SysCtIDelay(unsignedlongulCount)
(
--asm("delay?:subsrO,#l\n"
"bne.ndelay?\n"
"bxlr\nn);
//
//ThisisneededtokeepTIcompilerfromoptimizingawaythiscode.
//
g_ulIniineCCSWorkaround+=ulCount;
)
#endif
SysCtlDelayO執(zhí)行了3個(gè)匯編語句,運(yùn)行時(shí)間3個(gè)始終周期。函數(shù)說明上:The
looptakes3cycles/loop.
1、在主晶振6MHz的情況下
SysCtIDelay(2);delaytime=2*3*(1/6000000)=lus
SysCtIDelay(10*(TheSysClock/3000));delaytime=10*(6000000/3000)
*3*(1/6000000)=10ms
2、在主晶振8MHz的情況下
SysCtIDelay(2);delaytime=2*3*(1/8000000)=0.75us
SysCtlDelay(10*(TheSysClock/3000));delaytime=10*(8000000/3000)
*3*(1/8000000)=10ms
由此可以看出無論是多大的晶振,都是除以3000。SysCtlDelayClO*
(TheSysClock/3000));這種寫法也方便移植
Im3s811點(diǎn)亮LED或流水燈程序1急求?。。?!
2010-8-617:41
提問者:luxiahua427511懸賞分:5瀏覽次數(shù):525次
謝謝了??!剛開始學(xué)ARM又沒有實(shí)際的程序!謝謝幫忙了
210239343luxiahua427511luxiahua427511Im3s811點(diǎn)亮LED0
15I
推薦答案
2010-8-1512:34
#include"systemlnit.h"
//定義LED
#defineLED-PERIPHSYSCTL_PERIPH_GPTOA
#defineLED.PORTGPIO_PORTA_BASE
#defineLED-PINGPIO-PIN.2
//主函數(shù)(程序入口)
intmain(void)
(
jtagWait();//防止
"AG失效,重要!
clocklnit();//時(shí)鐘
初始化:晶振,6MHz
SysCtlPeriEnable(LED-PERIPH);//使能
LED所在的GPIO端口
GPIOPinTypeOut(LED.PORT,LED-PIN);//設(shè)置
LED所在管腳為輸出
for(;;)
(
GPIOPinWrite(LED_PORT,LED-PIN,0x00);//點(diǎn)亮LED
//SysCtlDelay(1000000);//延時(shí)
SysCtlDelayClOOO*(SysCtIClockGet()/36000));//延時(shí)
1000ms
GPIOPinWrite(LED_PORT,LED-PIN,OxFF);//熄滅LED
//SysCtlDelay(lOOOOOO);//延時(shí)
SysCtlDelayClOOO*(SysCtIClockGet()/3000));//延時(shí)
1000ms
)
最基本的一個(gè)例程,已調(diào)試通過(systemlnit.C的口該一下,8n沒G口的)。
你可以去zig網(wǎng)站上去找找資料,那里的例程很多,很適合新手。我也才剛剛開
始學(xué),一起努力了。
0
評(píng)論
回復(fù):青風(fēng)和大家一起學(xué)Stellaris系列ARM——九.ADC轉(zhuǎn)換。
程序演示:
分別完成三種ADC變化:程序一:內(nèi)部溫度測試;程序二:單端采樣;程序三:
差分采樣;
內(nèi)部溫度測試:
在Stellaris系列的ADC模塊里,附帶了一個(gè)內(nèi)置的溫度傳感器,能夠隨時(shí)檢
測芯片的溫度。該溫度傳感器可以有以下用途:
1測試用:在單獨(dú)測試ADC模塊的功能時(shí),而不必提供外部的模擬信號(hào)源
2測量芯片自身溫度,防止可能出現(xiàn)的過溫(高溫應(yīng)用場合必備)
3估算環(huán)境溫度:芯片溫度總是比環(huán)境溫度略高,如果通過實(shí)驗(yàn)找到這個(gè)差值,
則可以進(jìn)行軟件修正
4在隨機(jī)算法里可以提供隨機(jī)數(shù)種子
內(nèi)部溫度傳感器提供了模擬溫度讀取操作和參考電壓。輸出終端SENSO的電壓
通過以下等式計(jì)算得到:
SENSO=2.7-(T+55)/75
ADC溫度傳感器溫度-電壓關(guān)系
一個(gè)實(shí)用的ADC溫度轉(zhuǎn)換公式。假設(shè)溫度電壓SENSO對(duì)應(yīng)的ADC采樣值為N,
2.7V對(duì)應(yīng)Nl,(T+55)/75對(duì)應(yīng)N2。
已知:
N1x(3/1024)=2.7
N2x(3/1024)=(T+55)/75
由此得到:
N=Nl-N2=2.7/(3/1024)-((T+55)/75)/(3/1024)
解得:
T=(151040-225xN)/1024
結(jié)論:ADC配置為溫度傳感器模式后,只要得到10位采樣值N,就能推算出攝
氏溫度T。
程序標(biāo)注:
#include"inc/hw_memmap.h"
#include"inc/hw-types.h"
#include"driver1ib/adc.h"
#include"driver1ib/gpio.h"
#include"driverlib/sysctl.h"
#include"utiIs/uartstdio.h"
void
InitConsole(void)
(
//
//初始化GPIO外設(shè)
//
SysCtlPeripheralEnable(SYSCTL.PERIPH-GPIOA);
//
//配置化串口外設(shè)
//
GPIOPinConfigure(GPIO-PAO.UORX);
GPIOPinConfigure(GPIO_PAl_UOTX);
//
//配置串口管腳
//
GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_OIGPIO_PIN_1);
//
//初始化串口
//
UARTStdioInit(O);
}
int
main(void)
(
//
//T設(shè)置數(shù)組讀取ADCFIFO
//
unsignedlongulADCO-Value[1];
//
//設(shè)置溫度轉(zhuǎn)換變量
//unsignedlongulTemp-ValueC;
unsignedlongulTemp-ValueF;
//
//設(shè)置PLL,ADC的時(shí)鐘必須要16MHz
//
SysCtlClockSet(SYSCTL_SYSDIV_10ISYSCTL_USE_PLLISYSCTL-OSC-MAIN
SYSCTL_XTAL_16MHZ);
//
//初始化開發(fā)板端口
//
InitConsole();
//
//串口顯示
//
UARTprintf("ADC->\n");
UARTprintf("Type:InternalTemperatureSensor\n");
UARTprintf("Samples:One\n");
UARTprintf("UpdateRate:250ms\n");
UARTprintf("InputPin:Internaltemperaturesensor\n\n");
//
//ADCO外設(shè)初始化
//
SysCtlPeripheralEnable(SYSCTL-PERIPH-ADCO);
//
//配置ADCO,采樣序列3,ADC處理器觸發(fā),優(yōu)先級(jí)為0
//
ADCSequenceConfigure(ADCO_BASE,3,ADJTRIGGER.PROCESSOR,0);
//
//溫度傳感,中斷使能,對(duì)列結(jié)束選擇,無ADC通道
//
ADCSequenceStepConfigure(ADCO-BASE,3,0,ADC-CTL-TSI/\DC_CTL_IE
ADC-CTL.END);//
//
//使能ADC采樣
//
ADCSequenceEnable(ADCO-BASE,3);/
//
////ADC中斷清除
//
ADCIntClear(ADCO-BASE,3);
//
〃設(shè)置溫度顯示
//
while(1)
(
//
//ADC處理器觸發(fā)
//
ADCProcessorTrigger(ADCO-BASE,3);
//
//獲取中斷狀態(tài)
//
while(!ADCIntStatus(ADCO-BASE,3,false))
//
//獲取ADC采樣數(shù)據(jù)
//
ADCSequenceDataGet(ADCO-BASE,3,ulADCO-Value);
//
//計(jì)算溫度C
//
ulTemp.ValueC=((1475*1023)-(2250*ulADCO.Value[0]))/10230;
//
//計(jì)算溫度F
//
ulTemp-ValueF=((ulTemp-ValueC*9)+160)/5;
//
//串口顯示
//
UARTprintf("Temperature=%3d*Cor%3d*F\r",ulTemp-ValueC,
ulTemp-ValueF);
//
//時(shí)鐘延遲
//
SysCtlDelayCSysCtlClockGet()/12);
)
}
運(yùn)行結(jié)果:
LM3s811防止Jtag失效的源代碼
(2011-05-2114:20:16)
轉(zhuǎn)載▼
標(biāo)簽:分類:LM3
Im3s811
雜談
voidJtagWait(void)
unsignedlongi;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);//使能KEY、LED所在的PC
端口
GPIOPinTypeGPIOInput(GPIO-PORTC.BASE,GPIO-PIN-4);//設(shè)置KEY所在管腳
PC4為輸入
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE,GPIO_PIN_5);//設(shè)置LED所在管
腳PC5為輸出
if(GPIOPinRead(GPIO-PORTC.BASE,GPI0_PIN_4)==0x00)//若復(fù)位或上電
時(shí)按下KEY,則進(jìn)入
(
while(l)//死循環(huán),以等待JTAG連接,LED閃爍
{
for(i=0;i<200000;i++);
GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_5,GPIO_PIN_5);〃點(diǎn)亮LED
for(i=0;i<200000;i++);
GPIOPinWrite(GPIO-PORTC-BASE,GPIO_PIN_5,_GPIO_PIN_5);〃熄滅LED
}
)
SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC);//禁止KEY所在的GPIO
端口
}
模數(shù)轉(zhuǎn)換器(ADC)外設(shè)用于將連續(xù)的模擬電壓轉(zhuǎn)換成離散的數(shù)字量。
Stellaris系列ARM集成有一個(gè)分辨率為10位的ADC模塊,支持4/16個(gè)輸入通
道,以及一個(gè)內(nèi)部溫度傳感器。Lm3s811支持4個(gè)輸入通道,Im3s9b96支持16
個(gè)輸入通道。每個(gè)ADC模塊包含4個(gè)可編程的序列發(fā)生器。每個(gè)采樣序列均對(duì)完
全可配置的輸入源、觸發(fā)事件、中斷的產(chǎn)生和序列優(yōu)先級(jí)提供靈活的編程。
Stellaris系列ARM的ADC通過使用一種基于序列(sequence-based)的可編
程方法來收集采樣數(shù)據(jù),取代了傳統(tǒng)ADC模塊使用的單次采樣或雙采樣的方法。
每個(gè)采樣序列均為一系列程序化的連續(xù)(back-to-back)采樣,使得ADC可以從
多個(gè)輸入源中收集數(shù)據(jù),而無需控制器對(duì)其進(jìn)行重新配置或處理。
對(duì)本下811和9B96的結(jié)構(gòu)圖:
811ADC結(jié)構(gòu)圖
9B96ADC結(jié)構(gòu)圖
對(duì)比2個(gè)系列的ADC結(jié)構(gòu)圖,大家可以發(fā)現(xiàn):基本相差不大,觸發(fā)條件完全相同:
具有:比較器,定時(shí)器,GPIO,PWM的觸發(fā)條件。
同時(shí)具有4個(gè)可編程序列發(fā)生器,相對(duì)應(yīng)的SS中斷。不同的是9B96的ADC可以
產(chǎn)生相應(yīng)的PWM觸發(fā)信號(hào)。811不支持外部參考電壓,因此硬件方面:
811用于ADC方面的只有4個(gè)管腳了。分別代表4個(gè)輸入通道。
您好!jtagwait是用于防止JTAG失效鎖定,其作用主要是針對(duì)48腳和64
腳的系列芯片,而現(xiàn)在的100腳的系列芯片已經(jīng)支持JTAG解鎖,所以可以不使
用jtagwait來檢測。
而jtagwait是防止用戶對(duì)JTAG調(diào)試接口的相關(guān)引腳進(jìn)行誤操作,使軟件不能利
用JTAC調(diào)試功能,而微控制器在上電后,先執(zhí)行jtagwait檢測程序,來檢測某
引腳電平,并進(jìn)入WHILE⑴;循環(huán),從而使得LMFLASHPROGRAMMER軟件可以通
過JTAG連接上微控制器,進(jìn)而將用戶程序擦除,恢復(fù)其正常的JTAG調(diào)試功能。
LM3S系列JTAG口當(dāng)10用的解鎖
LM3S系列ARM的JTAG口原本是跟10口復(fù)用的,當(dāng)GPIO用時(shí)跟一般GPIO沒什
么不同。一般只在CPIO口不夠用或者做產(chǎn)品不希望用戶隨意更新固件時(shí),會(huì)把
JTAG口當(dāng)GPIO口來用。如果將JTAG那5根線用作CPIO功能,芯片就會(huì)被鎖住,
不過要注意,鎖住后JTAG就再也不起作用了。解決被鎖的辦法有兩個(gè):
一是下載程序時(shí)留有恢復(fù)措施,只需啟用即可恢復(fù)。
如果沒有加預(yù)防鎖死的代碼,就只能用Luminary的LMLINK來解鎖。很遺憾的
是Sandstorm系列(LM3Sxxx)只支持部分類型,解鎖功能也不是很穩(wěn)定,LM3Sxxxx
才能很好解鎖,不過可以試試看。如果有高人看得懂它的時(shí)序再寫出上位機(jī)應(yīng)該
ULINK也解得了。實(shí)在打不開只能找流明諾瑞或更換芯片了。
下面是一段lordor兄使用LM3SXXXSmartBoard演示板恢復(fù)JTAG的演示代碼:
voidInit-cpu(void)
〃初始化系統(tǒng)時(shí)鐘設(shè)置
SysCtlClockSet(SYSCTL_USE_OSCISYSCTL-OSC-MAINISYSCTL_XTAL_6MHZ);
/******************************GPI0B初始化
〃使能GPIOB模塊
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
////////////////////////////////////////////////////
/〃〃〃〃〃鎖定演示:如果設(shè)置為GPIO,則JTAG不起作用了
〃按鍵檢測
if(GPIOPinRead(KEYPORT,KD)//如果為高電平
GPIODirModeSet(PH5.PORT,PH5,GPIO-DIR_MODE_IN);//JTAG
if(GPIOPinRead(KEYPORT,K2))//如果為高電平
GPIODirModeSet(PH6.PORT,PH6,GPIO-DIR_MODE_IN);
GPIODirModeSet(PH7.PORT,PH7,GPIO-DIR_MODE_IN);
GPIODirModeSet(PH8-PORT,PH8,GPIO-DIR_MODE_IN);
GPIODirModeSet(PH9.PORT,PH9,GPIO-DIR_MODE_IN);
}
//設(shè)置GPIOB口的B4為輸出引腳
GPIODirModeSet(LED.PORT,LED1,GPIO-DIR_MODE_OUT);
〃設(shè)置連接LED1的引腳為高電平
GPIOPinWrite(LED_PORT,LED1,LED1);
)
說明:下載后,可以發(fā)現(xiàn)用JTAG無法通信了。要取消,同時(shí)按住K1及K2健,
重開機(jī)就可以取消鎖定功能了。--bylordor
最后,貼上用Luminary的LMLINK來解鎖LM3Sxxxx的方法。
網(wǎng)站六大類職位火熱招聘中!點(diǎn)擊了解英特爾云計(jì)算2012年1月當(dāng)選微軟MVP
的CSDN會(huì)員名單揭曉!
LM3SAPI函數(shù)解讀范例
2010-03-0309:01784人閱讀評(píng)論⑶收藏舉報(bào)
jtagWait()函數(shù)解讀
1.通常在主函數(shù)的開始都要調(diào)用jtagWait。函數(shù),如工程模版的主函數(shù),
intmain(void)
(
jtagWaitO;//防止JTAG失效,重要!
clocklnit0;//時(shí)鐘初始化:晶振,6MHz
for(;;)
)
2.關(guān)于函數(shù)的解釋,先要找到函數(shù)的定義,可以在函數(shù)的調(diào)用處指向函數(shù)名后
右鍵選擇"Gotodefinitionof…”。
函數(shù)jtagWait0在systemlnit.c文件中,其功能是防止JTAG接口失效。
函數(shù)定義:
voidjtagWait(void)
(
SysCtIPeriEnable(KEY.PERIPH);//使能KEY所在的GPIO端口
GPIOPinTypeln(KEY-PORT,KEY-PIN);//設(shè)置KEY所在管腳為輸入
if(GPIOPinRead(KEY-PORT,KEY.PIN)==0x00)//若復(fù)位時(shí)按下KEY,則進(jìn)
入
(
for//死循環(huán),以等待JTAG連接
)
SysCtlPeriDisable(KEY.PERIPH);//禁止KEY所在的GPIO端口
)
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
1111
①第一個(gè)函數(shù)SysCtlPeriEnableO的功能是使能外圍設(shè)備,原名是
SysCtlPeripheralEnable(),用#define替換是為了使用的方便,該函數(shù)在
sysctl.c文件中,可以先加入該文件以便使用"Gotodefinitionof…”找
到其定義。其定義為:
VoidSysCtlPeripheralEnable(unsignedlongulPeripheral)
ASSERT(SysCt1PeripheralVaiid(ulPeripheral));//Checkthearguments.
HWREG(g_pulRCGCRegs[SYSCTL_PERIPH_INDEX(ulPeripheral)])|=
SYSCTL-PERIPH-MASK(ulPeriphera1);//Enablethisperipheral.
)
該函數(shù)中的ASSERT。是一個(gè)宏,其定義在debug,h中,其作用是計(jì)算括號(hào)
中的表達(dá)式,為0則程序報(bào)告錯(cuò)誤并終止執(zhí)行,非0則繼續(xù)向下執(zhí)行。函數(shù)
SysCtlPeripheralValidO用于判斷傳入?yún)?shù)的有效性,即判斷是否為該函數(shù)可
以處理的外圍設(shè)備,是則返回真,否則返回假,在調(diào)用中傳入?yún)?shù)KEY_PERIPH,
其實(shí)為SYSCTL_PERIPH_GPIOG,其值為0x20000040,該值不是寄存器的地址,暫
時(shí)不清楚該值的意義。
HWREGO又是定義的一個(gè)宏,在文件hw-types,h中,其定義為:
#defineHWREG(x)(*((volatileunsignedlong*)(x)))
其中(volatileunsignedlong*)(x)是將x強(qiáng)制轉(zhuǎn)換為無符號(hào)長整型的指針,
*((volatileunsignedlong*)(x))是引用該指針?biāo)赶虻拇鎯?chǔ)單元,例如
HWREG(0x20000000)=1;就是向地址為0x20000000的存儲(chǔ)單元寫入L
傳入HWREG()的參數(shù)為
g_pulRCGCRegs[SYSCTL-PERIPH.INDEX(u1Peripheral)].
首先看g-PulRCGCRegs口,這是一個(gè)靜態(tài)只讀的無符號(hào)長整型數(shù)組,其定義
為:
staticconstunsignedlongg-pulSCGCRegs[]=
(
SYSCTL.SCGCO,//0x400FE110
SYSCTL.SCGCl,//0x400FE114
SYSCTL-SCGC2//0x400FE118
);
這其實(shí)是三個(gè)睡眠模式時(shí)鐘選通控制寄存器,每個(gè)位控制一個(gè)給定接口、功能、
或單元的時(shí)鐘使能,如果置位,則對(duì)應(yīng)的單元接收時(shí)鐘并運(yùn)行,否則,對(duì)應(yīng)的單
元不使用時(shí)鐘并禁止(節(jié)能),這些位的復(fù)位狀態(tài)都為。(不使用時(shí)鐘),即所有
功能單元都禁止,應(yīng)用所需的端口需通過軟件來使能。分了三個(gè)寄存器來管理所
有接口、功能、或單元的時(shí)鐘。SYSCTL_SCGC0=0x400FE110表示寄存器的地址。
再看SYSCTL_PERIPH_INDEX(ulPeriphera1),此處的
ulPeripheral=KEY_PERIPH=SYSCTL_PERIPH_GPIOG=0x20000040。
SYSCTL_PERIPH_INDEX()的定義為:
#defineSYSCTL_PERIPH_INDEX(a)(((a)?28)&Oxf),此處計(jì)算結(jié)果
SYSCTL_PERIPH_INDEX(0x20000040)=2,而g_pulSCGCRegs[2]正好是睡眠模式時(shí)
鐘選通控制寄存器2(SCGC2),正好是控制GPIOA—GPIOH的時(shí)鐘使能。因此不
難猜想SYSCTL_PERIPH」NDEX(a)是為了選擇寄存器SCGCO,SCGC1,SCGC2中的
一個(gè)。
因此HWREG(g_pulRCGCRegs[SYSCTL_PERIPH_INDEX(ulPeripheral)])意思就是
選中寄存器SCGC2,整句的意思是要改寫該寄存器的值。于是繼續(xù)看后半句
SYSCTL_PERIPH_MASK(ulPeripheral),當(dāng)然1=是復(fù)合賦值a|=b相當(dāng)于a=aIb。
#defineSYSCTL-PERIPH-MASK(a)(((a)&Oxffff)?(((a)&OxOOlfOOOO)?
16)),該句比較復(fù)雜,暫時(shí)不知道為什么要這樣寫,但此處計(jì)算結(jié)果
SYSCTL_PERIPH_MASK(0x20000040)=0x0040,因此
HWREG(g_pulRCGCRegs[SYSCTL_PERIPH_INDEX(ulPeripheral)])|=
SYSCTL_PERIPH_MASK(ulPeriphera1);
一句的目的是將寄存器SCGC2的第6位GPIOG置1而使能GPIOG端口。另外,再
看一下SCGC2的定義如下:
76543210
GPIOHGPIOGGPIOFGPIOEGPIODGPIOCGPIOBGPIOA
這就不難理解為什么有如下定義
#defineSYSCTL.PERIPH.GPIOA0x20000001//GPIOA
#defineSYSCTL_PERIPH_GPIOB0x20000002//GPIOB
#defineSYSCTL_PERIPH_GPIOC0x20000004//GPIOC
#defineSYSCTL_PERIPH_GPIOD0x20000008//GPIOD
#defineSYSCTL_PERIPH_GPIOE0x20000010//GPIOE
#defineSYSCTL.PERIPH_GPIOF0x20000020//GPIOF
#defineSYSCTL_PERIPH_GPIOG0x20000040//GPIOG本例中使用
#defineSYSCTL_PERIPH_GPIOH0x20000080//GPIOH
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
////
②第二個(gè)函數(shù)GPIOPinTyp函n()其實(shí)為GPIOPinTypeGPIOInput(),該函數(shù)在
gpio.c文件中,其定義為:
VoidGPIOPinTypeGPIOInput(unsignedlongulPort,unsignedcharucPins)
(
ASSERT(GPIOBaseValid(ulPort));//Checkthearguments.
GPIODirModeSet(ulPort,ucPins,GPIO-DIR_MODE_IN);//Makethepin(s)be
inputs.
GPIOPadConfigSet(ulPort,ucPins,GPIO-STRENGTH_2MA,
GPIO-PIN_TYPE_STD);
//Setthepad(s)forstandardpush-pulloperation.
)
調(diào)用該函數(shù)時(shí)傳入的參數(shù)為ulPort=GPI0_P0RTG_BASE=0x40026000和
ucPins=GPI0_PIN_5=0x00000020.
第一句有關(guān)ASSERT。宏的應(yīng)用如前所述,不再贅述。
現(xiàn)在來看第二句GPIODirModeSet(ulPort,ucPins,GPI0.DIR一MODEJN);其
中新的參數(shù)GPIO-DIR.MODE.IN=0x00000000,該函數(shù)的目的是要將GPIOG的第5
個(gè)管腳置為輸入。該函數(shù)也在gpio.c文件中,其定義為:
VoidGPIODirModeSet(unsignedlongulPort,unsignedcharucPins,unsigned
longulPinlO)
(
ASSERT(GPIOBaseValid(ulPort));
ASSERT((ulPinlO==GPIO_DIR_MODE_IN)II(ulPinlO==GPIO_DIR_MODE_OUT)
II
(ulPinlO==GPIO-DIR.MODE.HW));//Checkthearguments.
HWREG(ulPort+GPIO_O_DIR)=((ulPinlO&1)?
(HWREG(ulPort+GPIO-O-DIR)|ucPins):
(HWREG(ulPort+GPIO_O_DIR)&-(ucPins)));
HWREG(ulPort+GPIO_O_AFSEL)=((ulPinlO&2)?
(HWREG(ulPort+GPIO-O-AFSEL)|ucPins):
(HWREG(ulPort+GPIO_O_AFSEL)&
(ucPins)));//Setthepindirectionandmode.
}
同上,前兩句不再贅述,第三句賦值表達(dá)式的左邊為HWREG(ulPort+
GPIO-O-DIR),此處ulPort==GPIO_PORTG_BASE=0x40026000,是GPIOG塊的基
地址,每個(gè)塊都有相同的GPIO寄存器,因此可以用BASE+OFFSET的方式尋址各
個(gè)塊的寄存器,GPIO_O_DIR=0x00000400,表明GPIO方向寄存器GPIODIR的偏
移量為0x400,因此HWREG(ulPort+GPIO_O_DIR)尋址到了GPIOG的寄存器
GPIODIR,該寄存器是數(shù)據(jù)方向寄存器,GPIODIR寄存器中設(shè)為1的位將相應(yīng)的
管腳配置成輸出,而設(shè)為0的位將相應(yīng)的管腳配置成輸入,所有位在復(fù)位時(shí)都會(huì)
被清零,即默認(rèn)情況下所有GPIO管腳都是輸入。賦值號(hào)右邊是一個(gè)條件表達(dá)式,
條件為(ulPinlO&1),ulPinlO為傳入的第三個(gè)參數(shù),為0則置為輸入管腳,
為1則置為輸出管腳,此處傳入GPIO_D管腳0DEJN=0x00000000,因此條件為
假,所以會(huì)將(HWREG(ulPort+GPIO_O_DIR)&-(ucPins))的值寫入寄存器
GPIODIR,下面分析如何實(shí)現(xiàn),HWREG(ulPort+GPIO_O_DIR)取出GPIODIR的值,
此處的ucPins=GPIO_PIN_5=0x00000020,取反后只有第5位為0,其余位為P
與原值相與后把第5為清0,然后送回寄存器。
第四句與第三句形式一樣,不再詳細(xì)分析,只簡單說明其作用,HWREG(ulPort
+GPI0_0-AFSEL)為選中GPI0備用功能選擇(GPIOAFSEL)寄存器,向該寄存器
中的任意位寫“1”表示選擇該GPIO線路所對(duì)應(yīng)的硬件控制(功能)。由于所有
的位都在復(fù)位時(shí)都會(huì)清零,因此在默認(rèn)的情況下,并無GPI0線被設(shè)為硬件控制
(功能)。而參數(shù)ulPinlO有三種選擇,如下:
#defineGPIO_DIR_MODE_IN0x00000000//PinisaGPIOinput
#defineGPIO_DIR_MODE_OUT0x00000001//PinisaGPIOoutput
#defineGPIO-DIR-MODE-HW0x00000002//Pinisaperipheralfunction
因此ulPinI0=2時(shí)則將GPIOAFSEL寄存器的相應(yīng)位置1,表示選擇其硬件控制功
能。本例中第5位清0。
③第三個(gè)函數(shù)為GPIOPinReadO,猜想其功能為讀取某端口某管腳的狀態(tài),該
函數(shù)也在gpio.c中,其定義為:
LongGPIOPinRead(unsignedlongulPort,unsignedcharucPins)
(
ASSERT(GPIOBaseValid(ulPort));
return(HWREG(ulPort+(GPIO-O-DATA+(ucPins?2))));//Returnthepin
value(s).
}
其中HWREG(ulPort+(GPIO_O_DATA+(ucPins?2)))這句很重要,體現(xiàn)
了一種利用地址線屏蔽而實(shí)現(xiàn)可對(duì)任意位操作的機(jī)制,將地址總線的位[9:2]用
作屏蔽位,在讀操作過程中,如果與數(shù)據(jù)位相關(guān)聯(lián)的地址位被設(shè)為1,那么讀取
該值,如果與數(shù)據(jù)位相關(guān)聯(lián)的地址位被設(shè)為0,那么不管它的實(shí)際值是什么,都
將該值讀作0。下面結(jié)合本例解釋,將各個(gè)參數(shù)的值代入為HWREG(0x40026000+
(0x000+(0x00000020?2))),結(jié)果為HWREG(0x40026080)。
ADDR[9:2]9876543210
0x0800010000000
GPIODATA76543210
如上表所示,GPIODATA寄存器中除第5位外,其余都被屏蔽,可以只讀出
第5位的狀態(tài)。
④第四個(gè)函數(shù)SysCtlPeriDisable()的原型為void
SysCt1PeripheralDisable(unsignedlongulPeripheral),在sysctl.c文件中,
其定義為:
VoidSysCtlPeripheralDisable(unsignedlongulPeripheral)
ASSERT(SysCtlPeripheralValid(ulPeripheral));
HWREG(g_pu1RCGCRegs[SYSCTL_PERIPH_INDEX(ulPeriphera1)])&=
-SYSCTL_PERIPH_MASK(ulPeripheral);//Disablethisperipheral.
)
其形式和SysCt1PeripheralEnable()相似,不再贅述。
2012CSDN網(wǎng)站六大類職位火熱招聘中!點(diǎn)擊了解英特爾云計(jì)算2012年1月當(dāng)
選微軟MVP的CSDN會(huì)員名單揭曉!
一、使用UART庫函數(shù)介紹
1,函數(shù):UARTConfigSetExpClk()
功能:UART配置(要求提供明確的時(shí)鐘速率)
原型:voidUARTConfigSetExpClk(unsignedlongulBase,unsignedlong
ulUARTClk,
unsignedlongulBaud,unsignedlongulConfig)
參數(shù):ulBase:UART端口的基址,取值UART0一BASE、UART1.BASE或UART2.BASE
ulUARTClk:提供給UART模塊的時(shí)鐘速率,即系
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 掛靠免責(zé)協(xié)議書范本
- 《防治腦血管病》課件
- 2024年智能交通企業(yè)無抵押企業(yè)間借款合同范本3篇
- 2024年消防救援高空作業(yè)責(zé)任限定合同
- 2025年黑龍江貨運(yùn)從業(yè)資格證模擬考試0題題庫答案
- 2025年福州道路運(yùn)輸從業(yè)資格證考試內(nèi)容是什么
- 2025年西安考從業(yè)資格證貨運(yùn)試題
- 2025年攀枝花貨運(yùn)從業(yè)資格證試題庫及答案
- 2024年物業(yè)前期服務(wù)綜合合同
- 《萬象城商業(yè)模式》課件
- 大學(xué)體育與健康課件:體育鍛煉與安全衛(wèi)生保健
- 學(xué)校食堂色標(biāo)管理制度、食品切配工用具色標(biāo)管理操作指南
- 部編語文五年級(jí)上冊(cè)詞語表注音版
- 1神州謠 課件(共50張PPT)
- 國家開放大學(xué)思想道德與法治社會(huì)實(shí)踐作業(yè)集合6篇
- 小學(xué)侵害未成年人強(qiáng)制報(bào)告制度
- 2023年飛行員基礎(chǔ)知識(shí)考試題庫(500題版)
- 公租房運(yùn)營管理服務(wù)投標(biāo)方案
- 能源管理系統(tǒng)EMS用戶需求說明書
- 人工智能對(duì)中學(xué)教學(xué)的影響與應(yīng)對(duì)策略
- 2668-人員招聘與培訓(xùn)實(shí)務(wù)
評(píng)論
0/150
提交評(píng)論