娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年01月22日(星期三)

正在發生

2020年01月22日 | STM8S003軟件串口的實現

發布者:靜默思考 來源: eefocus關鍵字:STM8S003  軟件串口  發送和接收 手機看文章 掃描二維碼
隨時隨地手機看文章

一切發送和接收的過程都是在后臺完成的,具體實現需要一個帶捕獲&匹配功能的定時器,本實現用的是TIM1。任意具有捕獲輸入功能的引腳都可以用作接收引腳,任意GPIO引腳都可以用作發送引腳。此實現用TIM_CH4作為發送引腳,TIM1_CH3作為接收引腳。


整個數據傳輸過程基于定時器1的溢出事件,溢出周期為發送半個bit的時間,這是因為發送和接收用的是同一個定時器。


發送環節:


當有數據字節進入發送緩存后,發送請求標志被置位,最近的一個事件更新中斷用于啟動此次發送傳輸,從產生發送請求到開始發送的最長延時為一個溢出周期。在每個偶數的溢出中斷中設置相應的發送引腳的電平


接收環節:


空閑狀態下,CH3一直處于輸入捕獲狀態,當捕獲到第一個下降沿時(起始位),此時計數器的值會自動保存到CCR3中用于之后的匹配,在捕獲中斷中將通道模式改為匹配,同時禁止該引腳的捕獲/匹配功能,使其成為普通的GPIO引腳,以便檢測輸入電平。由于半個bit周期的溢出事件存在,所以最近的一次匹配肯定出現在起始位的中間點,此時讀取引腳上的電平,以得到該位的邏輯,之后丟棄偶數次的匹配中斷,在奇數次匹配中斷中讀取剩余的位的值,知道接收到完整的一字節數據(包括停止位),將通道模式改為捕獲,等待下一字節。  


具體實現代碼


#define BAUDRATE_SWUART         (1200)

#define USR_OVF_ONLY            (0x04)

#define TIM1_CR_CEN             (0x01)      //定時器4計數使能

#define TIM1_SR_UIF             (0x01)

#define TIM1_SR_CC3IF           (0x08)

#define UPDATE_INTER_ENABLE     (0x01)

#define CAP_COMP_INTER_ENABLE3  (0x08)

#define CHANN3_INPUT_TI3FP3     (0x01)

#define CHANN3_OUTPUT           (0xFC)

#define CHANN3_FUNC_MASK        (0x03)

#define CHANN3_CAP_COMP_ENABLE  (0x01)

#define CHANN3_CAP_COMP_DISB    (0xFE)

#define CAP_FALL_EDGE           (0x02)

#define START_BIT_POS           (0x01)      //起始位位置

#ifdef  HAVE_PARITY

#define WORD_LENGTH             (11)        //1個起始位,8個數據位,1個奇偶校驗位,1個停止位

#define SET_RCV_BIT             (0x400)

#define STOP_BIT_POS            (0x200)     //停止位位置

#define CHECK_BIT_POS           (0x100)

#else

#define WORD_LENGTH             (10)

#define SET_RCV_BIT             (0x200)

#define STOP_BIT_POS            (0x100)

#endif

#define BIT_MASK                (0x01)

#define EVEN_CHECK              (0)

/*

*********************************************************************************************************

*                                            GLOBAL VARIABLES

*********************************************************************************************************

*/

bool      IsFirstBit;

bool      TxByteReady;

bool      IsOdd;

uint8_t   TxBitCnt;                      //發送位數計數

uint8_t   RxBitCnt;

uint16_t  TxByte;                        //移位發送緩存

uint16_t  RxByte;

/*

*********************************************************************************************************

* Description: Swuart初始化

*

* Arguments  : none

*

* Returns    : none

*

* Notes      : 1200

*********************************************************************************************************

*/

void InitSwuart (void)

{

    TIM1->ARRH = (F_MASTER / (BAUDRATE_SWUART * 2)) >> 8;

    TIM1->ARRL = (uint8_t)(F_MASTER / (BAUDRATE_SWUART * 2));

    TIM1->CR1 = USR_OVF_ONLY;                                   //僅計數器溢出才產生更新事件

    TIM1->CCMR3 = CHANN3_INPUT_TI3FP3;

    TIM1->CCER2 = CHANN3_CAP_COMP_ENABLE | CAP_FALL_EDGE;

    TIM1->IER = UPDATE_INTER_ENABLE |CAP_COMP_INTER_ENABLE3;

    TIM1->CR1 = TIM1_CR_CEN;

    SwuartTxByte(0xFF);                                        //初始化后第一個發送的第一個字節要丟棄

}

/*

*********************************************************************************************************

* Description: 發送一個字節

*

* Arguments  : byte: 待發送的字節

*

* Returns    : none

*

* Notes      : none

*********************************************************************************************************

*/

void SwuartTxByte (uint8_t byte)

