日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UART0串口编程系列(四)

發(fā)布時間:2024/4/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UART0串口编程系列(四) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

串口編程(UART0)UC/OS(一)?

---------------------------------------------------------------------

Author?? :tiger-john
WebSite? :blog.csdn.net/tigerjb

Email??? jibo.tiger@gmail.com

Tiger聲明:本人鄙視直接復(fù)制本人文章而不加出處的個人或團(tuán)體,但不排斥別人轉(zhuǎn)載tiger-john的文章,只是請您注明出處并和本人聯(lián)系或留言給我。3Q

--------------------------------------------------------------------

?

一.UC/OS中設(shè)計串口程序所要考慮的問題

1.???? 串口通信數(shù)據(jù)以幀為單位進(jìn)行處理,如果需要接收大量數(shù)據(jù),則幀緩沖區(qū)規(guī)模必然很大;如果需要發(fā)送大量數(shù)據(jù),則可將原始數(shù)據(jù)快看作緩沖區(qū),不需要另外再創(chuàng)建幀緩沖區(qū)。

2.???? 幀緩沖區(qū)是全局?jǐn)?shù)據(jù)結(jié)構(gòu),通常為共享資源,需要考慮互斥訪問問題(如在任務(wù)中關(guān)中斷)。但是此時系統(tǒng)的效率就會下降。我們可以通過合理設(shè)計通信任務(wù),將對幀緩沖區(qū)進(jìn)行讀/寫操作的雙方封裝到一個任務(wù)里,是幀緩沖區(qū)稱為這個任務(wù)的私有數(shù)據(jù)結(jié)構(gòu),不再是共享資源, 次時就不需要互斥信號量了

3.???? UC/OS操作系統(tǒng)中串口發(fā)送和串口接收函數(shù)都被設(shè)計成了任務(wù)。

Tiger-john說明:

UC/OS上編寫串口編程時,主要是考慮以上問題。其它的方面就是UART0的配置以及如何編寫中斷程序這些方面在前面已經(jīng)提過,再此不再涉及。

如果你還不是很明白的話請看我《UART0串口編程系列》文章的前半部分。

二.UC/OS串口編程

通過一個程序來分析UC/OS串口編程設(shè)計和實現(xiàn):

程序?qū)崿F(xiàn)的目標(biāo):

通過按鍵來控制串口發(fā)送任務(wù)80字節(jié)的幀,每次發(fā)送8字節(jié),分25次發(fā)送完。

1.UC/OS串口編程中由那幾個任務(wù)組成

1>啟動任務(wù)

2>按鍵任務(wù)(此任務(wù)可以根據(jù)不同的程序設(shè)計內(nèi)容來改變)

3>發(fā)送任務(wù)

4>串口發(fā)送中斷

2.各個任務(wù)之間的關(guān)系

3.啟動任務(wù)流程:

l? 定義各種通信工具(例如:信號量)

l? 系統(tǒng)硬件初始化

l? 初始化UART0

l? 創(chuàng)建各個任務(wù)

l? 創(chuàng)建各種通信工具

l? 刪除自己

?

3啟動任務(wù)流程圖

?

程序:

/**********************************************************

* 名稱:??????????????????? UART0_Init

* 功能:??????????????????? UART0初始化 通訊波特率1152008位數(shù)據(jù)位,1位停止位,無奇偶校驗,使能TxFIFO,THRE中斷

* 入口參數(shù):??????????? bps ?????? 串口波特率

* 出口參數(shù):???????????

**********************************************************/

void? ??? UART0_Init(uint32 bps)

{

?

??? uint16? Fdiv;

??? PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;????? //設(shè)置UART0的引腳

??? U0LCR = 0x83;????????????

??? Fdiv = (Fpclk>>4)/bps;

??? U0DLM = Fdiv>>8;

??? U0DLL = Fdiv%256;

??? U0LCR = 0x03;??

??? U0FCR = 0x05;? ?????????????????????????? // 使能TxFIFO

??? U0IER = 0x02;????????????????????? ?? ???//使能THRE中斷

??

}

?

/**********************************************************

* 作者:tiger-john

* 時間:2011121

* 名稱:Task0 啟動任務(wù)

* 功能:初始化硬件,創(chuàng)建其他任務(wù),

* 入口參數(shù):pdata

**********************************************************/

