欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
PXA270 RTC應用及uCOS II的移植
[打印本頁]
作者:
51hei單片
時間:
2016-3-14 16:52
標題:
PXA270 RTC應用及uCOS II的移植
實驗目的
①了解RTC應用及其概念
②了解ARM串口通信的工作機制
③了解串口驅動程序的編寫方法
④掌握實際控制RTC的方法,顯示系統時間
⑤了解uCOS II的基本結構
⑥分析uCOS II源碼
⑦掌握uCOS II的移植過程
⑧掌握uCOS II應用程序設計技巧
實驗內容
①熟悉PXA270提供的實時時鐘控制器
②熟悉PXA270提供的通用異步串行收發口
③參照提供的串口驅動程序,將RTC的當前值由串口輸出
④結合LCD驅動程序,將RTC的值顯示在LCD中,完成一個功能基本完備的數字時鐘
⑤完成程序的編譯和調試,并觀察運行結果
⑥閱讀uCOS II源代碼,重點分析與硬件相關的文件內容
⑦熟悉PXA270的資源配置,掌握uCOS II必須使用資源的配置技巧
⑧掌握uCOS II的移植方法
⑨參照示例代碼完成自己的多任務程序
⑩編譯正確后,將映像下載到Flash中運行
實驗原理
①RTC的控制
RTC的控制很簡單,主要是初始化的一些配置,初始化后直接讀寫相應的寄存器就可以完成對時間的讀取和重設操作。本實驗為了方便起見,沒有使用到RTC的中斷,直接讀取RTC的日期和時間寄存器。
對RTC進行初始化時,要對如下RTSR、RCNR、RYCR及RDCR寄存器進行初始化,其中各個寄存器的作用如下:
RTC狀態寄存器——RTSR
RTSR寄存器包括了兩個中斷允許位和兩個狀態位。當RTSR[HZE]為1時并且檢測到1-HZ時鐘信號上升沿到來時,RTSR[HZ]便被自動設為1。當RTSR[ALE]為1時并檢測到RCNR和RTAR相同時,RTSR[AL]便被自動設為1。RTSR[HZ]或RTSR[AL]為1時都會發送到中斷控制器。
RTC計數寄存器——RCNR
RCNR是一個在1-HZ時鐘脈沖信號上升沿觸發下實現自動加1的32位可讀寫寄存器,該寄存器在系統復位后為0.
RTC年計數寄存器——RYCR
通過對該寄存器賦值,可以設置系統的起始時的年月日等日期參數。復位后自動設置的日期是2000年1月1日。該寄存器的數值變化與RTC天計數寄存器RDCR相關,當RDCR產生進位時,RYCR便會按照年月日的相應位實現變化。
RTC天數計數寄存器——RDCR
RDCR是一個計算系統一天時間變化的寄存器,該寄存器除了包含時分秒之外,還包括每月中的第幾個星期以及摩天在該星期中的位置。秒計數位在1-Hz時鐘脈沖信號的計時下自動增1,增加到59后就會向分計數位進位。依次按照七日與時間格式方式類推進位。
②uCOS應用程序編寫
1)任務創建
OSTaskCreate(void (*task)(void *pd), void*pdata, OS_STK *ptos, INT8U proi);
基本的任務創建函數,入口參數分別為指向任務代碼的函數指針pd,傳遞給任務的數據指針pdata,指向任務棧棧頂的指針ptos,任務的優先級proi。返回OS_NO_ERR表示任務創建成功;返回OS_PRIO_EXIT表示指定優先級的已經存在;返回OS_PRIO_INVALD表示指定的優先級比用戶定義的最低優先級還低。
OSTaskCreate(void (*task)(void *pd), void*pdata, OS_STK *ptos, INT8U proi, INT16U id, OS_STK *pbos, INT32U stk_size,void *pext, INT16U opt);
擴展的任務創建函數,入口參數前四個與基本任務創建函數相同,擴展的入口參數包括:任務的ID號id;指向任務棧棧底的指針pbos;任務的棧的大小stk_size(以元素計,非字節);指向用戶自定義任務控制塊擴展的指針pext;額外的任務行為控制的標識符opt。
2)信號量實現任務同步
OSSemCreate(INT16U cnt);
創建一個信號量,輸入參數包括信號量的初始值cnt。返回值:成功時返回一個指向與該信號量關聯的事件控制塊的指針;失敗時返回0。
OSSemPend(OS_ENENT *pevent, INT16U timeout,INT8U *err);
獲取一個信號量,入口參數包括:指向時間控制塊的指針pevent;超時時間值timeout;傳入的等待被填寫的錯誤信息的指針err。
OSSemPost(OS_EVENT *pevent);
釋放一個信號量,輸入參數包括:指向事件控制塊的指針。
實驗步驟
第一步 分析代碼
結合以上說明,對本實驗提供的示例代碼分析,深入理解針對具體的硬件實現,軟件是如何配合工作的。
第二步 程序的編譯和下載
利用ADS打開示例工程文件,執行Project→Make,編譯、鏈接生成可執行映像文件
第三步 將生成的二進制.bin文件用H-Flasher下載到實驗板中NOR Flash的0地址處,重啟實驗板。
程序說明
本次實驗主要使用前幾次實驗的代碼完成一個綜合性的包括一個實時操作系統的實驗,其中按鍵驅動和LCD顯示部分做了少許修改,剩下主要工作是如何在操作系統下完成整個實驗。
程序源代碼、注釋
while(1)
{
OSTimeDly(1);
OSSemPend(Keypad_Sem, 0, &err); /*wait for the Keypad_Sem from keypad intr handler*/
//Tmp = (INT8U)KPAS_VALUE ;
//CONSOL_Printf(" KPAS_VALUE value: 0x%x\r\n", Tmp);
//Tmp = (INT8U)KPDK_VALUE ;
//CONSOL_Printf(" KPDK_VALUE value: 0x%x\r\n", Tmp);
//OSTimeDlyHMSM(0, 0, 0, 500);
//j = KPAS_VALUE;
keyValue = keyLUT[KPAS_VALUE];
switch(keyValue)
{
//普通數字鍵
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{
tempDisp = tempDisp * 10 + keyValue - '0';
if(tempDisp > 9999)
tempDisp = 0;
SegLedDispNum(tempDisp, DISP_BLANKING);
break;
}
//退格鍵
case '*':
{
tempDisp /= 10;
SegLedDispNum(tempDisp, DISP_BLANKING);
break;
}
//確認鍵
case '#':
{
switch(setWhat)
{
case 0:
{
get_date(&tempDate);
set_date(tempDisp, tempDate.month, tempDate.day);
get_time(&tempTime);
set_time(tempTime.hour, tempTime.minute, tempTime.second);
t=10;
while(t>0)t--;
get_date(&tempDate);
//OSSemPost(LCD_Sem);
break;
}
case 1:
{
get_date(&tempDate);
set_date(tempDate.year, tempDisp / 100, tempDisp % 100);
get_time(&tempTime);
set_time(tempTime.hour, tempTime.minute, tempTime.second);
t=10;
while(t>0)t--;
get_date(&tempDate);
OSSemPost(LCD_Sem);
break;
}
case 2:
{
get_time(&tempTime);
set_time(tempDisp / 100, tempDisp % 100, tempTime.second);
get_time(&tempTime);
OSSemPost(LCD_Sem);
break;
}
case 3:
{
get_time(&tempTime);
set_time(tempTime.hour, tempTime.minute, tempDisp);
get_time(&tempTime);
OSSemPost(LCD_Sem);
break;
}
}
break;
}
//年
case 'A':
{
setWhat++;
if(setWhat > 3)
setWhat = 0;
print_3232((char *)(0xa1800000), word_null[0],0,300,0xffff);
print_3232((char *)(0xa1800000), word_null[0],32,300,0xffff);
print_3232((char *)(0xa1800000), word_dis[4][0],0,300,0x0);
break;
}
//月日
case 'B':
{
setWhat--;
if(setWhat < 0)
setWhat = 3;
print_3232((char *)(0xa1800000), word_null[0],0,300,0xffff);
print_3232((char *)(0xa1800000), word_null[0],32,300,0xffff);
print_3232((char *)(0xa1800000), word_dis[5][0],0,300,0x0);
print_3232((char *)(0xa1800000), word_dis[0][0],32,300,0x0);
break;
}
//時分
case 'C':
{
setWhat = 2;
print_3232((char *)(0xa1800000), word_null[0],0,300,0xffff);
print_3232((char *)(0xa1800000), word_null[0],32,300,0xffff);
print_3232((char *)(0xa1800000), word_dis[2][0],0,300,0x0);
print_3232((char *)(0xa1800000), word_dis[6][0],32,300,0x0);
break;
}
//秒
case 'D':
{
setWhat = 3;
print_3232((char *)(0xa1800000), word_null[0],0,300,0xffff);
print_3232((char *)(0xa1800000), word_null[0],32,300,0xffff);
print_3232((char *)(0xa1800000), word_dis[7][0],0,300,0x0);
break;
}
default:
break;
} //end of switch(keyValue)
switch(setWhat)
{
case 0:
{
print_3232((char *)(0xa1800000), word_null[0],0,300,0xffff);
print_3232((char *)(0xa1800000), word_null[0],32,300,0xffff);
print_3232((char *)(0xa1800000), word_dis[4][0],0,300,0x0);
break;
}
case 1:
{
print_3232((char *)(0xa1800000), word_null[0],0,300,0xffff);
print_3232((char *)(0xa1800000), word_null[0],32,300,0xffff);
print_3232((char *)(0xa1800000), word_dis[5][0],0,300,0x0);
print_3232((char *)(0xa1800000), word_dis[0][0],32,300,0x0);
break;
}
case 2:
{
print_3232((char *)(0xa1800000), word_null[0],0,300,0xffff);
print_3232((char *)(0xa1800000), word_null[0],32,300,0xffff);
print_3232((char *)(0xa1800000), word_dis[2][0],0,300,0x0);
print_3232((char *)(0xa1800000), word_dis[6][0],32,300,0x0);
break;
}
case 3:
{
print_3232((char *)(0xa1800000), word_null[0],0,300,0xffff);
print_3232((char *)(0xa1800000), word_null[0],32,300,0xffff);
print_3232((char *)(0xa1800000), word_dis[7][0],0,300,0x0);
break;
}
}
if(1==flag)
{
LED_CS3 =0x4040;
LED_CS2 =0x4040;
}
else if(2==flag)
{
if((tm[3]==0)&&(tm[2]==0)&&(tm[1]==0)&&(tm[0]==0))
{
LED_CS2 = 0x8080;
LED_CS3 = 0x8080;
}
else if((tm[3]==0)&&(tm[2]==0)&&(tm[1]==0))
{
LED_CS2 = 0x8080;
LED_CS3 = (SEG_VALUE[tm[0]]<<8) | 0x80;
}
else if((tm[3]==0)&&(tm[2]==0))
{
LED_CS2 = 0x8080;
LED_CS3 = (SEG_VALUE[tm[0]]<<8) | SEG_VALUE[tm[1]];
}
else if(tm[3]==0)
{
LED_CS2 = (SEG_VALUE[tm[2]]<<8) |0x80;
LED_CS3 = (SEG_VALUE[tm[0]]<<8) | SEG_VALUE[tm[1]];
}
}
else if(flag==3)
{
LED_CS3 = (SEG_VALUE[tm[0]]<<8) | SEG_VALUE[tm[1]];
LED_CS2 = (SEG_VALUE[tm[2]]<<8) | SEG_VALUE[tm[3]];
}
//OSSemPost(Keypad_Sem);
//OSTimeDly(50);
}
復制代碼
總結
本次實驗完成了一個基本的基于實時操作系統的可以通過矩陣鍵盤設置時間的實時時鐘的設計。實驗中遇到了各種各樣的問題,究其根本還是對C語言掌握的不踏實,很多想當然認為的問題實際并不是那么回事。通過本次實驗,提高了調試代碼的能力,也對嵌入式系統有了進一步的認識。
作者:
18007735965
時間:
2019-6-24 14:38
大佬 可以發我一個工程嗎
作者:
18007735965
時間:
2019-6-24 14:39
大佬可以發我一份工程嗎
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1