{  

    TxByte = byte;

    TxBitCnt = WORD_LENGTH;

                       

    TxByte |= STOP_BIT_POS; //添加停止位

                       

    #ifdef HAVE_PARITY

    if (GetParity(byte, EVEN_CHECK)){

        TxByte |= CHECK_BIT_POS;

    }

    #endif

                       

    TxByte = TxByte << START_BIT_POS;      //添加起始位

                       

    TxByteReady = true;

    IsFirstBit = true;

}

/*

*********************************************************************************************************

* Description: 發送數據

*

* Arguments  : data: 指向待發送數據的指針

*              len:  數據長度

*

* Returns    : none

*

* Notes      : none

*********************************************************************************************************

*/

void SwuartSend (const uint8_t *data , uint8_t len)

{

           uint8_t i;

    static uint8_t SwuartSendBuf[50];

                       

    for (i = 0; i < len; i++){

        SwuartSendBuf[i] = data[i];

    }

                       

    i = 0;

    while (len--){

        SwuartTxByte(SwuartSendBuf[i++]);

        while (TxByteReady){

            ;

        }

    }

}

/*

*********************************************************************************************************

* Description: 奇偶校驗

*

* Arguments  : byte: 待校驗的字節

*              parity: 校驗類型選擇

*

* Returns    : none

*

* Notes      : 校驗位的值

*********************************************************************************************************

*/

#ifdef HAVE_PARITY

uint8_t GetParity (uint8_t byte, uint8_t parity)

{

    uint8_t  i;

    uint8_t  n;

    uint16_t data;

                       

    data = byte;

    n = 0;

                       

    if (data){

        do{

            i = data & 0x01;

            if ( i > 0 ){

                n++;

            }

            data = data >> 1;

        } while ( data > 0 ) ;

    }

    n = n & 0x01;

                       

    if (parity){      //奇校驗

        if(n){

            return 0;

        } else {

            return 1;

        }

    } else {         //偶校驗

        if(n){

            return 1;

        } else {

            return 0;

        }

    }

}

#endif

#pragma vector = TIM1_OVF_IRQn

__interrupt void Uart_Tx_Timing (void)

{

    static uint8_t OvfInterCnt;

                       

    TIM1->SR1 &= ~TIM1_SR_UIF;

                       

    if (!TxByteReady){

        return;

    }

    if (IsFirstBit){

        OvfInterCnt = 0;

        IsFirstBit = false;

    }

    if (!(OvfInterCnt % 2) && TxBitCnt){          //丟棄奇數此溢出中斷,因為發送1位的時間為兩個溢出周期

        GPIOC->ODR.ODR4 = TxByte & BIT_MASK;

        TxByte = TxByte >> 1;

        TxBitCnt--;

    }

    OvfInterCnt++;

    if (!TxBitCnt && !(OvfInterCnt % 2)){         //一個字節發送完畢,保證一個完整的停止位

        TxByteReady = false;

    }

}

#pragma vector = TIM1_CAP_COMP_IRQn

__interrupt void Uart_Rx_Timing (void)

{

           uint8_t tmp;

    static uint8_t CapCompCnt;

                       

    TIM1->SR1 &= ~TIM1_SR_CC3IF;

                       

    if ((TIM1->CCMR3 && CHANN3_FUNC_MASK) == CHANN3_INPUT_TI3FP3){

        TIM1->CCER2 &= CHANN3_CAP_COMP_DISB;                //此處順序不能顛倒,要先禁止,后修改通道模式

        TIM1->CCMR3 &= CHANN3_OUTPUT;

        CapCompCnt = 1;

        RxBitCnt = WORD_LENGTH;

        RxByte = 0;

        return;

[1] [2]
關鍵字:STM8S003  軟件串口  發送和接收 引用地址:STM8S003軟件串口的實現

上一篇:stm8 串口模擬接收
下一篇:STM8 模擬串口程序

0

推薦閱讀

據報道,進入2018年,由于芯片半導體行業內多數企業業績仍然一般,短期板塊熱度較之前明顯下降。但是,2018年芯片半導體產業鏈的國產替代仍將是市場當中級別最大的投資機會之一。首先,芯片半導體事關國家安全,所以國 家隊必然出手,引導產業資本投入以實現國產替代的戰略目標。中國目前每年用于芯片進口花費超過2000億美元,這是一筆巨大的外匯開支,且...
據美國科技媒體報道,市場研究公司Gartner對89個國家或地區的3000多名高管進行CIO調查發現后發現,人工智能的實施在過去四年里增長了270%,僅在過去一年就增長了37%。這一比例高于2015年的10%。“我們距離能夠完全接管復雜任務的通用人工智能仍然有很遙遠的距離,但我們現在已經可以利用人工智能增強工作和決策科學的領域——我們稱之為‘增強智能’。”Ga...
開發環境(1)硬件平臺:FS2410(2)主機:Ubuntu 12.04FS2410串口的原理圖 串口UART寄存器配置 配置TXD0與RXD0(GPH2、GPH3)設置波特率(UBRDIVn)設置傳輸格式(ULCONn)選擇時鐘源與中斷方式(UCONn)設置FIFO(UFCONn)設置流控(UMCONn)接收字符和發送字符(UTRSTATn)源代碼 //uart.c#include "2410addr.h" ...
距離2021年春節僅剩22天,隨著“牛年”的腳步日益臨近,各大手機廠商也都紛紛推出關于“牛年”的周邊產品。  令人意想不到的是,今日小米公司官方竟然通過微博玩起了“梗”,曬出了一張小米11的奶牛保護殼,并配文稱,這難道就是傳說中,全網最牛的小米11?  從曬出的圖片可以看出,小米11的主攝、超廣角鏡頭成了奶牛的眼睛,閃光燈與長焦微距...

史海拾趣

問答坊 | AI 解惑

功率放大電路測試

選擇題 1、三極管工作在乙類工作狀態,管子的導通角為   。 A) 0°; B) 90°; C)180°; D)360°; E) 180°與360°之間。 2、三極管工作在甲類工作狀態,管子的導通角為   。 A) 0°; B)90°; C) 180°; D)360°; ...…