void Task0???? (void *pdata)

{

pdata = pdata;??????????????

//硬件初始化

TargetInit ();

//初始化串口

UART0_Init(115200);

//創(chuàng)建按鍵信號量??????????????????????????????????????????????

Sem_ButtonFlag =? OSSemCreate(0);??

//創(chuàng)建發(fā)送信號量???????????????????????????????

Sem_SendFlg =? OSSemCreate(0);

//創(chuàng)建按鍵任務(wù)????????????????????????????????????

OSTaskCreate(Task1,(void *)0, &TaskStk1[TaskStkLengh - 1],10);?????

OSTaskCreate(Task2,(void *)0, &TaskStk2[1000 - 1],6);?????????????? //創(chuàng)建發(fā)送任務(wù)

OSTaskDel(OS_PRIO_SELF);??????????????????????????????????????????? //刪除自己

???????

}

4.按鍵任務(wù)流程:

l? 等待開始信號量

l? 制造模擬數(shù)據(jù)

l? 按鍵按下發(fā)送信號量,否則延遲等待

程序:

/**********************************************************

**??????????????????????????? Task1(按鍵任務(wù))

**********************************************************/

void Task1???? (void *pdata)

{

uint8 i;

uint8 err;

pdata = pdata;

while(1)

??????? {

?????????????? OSSemPend(Sem_StartFlag,0,&err); //等帶開始信號量

?????????????? for(i = 0;i < 80;i++)

????????????????????? {

???????????????????????????? send_buf[i] = i ;??? ???????? //制造模擬數(shù)據(jù)。

????????????????????? }?????

??????? ??? while((IO0PIN & KEY ) != 0);???? //等帶按鍵

??????? ??? OSSemPost(Sem_ButtonFlag);?? //發(fā)送按鍵信號量

??????? ???

??????? }

}

5.發(fā)送任務(wù)流程:

l? 等待按鍵信號量

l? 打開串口中斷

l? 發(fā)送10

l? 等待發(fā)送信號量

l? 發(fā)送8字節(jié)

l? 關(guān)發(fā)送串口中斷

l? 發(fā)送開始信號量

程序:

/************************************************************????????????????? ??????????Task2(發(fā)送任務(wù))

**********************************************************/

void Task2???? (void *pdata)

{

uint8 i,j,err;

pdata = pdata;

while(1)

{

??????? OSSemPend(Sem_ButtonFlag,0,&err); ?//等待按鍵信號量

??????? U0IER = U0IER | 0x02;??????????? ?? //打開串口發(fā)送中斷

??????? for(i = 0;i < 10;i++)??????????? ???????? //發(fā)送10

?????????????? {

??????? ? ????????? for(j = 0;j < 8;j++)???? ?????????? //每次8字節(jié)

????? ??????????????? {

????? ?????????????????????? U0THR = send_buf[i*8+j];

????? ??????????????? }?????

????? ???????? OSSemPend(Sem_SendFlag,0,&err); //等待發(fā)送信號量

?? ??????????????????

???? ??? }

?????????????? U0IER = U0IER & ~0x02;????????????? //關(guān)掉串口中斷

?????????????? OSSemPost(Sem_StartFlag);?????????? //發(fā)送開始信號量

}????????????

????? ?

}

6.串口發(fā)送中斷流程:

l? 關(guān)中斷

l? 清除中斷控制標(biāo)志位

l? 清除串口中斷標(biāo)志位

l? 開中斷

l? 發(fā)送發(fā)送信號量

?

/**********************************************************

* ??? 稱:??????????? UART0_Exception

* ??? 能:??????????? 串口發(fā)送中斷

* 入口參數(shù):???????????

* 出口參數(shù):??????????? data????????????? 發(fā)送的數(shù)據(jù)

**********************************************************/

void? UART0_Exception(void)

{

uint32 data;

OS_ENTER_CRITICAL();?????? ??????//關(guān)中斷

VICVectAddr = 0;????????????????? //清除中斷

data = U0IIR;???????????????????? ?????? //清除中斷表示寄存器標(biāo)志

OS_EXIT_CRITICAL();?????? ????????//開中斷

OSSemPost(Sem_SendFlag);??????? //發(fā)出發(fā)送信號量

?}
7.總的程序如下:

