色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32的串口編程實驗理解分析

dytfki8u8yql ? 來源:電子技術控 ? 作者:電子技術控 ? 2023-04-23 10:03 ? 次閱讀

USART—通用同步異步收發接收器,是一個串行通信設備,可以和外部設備進行靈活的全雙工數據交換,有別于USART還有一個UART(在原來的基礎上裁剪掉了同步通信功能(時鐘同步)),串行通信一般是以幀格式傳輸數據,一幀一幀的傳。

協議層:串口通信的一個數據包包含從起始信號開始,直到停止信號的結束 起始信號:一個邏輯0數據位表示。 停止信號:0.5,1,1.5或2個邏輯1的數據位表示。 0.5個停止位:智能卡模式下的接收數據時使用。 1個停止位:停止位的默認數值 1.5個停止位:智能卡模式下的手法數據和接收數據時使用 2個停止位:常規USART模式,單線模式以及調制解調器的模式。 有效數據的基本長度被約定為5,6,7,8. 奇偶檢驗(設置USART-CR1 的PS位) 偶檢驗:數據=00110101,里面數據1的個數位為偶數位,檢驗位置“0”,當數據檢驗和偶數相同的時候,證明沒有出錯,反之則錯誤 奇檢驗:數據 = 01110101,里面數據1的個數為奇檢位,檢驗位置“1”,當數據檢驗和奇數相同,則證明沒有出錯,反之錯誤。 當然也會存在同時兩個位一塊出現錯誤,導致無法判斷是否位奇偶檢驗的錯誤,但發生的概率很低。

下面是對代碼的理解: 可以看出USART_RX_STA類似與一個16位的寄存器,前14位存儲的是數據,后面兩個分別檢測0X0D和0X0A。 接下里分析:

void uart_init(u32 pclk2,u32 bound)

{

float temp;

u16 mantissa;

u16 fraction;

temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV

mantissa=temp; //得到整數部分

fraction=(temp-mantissa)*16; //得到小數部分

mantissa《《=4;

mantissa+=fraction;

RCC-》APB2ENR|=1《《2; //使能PORTA口時鐘

RCC-》APB2ENR|=1《《14; //使能串口時鐘

GPIOA-》CRH&=0XFFFFF00F;//IO狀態設置

GPIOA-》CRH|=0X000008B0;//IO狀態設置

RCC-》APB2RSTR|=1《《14; //復位串口1

RCC-》APB2RSTR&=~(1《《14);//停止復位

//波特率設置

USART1-》BRR=mantissa; // 波特率設置

USART1-》CR1|=0X200C; //1位停止,無校驗位。

#if EN_USART1_RX //如果使能了接收

//使能接收中斷

USART1-》CR1|=1《《5; //接收緩沖區非空中斷使能

MY_NVIC_Init(3,3,USART1_IRQn,2);//組2,最低優先級

#endif

} temp=(float)(pclk2*1000000)/(bound*16);這是一個計算公式,因為使能的是串口1,而串口1是在APB2ENR寄存器里面(其余串口均在寄存器APB1ENR里面),因為APB2的頻率一般位72M,而APB1的頻率一般位36M。 所以這里的pclk2為72M,而bound是你需要設置的波特率。

USARTX-BRR: 前四位為小數部分 ,后12位是整數部分,假設算出來的mantissa = 39.5,小數部分相當于把1分成了16份,所以相當于把0.5*16轉化為二進制存入。

mantissa = temp的作用僅僅是:為了接下來將小數部分求出來

fraction=(temp-mantissa)*16; //得到小數部分

mantissa《《=4; 這兩行代碼是為將十進制的整數部分和小數部分,分別轉化為16進制。然后存入到波特率寄存器里面。緊接著使能串口1和PORTA時鐘(串口一對應的IO口是PA9,PA10,需要拿跳帽連接在一起)。 然后將IO口置零,然后分別進行設置成一個輸入一個輸出,

USART1-》CR1|=0X200C; 設置成使能串口8個字長1個停止位(USART_CR2中[13:12]默認為“0”)