查看全部問答∨

誠尋電子開發高手合作。

誠尋電子開發高手合作。 要求合作者有如下條件:1)能夠根據概念開發設計電子部分滿足客戶要求,快速抄板或改進,包括模擬/數字/通信/自動化控制。2)對電子零件和IC非常熟悉,能否很快估算價格;3)很強的技術背景,能解決所有技術問題并能評估/核 ...…

查看全部問答∨

DSP芯片技術背景與市場價值

1.什么是DSP   數字信號處理是一種將現實世界中的真實信號(專業術語稱之為連續信號)轉換為計算機能夠處理的信息的過程。比如人們說話的聲音,這就是一個連續信號,除此之外,現實生活中還有很多這樣的信號,比如光、壓力、溫度等等。這些信號通過 ...…

查看全部問答∨

2440+CE5.0圖形顯示偏慢

請教高手,小弟用2440+CE5.0的平臺,用api做的程序讀取bmp圖片,然后粘貼,具體代碼段如下: HRESULT LoadPartBitmap(HWND hwnd,HINSTANCE hInstance,int x,int y,int Length,int Width,int number) {         HDC hdc,hdcM ...…

查看全部問答∨

SST39VF系列的Byte-Program Operation問題

是不是每給一個地址寫一個數前都得寫一次three-byte-load command sequence ? 然后得等data#polling或者toggle bit確認數據燒寫完畢? 在Byte-Program Operation方式下,能寫一次command sequence接著寫入多個字節么?…

查看全部問答∨

vs2005對話框程序菜單的問題

基于MFC對話框,添加了一個菜單資源,比較奇怪的是菜單的根節點沒有CLICK事件,子節點就有,這是為什么? 菜單1 --菜單2 --菜單3 菜單2、3有點擊事件,菜單1沒有…

查看全部問答∨

wince5.0中播放mp3

原來的wince5.0中播放WAV,怎么樣才能播放mp3? …

查看全部問答∨

轉讓ARM開發板

   我上個月買的一塊smart arm2200開發塊一塊,由于之前我已經把<ARM嵌入式系統基礎教程>,<ARM嵌入式系統實驗教程二>,<ARM嵌入式MiniGUI初步與應用開發范例>,<ARM 嵌入式Linux系統構造與驅動開發范例>看了好幾遍,再加上 ...…

查看全部問答∨

4.3寸屏終于搞掂了

經過一個春節準備,和買了幾個別人的板子來參考,終于把4.3寸屏點亮了。這個板子的控制部分是STM32的芯片,然后由專用的驅動芯片(SSD1963)來驅動液晶屏,對比了其他的方案,4.3寸屏采用這樣驅動方式比較直接和簡潔。付幾個圖片大家一起指點。 &n ...…

查看全部問答∨

API函數介紹

本帖最后由 paulhyde 于 2014-9-15 09:13 編輯 正在學習使用LM3S811開發板的朋友們:編程有困難的時候看看這些函數介紹吧,很有幫助的吆  …

查看全部問答∨
小廣播
添点儿料...
无论热点新闻、行业分析、技术干货……
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 辽宁省| 沂水县| 贵定县| 麦盖提县| 克什克腾旗| 潜山县| 和龙市| 鸡泽县| 焦作市| 丹凤县| 分宜县| 仁怀市| 额尔古纳市| 新昌县| 盐津县| 石林| 砀山县| 德钦县| 读书| 当涂县| 禹州市| 绵竹市| 舟曲县| 义乌市| 泗阳县| 祁阳县| 凤庆县| 和田市| 什邡市| 竹山县| 宣恩县| 广宁县| 文昌市| 大渡口区| 岐山县| 高雄市| 焉耆| 大庆市| 农安县| 壶关县| 新巴尔虎左旗|