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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UART0串口编程系列(四)

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

2019獨角獸企業重金招聘Python工程師標準>>>

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

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

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

Email??? jibo.tiger@gmail.com

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

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

?

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

1.???? 串口通信數據以幀為單位進行處理,如果需要接收大量數據,則幀緩沖區規模必然很大;如果需要發送大量數據,則可將原始數據快看作緩沖區,不需要另外再創建幀緩沖區。

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

3.???? UC/OS操作系統中串口發送和串口接收函數都被設計成了任務。

Tiger-john說明:

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

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

二.UC/OS串口編程

通過一個程序來分析UC/OS串口編程設計和實現:

程序實現的目標:

通過按鍵來控制串口發送任務80字節的幀,每次發送8字節,分25次發送完。

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

1>啟動任務

2>按鍵任務(此任務可以根據不同的程序設計內容來改變)

3>發送任務

4>串口發送中斷

2.各個任務之間的關系

3.啟動任務流程:

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

l? 系統硬件初始化

l? 初始化UART0

l? 創建各個任務

l? 創建各種通信工具

l? 刪除自己

?

3啟動任務流程圖

?

程序:

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

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

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

* 入口參數:??????????? bps ?????? 串口波特率

* 出口參數:???????????

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

void? ??? UART0_Init(uint32 bps)

{

?

??? uint16? Fdiv;

??? PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;????? //設置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 啟動任務

* 功能:初始化硬件,創建其他任務,

* 入口參數:pdata

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

void Task0???? (void *pdata)

{

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

//硬件初始化

TargetInit ();

//初始化串口

UART0_Init(115200);

//創建按鍵信號量??????????????????????????????????????????????

Sem_ButtonFlag =? OSSemCreate(0);??

//創建發送信號量???????????????????????????????

Sem_SendFlg =? OSSemCreate(0);

//創建按鍵任務????????????????????????????????????

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

OSTaskCreate(Task2,(void *)0, &TaskStk2[1000 - 1],6);?????????????? //創建發送任務

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

???????

}

4.按鍵任務流程:

l? 等待開始信號量

l? 制造模擬數據

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

程序:

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

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

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

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 ;??? ???????? //制造模擬數據。

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

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

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

??????? ???

??????? }

}

5.發送任務流程:

l? 等待按鍵信號量

l? 打開串口中斷

l? 發送10

l? 等待發送信號量

l? 發送8字節

l? 關發送串口中斷

l? 發送開始信號量

程序:

/************************************************************????????????????? ??????????Task2(發送任務)

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

void Task2???? (void *pdata)

{

uint8 i,j,err;

pdata = pdata;

while(1)

{

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

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

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

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

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

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

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

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

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

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

???? ??? }

?????????????? U0IER = U0IER & ~0x02;????????????? //關掉串口中斷

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

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

????? ?

}

6.串口發送中斷流程:

l? 關中斷

l? 清除中斷控制標志位

l? 清除串口中斷標志位

l? 開中斷

l? 發送發送信號量

?

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

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

* ??? 能:??????????? 串口發送中斷

* 入口參數:???????????

* 出口參數:??????????? data????????????? 發送的數據

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

void? UART0_Exception(void)

{

uint32 data;

OS_ENTER_CRITICAL();?????? ??????//關中斷

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

data = U0IIR;???????????????????? ?????? //清除中斷表示寄存器標志

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

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

?}
7.總的程序如下:

?

?

??

?

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

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。