MY_NVIC_Init(3,3,USART1_IRQn,2)

將其分在組2里面,此時的搶占優先級:響應優先級為 = 2:2,即(00-11)四種情況,而3:3的安排選擇了組2優先級最小的一種情況。這樣可以先執行上面的波特率賦值,以及串口使能等等操作,最后再進行這行代碼運行。 接下來看下一部分:

u16 USART_RX_STA=0; //接收狀態標記

void USART1_IRQHandler(void)

{

u8 res;

#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.

OSIntEnter();

#endif

if(USART1-》SR&(1《《5)) //接收到數據

{

res=USART1-》DR;

if((USART_RX_STA&0x8000)==0)//接收未完成

{

if(USART_RX_STA&0x4000)//接收到了0x0d

{

if(res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始

else USART_RX_STA|=0x8000; //接收完成了

}

else //還沒收到0X0D

{

if(res==0x0d)USART_RX_STA|=0x4000;

else

{

USART_RX_BUF[USART_RX_STA&0x3fff]=res;

USART_RX_STA++;

if(USART_RX_STA》(USART_REC_LEN-1))USART_RX_STA=0;//接收數據錯誤,重新開始接收

}

}

}

} 起始階段: USART_RX_STA=0,對接受狀態的標記。 先通過狀態寄存器SR的RXNE是否為1,是1則接收到了數據,反之則沒有。緊接這定義一個res變量來接收從數據寄存器的一個字節,然后此時USART_RX_STA為0,與0X8000進行&運算,結果為0,則未接受到,接著繼續進行判斷,0X4000進行與運算,看是否為0,也是判斷是否接受道路0X0D,如果沒有接受到,則將這個res變量存放在數組里面,此時的USART_RX_STA為 0 與0X3fff進行&運算,大家算算會發現,因為他的前14位是數據位,所以你會發現第一個變量就會存放在BUF[0]里面,大概邏輯是這樣的: 所以每個字節都會被存放到具體的數組位上 。 if(USART_RX_STA》(USART_REC_LEN-1))USART_RX_STA=0;//接收數據錯誤,重新開始接收 當數組越界的時候,則會重新開始。 接下來就會一直循環,當數據位存滿后,接下來res里面接受的就是0X0D,先和上面一樣判斷USART_RX_STA是否接受到了0X0A和0X0D。 接著執行:

if(res==0x0d)USART_RX_STA|=0x4000; 將USART_RX_STA的第十五位變為1,,接下來進行下一次循環,這一次res接受到的值為0X0A, 然后進行判斷進入到

if(USART_RX_STA&0x4000)//接收到了0x0d

{

if(res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始

else USART_RX_STA|=0x8000; //接收完成了

} 所以執行USART_RX_STA|=0x8000,使得USART_RX_STA的第十六位變為1。 接下來看主函數部分:

int main(void)

{

u8 t;

u8 len;

u16 times=0;

Stm32_Clock_Init(9); //系統時鐘設置

delay_init(72); //延時初始化

uart_init(72,9600); //串口初始化為9600

LED_Init(); //初始化與LED連接的硬件接口

while(1)

{

if(USART_RX_STA&0x8000)

{

len=USART_RX_STA&0x3fff;//得到此次接收到的數據長度

printf(“

您發送的消息為:

”);

for(t=0;t《len;t++)

{

USART1-》DR=USART_RX_BUF[t];

while((USART1-》SR&0X40)==0);//等待發送結束

}

printf(“

”);//插入換行

USART_RX_STA=0;

}else

{

times++;

if(times%5000==0)

{

printf(“

ALIENTEK MiniSTM32開發板 串口實驗

”);

printf(“正點原子@ALIENTEK

”);

}

if(times%200==0)printf(“請輸入數據,以回車鍵結束

”);

if(times%30==0)LED0=!LED0;//閃爍LED,提示系統正在運行。

delay_ms(10);

} }

} if(USART_RX_STA&0x8000) 判斷是否接收到了0X0A len=USART_RX_STA&0x3fff;舉個簡單的例子此時USART_RX_STA為1100000000000011和0X3fff進行&運算,得到的結果是3,自然就表示了當前數組的大小。 最后階段,重點理解以下兩行代碼:

USART1-》DR=USART_RX_BUF[t];

while((USART1-》SR&0X40)==0);//等待發送結束 分析如下:將每個組內的信息存入到數據寄存器,此時數據寄存器將數據給TDR,發送信息的時候,是一位一位發送的,每一數據幀都有起始位,數據位,以及停止位,當檢測到數據寄存器的細信息發送完了(完全給了TDR),此時狀態寄存器的TXE便變為1,當檢測到TXE為1后,TC也會變為1(系統自動進行)。所以第二行才會檢測這個狀態寄存器的第6位是否為1來判斷是否發送成功了這個字節。 由此推出,直接判斷TXE也可以判斷發送是否完成 所以代碼可以改為:

for(t=0;t《len;t++)

{

USART1-》DR=USART_RX_BUF[t];

while((USART1-》SR&0X80)==0);//等待發送結束

編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5357

    瀏覽量

    120675
  • STM32
    +關注

    關注

    2270

    文章

    10910

    瀏覽量

    356592
  • 編程
    +關注

    關注

    88

    文章

    3628

    瀏覽量

    93812
  • 串口
    +關注

    關注

    14

    文章

    1555

    瀏覽量

    76668
  • USART
    +關注

    關注

    1

    文章

    195

    瀏覽量

    30898
收藏 人收藏

    評論

    相關推薦

    ALIENTEK_MINISTM32_實驗3_串口實驗

    ALIENTEK MINISTM32 實驗3 串口實驗,很好的資料,快來學習吧
    發表于 02-18 14:58 ?9次下載

    如何通過STM32串口實現簡易脫機編程

    如何通過STM32串口實現簡易脫機編程器如何通過STM32串口實現簡易脫機編程器如何通過
    發表于 04-25 09:38 ?60次下載

    STM32學習心得三十三:FLASH閃存編程原理與實驗

    記錄一下,方便以后翻閱~主要內容:1) STM32 Flash操作介紹;2) 寄存器和庫函數介紹;3) 相關實驗代碼解讀。參考資料:《STM32F10xxx閃存編程參考手冊》
    發表于 11-26 17:51 ?27次下載
    <b class='flag-5'>STM32</b>學習心得三十三:FLASH閃存<b class='flag-5'>編程</b>原理與<b class='flag-5'>實驗</b>

    STM32串口通訊

    :KEIL5 MDK③ 實驗所用串口:USART1硬件原理圖:這里 CH340G芯片 的作用是將電腦的USB電平轉換為串口的TTL電平。2、實驗要求
    發表于 12-06 20:21 ?13次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>通訊

    基于 MDK 創建 STM32編程序:串口輸出 Hello world

    ” 到串口的程序實驗工具——硬件:1、野火 stm32 指南者開發板2、ST-LINK V2 STM8/STM32仿真器編程器——軟件:1
    發表于 12-06 20:36 ?12次下載
    基于 MDK 創建 <b class='flag-5'>STM32</b> 匯<b class='flag-5'>編程</b>序:<b class='flag-5'>串口</b>輸出 Hello world

    Stm32串口通信基礎實驗

    目錄二、stm32串口通信二級目錄三級目錄二、stm32串口通信1.本次實驗使用的是stm32f
    發表于 12-07 09:36 ?32次下載
    <b class='flag-5'>Stm32</b><b class='flag-5'>串口</b>通信基礎<b class='flag-5'>實驗</b>

    初步了解STM32串口通訊

    STM32串口通訊一、基于寄存器與基于固件庫的編程方式的差異二、stm32串口通信實戰1、燒錄代碼的方式2、代碼及效果圖三、C語言程序里全局
    發表于 12-07 09:51 ?13次下載
    初步了解<b class='flag-5'>STM32</b><b class='flag-5'>串口</b>通訊

    基于 MDK 創建 STM32編程序:串口輸出 Hello world

    ” 到串口的程序實驗工具——硬件:1、野火 stm32 指南者開發板2、ST-LINK V2 STM8/STM32仿真器編程器——軟件:1
    發表于 12-07 11:06 ?8次下載
    基于 MDK 創建 <b class='flag-5'>STM32</b> 匯<b class='flag-5'>編程</b>序:<b class='flag-5'>串口</b>輸出 Hello world

    STM32串口配置實驗

    STM32 串口簡介串口作為 MCU 的重要外部接口,同時也是軟件開發重要的調試手段,其重要性不言而喻。現在基本上所有的 MCU 都會帶有串口ST
    發表于 12-08 12:21 ?11次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>配置<b class='flag-5'>實驗</b>

    STM32】基于cubemx+HAL庫的串口實驗(一)

    stm32串口實驗一、實驗前準備二、具體項目代碼項目1:printf重定向實驗,輪詢方式通信重定向:輪詢方式:中斷方式:項目2:中斷方式的串口
    發表于 12-09 13:06 ?3次下載
    【<b class='flag-5'>STM32</b>】基于cubemx+HAL庫的<b class='flag-5'>串口實驗</b>(一)

    基于 MDK 創建 STM32編程序:串口輸出 Hello world

    ” 到串口的程序實驗工具——硬件:1、野火 stm32 指南者開發板2、ST-LINK V2 STM8/STM32仿真器編程器——軟件:1
    發表于 12-16 16:58 ?13次下載
    基于 MDK 創建 <b class='flag-5'>STM32</b> 匯<b class='flag-5'>編程</b>序:<b class='flag-5'>串口</b>輸出 Hello world

    STM32 串口通信實驗

    stm32串口通信實驗UART通信實驗(通用異步收發器)UART串口通信原理:UART的通信過程實驗
    發表于 12-20 19:26 ?15次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>串口</b>通信<b class='flag-5'>實驗</b>

    STM32USART實驗——串口通訊

    STM32USART實驗——串口通訊一、串口通訊二、USART串口通信實例三、效果演示四、參考資料一、
    發表于 12-24 18:45 ?15次下載
    <b class='flag-5'>STM32</b>USART<b class='flag-5'>實驗</b>——<b class='flag-5'>串口</b>通訊

    STM32串口1通訊實驗程序下載

    STM32串口1通訊實驗程序下載
    發表于 12-30 10:34 ?84次下載

    STM32F407-雙串口實驗

    STM32F407-雙串口實驗,程序將串口1和串口2全部調通,可同時使用
    發表于 06-13 15:06 ?29次下載
    主站蜘蛛池模板: 暖暖视频在线观看高清...| 欧美 日韩 亚洲 在线| 手机看片国产免费| 国产精品伦理一二三区伦理| 性色无码AV久久蜜臀| 九九在线中文字幕无码| 最近中文字幕MV免费高清视频8| 男女免费观看在线爽爽爽视频| 波多野结衣 无码片| 吸奶舔下面| 老湿机一区午夜精品免费福利 | 亚洲精品午夜VA久久成人| 久久伊人男人的天堂网站| bbbbbxxxxx肥胖| 小箩莉奶水四溅小说| 久久婷五月综合色啪网| 成人免费在线观看| 亚洲深夜在线| 日韩精品人成在线播放| 好硬好湿好大再深一点动态图| 99久久99| 亚洲精品久久无码AV片银杏| 男女又黄又刺激B片免费网站| 国产69TV精品久久久久99| 一二三四在线播放免费观看中文版视频| 欧美人与禽ZOZO性伦交视频| 国产一区二区三区在线看片| 99久热这里精品免费| 亚洲国产精品无码中文字满| 欧美高清vivoesond在线播放| 国产无遮挡色视频免费观看性色| 97精品在线| 亚洲男同tv| 人曽交Z00Z0OA片| 久久精品久久久| 囯产精品一区二区三区线| 51精品国产AV无码久久久| 亚洲男人的天堂久久精品麻豆| 日韩一区二区三区射精| 美女诱惑性感揉胸| 黑色丝袜在线观看|