?

?

??

?

view plain
  • /****************************************Copyright?(c)**************************************************?
  • **???????????????????????????????????????西安郵電學(xué)院?
  • **??????????????????????????????????????graduate?school?
  • **???????????????????????????????????????XNMS實驗室?
  • **??????????????????????????????????????Author:冀博?
  • **??????????????????????????????????????Time:2011年1月21日?
  • **?????????????????????????????????http://blog.csdn.net/tigerjb?
  • **?
  • **--------------File?Info-------------------------------------------------------------------------------?
  • **?File?name:???????????UART0_while?
  • **?Last?modified?Date:??2011-01-20?
  • **?Last?Version:????????1.0?
  • **?Descriptions:????????當(dāng)按鍵按下后,串口發(fā)送中斷給上位機(jī)發(fā)送80字節(jié)數(shù)據(jù)?
  • **-----------------------------------------------------------------------------------------------------?
  • ?
  • ?
  • /******************************************************************************?
  • **?Modified?by:?????????TIGER0-JOHN?
  • **?Modified?date:???????2011-1-21?
  • **?Version:?????????????1.1???
  • **?Descriptions:????????測試成功?
  • ****************************************************************************/??
  • #include?"config.h"??
  • #include?"stdlib.h"??
  • ?
  • #define?KEY?????????????1<<20????????//設(shè)置為觸發(fā)按鍵??
  • #define?TaskStkLengh????64??????????//Define?the?Task0(啟動任務(wù))?堆棧長度??
  • #define?TaskStkLengh????64??????????//Define?the?Task1(按鍵任務(wù))??堆棧長度???
  • #define?TaskStkLengh????64??????????//Define?the?Task2((發(fā)送任務(wù))?堆棧長度??
  • ??
  • ??
  • OS_STK??TaskStk0[TaskStkLengh];?????//Define?the?Task0?stack??定義啟動任務(wù)堆棧???
  • OS_STK??TaskStk1[TaskStkLengh];?????//Define?the?Task1?stack??定義按鍵任務(wù)堆棧??
  • OS_STK??TaskStk2[TaskStkLengh];?????//Define?the?Task2?stack??定義發(fā)送任務(wù)堆棧??
  • ??
  • ??
  • void????Task0(void?*pdata);?????????//Task0?啟動任務(wù)??
  • void????Task1(void?*pdata);?????????//Task1?按鍵任務(wù)??
  • void????Task2(void?*pdata);?????????//Task2?發(fā)送任務(wù)??
  • ??
  • uint8???send_buf[80];??
  • OS_EVENT????????*Sem_ButtonFlag;????//定義按鍵信號量??
  • OS_EVENT????????*Sem_SendFlag;??????//定義發(fā)送信號量??
  • OS_EVENT????????*Sem_StartFlag;??????//定義開始信號量??
  • ??
  • ??
  • /****************************************************************************?
  • *?名稱:???????????UART0_Init?
  • *?功能:???????????UART0初始化?通訊波特率115200,8位數(shù)據(jù)位,1位停止位,無奇偶校驗?
  • *???????????????????使能TxFIFO,和THRE中斷?
  • *?入口參數(shù):?????bps?????串口波特率?
  • *?出口參數(shù):?????無?
  • ****************************************************************************/??
  • void????UART0_Init(uint32?bps)??
  • {??
  • ???
  • ????uint16??Fdiv;??
  • ????PINSEL0?=?(PINSEL0?&?~(0xf)?|?0x05)?;???????//設(shè)置UART0的引腳??
  • ????U0LCR?=?0x83;???????????????
  • ????Fdiv?=?(Fpclk>>4)/bps;??
  • ????U0DLM?=?Fdiv>>8;??
  • ????U0DLL?=?Fdiv%256;??
  • ????U0LCR?=?0x03;?????
  • ????U0FCR?=?0x05;???????????????????????????????//?使能TxFIFO??
  • ????U0IER?=?0x02;???????????????????????????????//?使能THRE中斷??
  • ?????
  • }??
  • /****************************************************************************?
  • *?名????稱:???????UART0_Exception?
  • *?功????能:???????串口發(fā)送中斷?
  • *?入口參數(shù):?????無?
  • *?出口參數(shù):?????data????????發(fā)送的數(shù)據(jù)?
  • ****************************************************************************/??
  • void??UART0_Exception(void)??
  • {??
  • ??????
  • ????uint32?data;??
  • ????OS_ENTER_CRITICAL();????????????????????????????//關(guān)中斷??
  • ????VICVectAddr?=?0;????????????????????????????????//清除中斷??
  • ????data?=?U0IIR;???????????????????????????????????//清除中斷表示寄存器標(biāo)志??
  • ????OS_EXIT_CRITICAL();?????????????????????????????//開中斷??
  • ????OSSemPost(Sem_SendFlag);????????????????????????//發(fā)出發(fā)送信號量??
  • ?}??
  • /*********************************************************************************************************?
  • **??????????????????????????????main()函數(shù)?
  • ********************************************************************************************************/??
  • ??
  • int?main?(void)??
  • {??
  • ????OSInit?();??????????????????????????????????????????????????????????//初始化操作系統(tǒng)?????????????????????????????????????????????????
  • ????OSTaskCreate?(Task0,(void?*)0,?&TaskStk0[TaskStkLengh?-?1],?2);?????//創(chuàng)建啟動任務(wù)??
  • ????OSStart?();?????????????????????????????????????????????????????????//啟動操作系統(tǒng),開始對任務(wù)進(jìn)行調(diào)度管理??
  • ????return?0;?????????????????????????????????????????????????????????????
  • }??
  • /*********************************************************************************************************?
  • **????????????????????????????Task0(啟動任務(wù))?
  • ********************************************************************************************************/??
  • ??
  • void?Task0??(void?*pdata)??
  • {??
  • ????pdata?=?pdata;?????????????????
  • ????TargetInit?();?????????????????????????????????????????????????????//硬件初始化??????????????????????????????????????????????????
  • ????UART0_Init(115200);????????????????????????????????????????????????//初始化串口??
  • ????Sem_ButtonFlag?=??OSSemCreate(0);??????????????????????????????????//創(chuàng)建按鍵信號量??
  • ????Sem_SendFlag???=??OSSemCreate(0);?????????????????????????????????????//創(chuàng)建發(fā)送信號量??
  • ????Sem_StartFlag??=??OSSemCreate(1);???
  • ????OSTaskCreate(Task1,(void?*)0,?&TaskStk1[TaskStkLengh?-?1],5);??????//創(chuàng)建按鍵任務(wù)??
  • ????OSTaskCreate(Task2,(void?*)0,?&TaskStk2[TaskStkLengh?-?1],4);???????????????//創(chuàng)建發(fā)送任務(wù)??
  • ????OSTaskDel(OS_PRIO_SELF);???????????????????????????????????????????//刪除自己??
  • ??????????
  • }??
  • /*********************************************************************************************************?
  • **????????????????????????????Task1(按鍵任務(wù))?
  • ********************************************************************************************************/??
  • void?Task1??(void?*pdata)??
  • {??
  • ????uint8?i;??
  • ????uint8?err;??
  • ????pdata?=?pdata;???
  • ????while(1)??
  • ????????{??
  • ????????????OSSemPend(Sem_StartFlag,0,&err);???????????//等帶開始信號量??
  • ????????????for(i?=?0;i?<?80;i++)??
  • ????????????????{??
  • ????????????????????send_buf[i]?=?i?;???????????//制造模擬數(shù)據(jù)。??
  • ????????????????}?????
  • ????????????while((IO0PIN?&?KEY?)?!=?0);????????//等帶按鍵??
  • ????????????OSSemPost(Sem_ButtonFlag);??????????//發(fā)送按鍵信號量??
  • ??????????????
  • ????????}??
  • }??
  • /*********************************************************************************************************?
  • **????????????????????????????Task2(發(fā)送任務(wù))?
  • ********************************************************************************************************/??
  • void?Task2??(void?*pdata)??
  • {??
  • ????uint8?i,j,err;??
  • ????pdata?=?pdata;??
  • ??????
  • ????while(1)??
  • ????{??
  • ????????OSSemPend(Sem_ButtonFlag,0,&err);???????//等待按鍵信號量??
  • ????????U0IER?=?U0IER?|?0x02;???????????????????//打開串口發(fā)送中斷??
  • ????????for(i?=?0;i?<?10;i++)????????????????????//發(fā)送10次??
  • ????????????{??
  • ????????????????for(j?=?0;j?<?8;j++)?????????????//每次8字節(jié)??
  • ????????????????????{??
  • ????????????????????????U0THR?=?send_buf[i*8+j];??
  • ????????????????????}?????
  • ????????????????OSSemPend(Sem_SendFlag,0,&err);????//等待發(fā)送信號量??
  • ??????????????????????
  • ????????????}??
  • ????????????U0IER?=?U0IER?&?~0x02;??????????????//關(guān)掉串口中斷??
  • ????????????OSSemPost(Sem_StartFlag);???????????//發(fā)送開始信號量??
  • ????}?????????
  • ???????????
  • }??
  • ????
  • /*********************************************************************************************************?
  • **????????????????????????????End?Of?File?
  • ******************************************************************************************
  • 轉(zhuǎn)載于:https://my.oschina.net/u/137617/blog/27757

    總結(jié)

    以上是生活随笔為你收集整理的UART0串口编程系列(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 美国美女黄色片 | 冈本视频在线观看 | 国产原创剧情av | 日本精品一区二区三区视频 | 精品丰满人妻无套内射 | 免费成人激情视频 | 午夜免费体验区 | 国产一区二区免费看 | 在线成人免费电影 | 国产高清视频在线免费观看 | 九九综合 | 日本日皮视频 | 日韩精品在线网站 | 四虎网址在线观看 | 亚洲视频一区二区在线观看 | 日韩av网页 | 日本中文字幕网站 | 色综合图片 | 女性裸体不遮胸图片 | 亚洲一区二区国产精品 | 影音先锋资源av | 无码人妻精品一区二区蜜桃网站 | 国产91片 | 久久亚洲AV无码 | 国产成人精品免费在线观看 | 成人午夜在线观看 | 在线视频网 | 亚洲精品在线视频观看 | 国产高潮视频在线观看 | 日本人视频69式jzzij | 久草a在线 | 999热 | 亚洲精品免费在线视频 | 日韩特级黄色片 | 第一av| 麻豆视频网站在线观看 | 影音先锋中文字幕第一页 | 中文字幕一区二区三区在线不卡 | 91免费看黄 | 天天拍夜夜拍 | 性生活在线视频 | 自拍偷拍福利视频 | 99ri精品 | www国产精品内射老熟女 | 亚洲 美腿 欧美 偷拍 | 欧美在线综合 | 爱操在线 | 国产人妖网站 | 粉嫩小泬无遮挡久久久久久 | 青青草一区二区三区 | 久久九精品 | 国产精品777| 国产资源网站 | 久久久青青草 | 凹凸日日摸日日碰夜夜 | 依依综合网| 一级做a爰片久久毛片潮喷 天天透天天干 | 亚洲无吗在线观看 | 俄罗斯av片 | 欧美性综合 | 激情五月综合色婷婷一区二区 | 成人午夜网站 | 邻居少妇张开腿让我爽了在线观看 | 超碰在线观看av | 色噜噜亚洲 | 亚洲不卡中文字幕 | 美女又黄又免费 | 精品久久久在线观看 | 国产精选毛片 | 久久mm | 极品少妇xxx | 91官网视频 | 精人妻无码一区二区三区 | 欧美成人黑人猛交 | 国产一二三在线视频 | 三女同志亚洲人狂欢 | 在线观看911视频 | 男人的天堂久久久 | 99色网站 | 黄页网址大全免费观看 | 一本亚洲 | 一级国产黄色片 | 免费成人深夜在线观看 | 麻豆md0034在线观看 | 免费在线看污 | 久草手机在线视频 | 国产高清免费在线播放 | 特级西西人体 | 午夜激情av | 欧美最黄视频 | 性高潮久久久久 | 国产又猛又粗 | 激情五月在线观看 | 日本五十熟hd丰满 | 日本视频黄 | 国产亚洲欧美精品久久久www | 香蕉视频一区二区三区 | 美女av免费观看 | 福利电影一区二区三区 |