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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解STM32F407VE中的串行總線功能

CHANBAEK ? 來源:編程外星人 ? 作者:怪蛙 ? 2023-07-27 16:04 ? 次閱讀

在這一節(jié)里我們來一起完成STM32F407VE中的串行總線功能。所謂串行總線就是我們常常說的串口。串口中的信號線(數(shù)據(jù)線)只有2條,一條線為Tx,另一條為Rx,也就是發(fā)送線和接收線。所以稱它為串行,就是通過一根信號線的產(chǎn)生一個(gè)序列的高低電平來完成數(shù)字信號中一個(gè)字節(jié)的數(shù)據(jù)。例如:我們知道計(jì)算機(jī)中都是采用二進(jìn)制來表示數(shù)的,如果我們需要在串行總線上傳輸一個(gè)字節(jié)的數(shù)據(jù),如0x5A,那么這個(gè)字節(jié)的二進(jìn)制為:01011010,所以我們就需要讓串行總線產(chǎn)生的高低電平序列為:低、高、低、高、高、低、高、低,每一個(gè)高低電平,我們在計(jì)算機(jī)中稱之為Bit(比特):

圖片

這樣,我們就知道串行總線所產(chǎn)生的高低電平時(shí)序了。其實(shí)除了正常數(shù)據(jù)傳輸所用到的Bit位之外,串行總線還有數(shù)據(jù)傳輸?shù)目刂茦?biāo)記位,通常有起始位、停止位和校驗(yàn)位,但在我們實(shí)際使用串行總線時(shí)常常只使用一個(gè)起始位和一個(gè)停止位而不使用校驗(yàn)位。于是,我們使用STM32的標(biāo)準(zhǔn)庫來完成串行總線的配置工作。首先來配置串口的NVIC中斷:

NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

我們使用的是USART2,也就是串口2。我們將其主優(yōu)先級設(shè)置為2,子優(yōu)先級設(shè)置為0。接下來配置串口2的兩個(gè)信號線引腳PA2和PA3:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);


  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);

最后,配置串口的相關(guān)參數(shù)和中斷方式:

USART_InitTypeDef USART_InitStructure;
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART2- >CR1 |= (USART_CR1_RE | USART_CR1_TE);
  USART_Init(USART2, &USART_InitStructure);
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  USART_Cmd(USART2, ENABLE);

在這里,我們將串口2的波特率設(shè)置為115200,并設(shè)置數(shù)據(jù)位為8Bit,一個(gè)停止位,無校驗(yàn)位。并設(shè)置了接收和發(fā)送中斷。

這樣,我們就完成了串口2的配置工作,接下來我們需要完成兩個(gè)函數(shù),分別用于串口數(shù)據(jù)的發(fā)送和接收:

void uart_write(uint8_t data)
{
  int next_head = tx_head + 1;
  if (next_head >= tx_buff_size)
  {
    next_head = 0;
  }
  while (next_head == tx_foot)
  {
  }
  tx_buff[tx_head] = data;
  tx_head = next_head;
  USART2- >CR1 |= USART_FLAG_TXE;
}


int uart_read(uint8_t* ch)
{
  int foot = rx_foot;
  if (rx_head == foot)
  {
    return 0;
  }
  else
  {
    uint8_t data = rx_buff[foot];
    foot++;
    if (foot >= rx_buff_size)
    {
      foot = 0;
    }
    rx_foot = foot;
    *ch = data;
    return 1;
  }
}


void uart_data_in(uint8_t data)
{
  int next_head = rx_head + 1;
  if (next_head >= rx_buff_size)
  {
    next_head = 0;
  }


  if (next_head != rx_foot)
  {
    rx_buff[rx_head] = data;
    rx_head = next_head;
  }
  else
  {
    next_head++;
    next_head--;
  }
}


void USART2_IRQHandler(void)
{
  //UART1
  int foot = 0;
  uint8_t data = 0;


  if (USART2- >SR & USART_FLAG_RXNE)
  {
    data = USART2- >DR & 0x1FF;
    uart_data_in(data);
  }


  if (USART2- >SR & USART_FLAG_TXE)
  {
    foot = tx_foot;
    if (foot != tx_head)
    {
      USART2- >DR = tx_buff[foot];
      foot++;
      if (foot >= tx_buff_size)
      {
        foot = 0;
      }
      tx_foot = foot;
    }
    else
    {
      USART2- >CR1 &= ~USART_FLAG_TXE;
      USART2- >SR = ~USART_FLAG_TXE;
    }
  }
}

實(shí)際上,串口的發(fā)送和接收都是采用了void USART2_IRQHandler()串口2的中斷函數(shù)來完成的,當(dāng)我們需要發(fā)送一個(gè)字節(jié)的數(shù)據(jù)時(shí),調(diào)用void uart_write(uint8_t data)函數(shù)將data這個(gè)字節(jié)的數(shù)據(jù)存放到發(fā)送隊(duì)列(發(fā)送緩沖區(qū))當(dāng)中,并同時(shí)打開發(fā)送中斷。在發(fā)送中斷函數(shù)中從發(fā)送隊(duì)列當(dāng)中取出需要發(fā)送的字節(jié)發(fā)送到串行總線上。

相反的,當(dāng)接收總線上收到一個(gè)字節(jié)的數(shù)據(jù)時(shí),就會產(chǎn)生一個(gè)接收中斷,void USART2_IRQHandler()接收中斷函數(shù)調(diào)用void uart_data_in(uint8_t data)函數(shù)將這個(gè)字節(jié)的數(shù)據(jù)存放到接收隊(duì)列(接收緩沖區(qū))當(dāng)中,而我們通過調(diào)用int uart_read(uint8_t* ch)函數(shù)來從接收隊(duì)列中讀取接收到的數(shù)據(jù)。

于是,我們可以在main()函數(shù)中對串口2進(jìn)行初始化配置,并使用它來與上位機(jī)軟件進(jìn)行通信

int main(int argc, char* argv[])
{
  init_led();
  uart_init();


  char buff[100] = {0};


  while (1)
  {
    uart_write(0x5A);


    GPIO_WriteBit(GPIOE, GPIO_Pin_0, 1);
    GPIO_WriteBit(GPIOE, GPIO_Pin_1, 0);
    for (int i = 0; i < 500000; i++)
    {
    }
    GPIO_WriteBit(GPIOE, GPIO_Pin_0, 0);
    GPIO_WriteBit(GPIOE, GPIO_Pin_1, 1);
    for (int i = 0; i < 500000; i++)
    {
    }
  }
}

我們使用上機(jī)的串口讀寫程序來得到STM32通過串口發(fā)送的數(shù)據(jù):

圖片

我們可以使用邏輯分析儀來查看串行總線上每一個(gè)字節(jié)的傳輸方式:

圖片

我們可以看到串行總線上的Bit位序列為0 01011010 1 ,其中第一個(gè)0為起始位,最后一個(gè)1為停止位,而中間的01011010為8個(gè)Bit的數(shù)據(jù)位,轉(zhuǎn)成16進(jìn)制則是0x5A。這樣我們就完成了STM32F407VE的串行總線配置和數(shù)據(jù)發(fā)送,而數(shù)據(jù)接收與發(fā)送的原理是一樣的,我們不再贅述。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10906

    瀏覽量

    356484
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    899

    瀏覽量

    41540
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1555

    瀏覽量

    76632
  • 串行總線
    +關(guān)注

    關(guān)注

    1

    文章

    183

    瀏覽量

    30651
收藏 人收藏

    評論

    相關(guān)推薦

    STM32F407VE uart5發(fā)送數(shù)據(jù)給串口顯示屏,IO無法拉低怎么解決?

    STM32F407VE uart5發(fā)送數(shù)據(jù)給串口顯示屏,中間通過一個(gè)光耦隔離(型號:6N137),通過10歐上拉到+3.3V,IO配成推挽輸出,實(shí)測IO無法拉低,被鉗位到1.8V,我的理解是:串阻較小,應(yīng)該燒得是光耦發(fā)射管,MCU IO是推挽輸出,應(yīng)該可以拉到低電平,麻煩幫忙解釋下,感謝。
    發(fā)表于 03-25 08:13

    stm32f405rgt6和stm32f407ve口4使用PA0跟PA1時(shí),發(fā)送正常,接收不到數(shù)據(jù),為什么?

    使用過兩種芯片測試,stm32f405rgt6和stm32f407ve。 串口4使用PA0跟PA1時(shí),發(fā)送正常,接收不到數(shù)據(jù),寄存器上可看出無數(shù)據(jù),邏輯分析儀上能看出有數(shù)據(jù); 串口4使用PC10跟PC11時(shí),收發(fā)正常
    發(fā)表于 03-28 06:45

    STM32F407VE使用Visual studio 2017 + VisualGDB 5.4版調(diào)試程序,運(yùn)行時(shí)報(bào)錯的原因?

    STM32F407VE板子使用Visual studio 2017 + VisualGDB 5.4版調(diào)試程序 運(yùn)行到 void *p; sscanf(name, \":%p\"
    發(fā)表于 04-24 07:58

    stm32f407ZG的程序,能燒錄入stm32f407VE嗎,不考慮引腳數(shù)不同功能能等效嗎

    stm32f407ZG的程序,能燒錄入stm32f407VE嗎,不考慮引腳數(shù)不同功能能等效嗎
    發(fā)表于 05-17 18:39

    stm32f407ve軟件平臺

    硬件平臺: stm32f407ve軟件平臺: win10 (OS Name: Microsoft Windows 10 Enterprise OS Version: 10.0.18363 N/A Build 18363)Keil5 5.26.2...
    發(fā)表于 08-03 06:18

    STM32F407VE單片機(jī)通過FSMC驅(qū)動Ilitek ILI9325液晶屏的方法

    本程序使用的單片機(jī)為STM32F407VE,晶振大小為8MHz,用10厘米長的杜邦線和彩屏相連,彩屏為微雪(Waveshare)的3.2inch 320x240 ILI9325 Touch LCD
    發(fā)表于 12-03 07:03

    STM32F103RE或STM32F407VE復(fù)位引腳的接法

    本程序所用的單片機(jī)型號為:STM32F103RE或STM32F407VE復(fù)位引腳(PDN)應(yīng)連接到STM32F1的PA15引腳或STM32F4的PD14引腳。不連接PDN引腳將導(dǎo)致固件
    發(fā)表于 12-10 06:21

    怎樣去解決PLATFORMIO STM32F407VE工程卡死在啟動文件的問題呢

    解決PLATFORMIO STM32F407VE工程卡死在啟動文件的問題由于工作原因,需要在linux平臺做固件開發(fā),因此在查詢了一些資料后,選擇了vscode+platformio的方式來搭建
    發(fā)表于 01-24 07:20

    基于STM32F407VE芯片的新建STUDIO工程編譯報(bào)錯大家?guī)兔匆幌率鞘裁磫栴}

    新建了一個(gè)基于芯片的工程,芯片型號STM32F407VE,工程創(chuàng)建完成后即進(jìn)行了構(gòu)建,然后有就有了如下報(bào)錯,請大家?guī)兔匆幌率鞘裁磫栴},謝謝啦!
    發(fā)表于 09-16 15:26

    STM32F103RE和STM32F407VE單片機(jī)用lwip 2.1.2驅(qū)動88W8801 WiFi模塊,如何提高TCP和UDP的傳輸速率

    STM32F103RE和STM32F407VE單片機(jī)用lwip 2.1.2驅(qū)動88W8801 WiFi模塊,如何提高TCP和UDP的傳輸速率
    發(fā)表于 11-23 17:51 ?4次下載
    <b class='flag-5'>STM32F</b>103RE和<b class='flag-5'>STM32F407VE</b>單片機(jī)用lwip 2.1.2驅(qū)動88W8801 WiFi模塊,如何提高TCP和UDP的傳輸速率

    【程序】STM32F407VE單片機(jī)通過FSMC驅(qū)動Ilitek ILI9325液晶屏以及XPT2046觸控芯片

    【程序】STM32F407VE單片機(jī)通過FSMC驅(qū)動Ilitek ILI9325液晶屏以及XPT2046觸控芯片
    發(fā)表于 11-23 17:51 ?19次下載
    【程序】<b class='flag-5'>STM32F407VE</b>單片機(jī)通過FSMC驅(qū)動Ilitek ILI9325液晶屏以及XPT2046觸控芯片

    STM32F407開發(fā)板用戶手冊】第13章 STM32F407啟動過程詳解

    STM32F407開發(fā)板用戶手冊】第13章 STM32F407啟動過程詳解
    發(fā)表于 11-23 18:06 ?73次下載
    【<b class='flag-5'>STM32F407</b>開發(fā)板用戶手冊】第13章 <b class='flag-5'>STM32F407</b>啟動過程<b class='flag-5'>詳解</b>

    解決PLATFORMIO STM32F407VE工程卡死在啟動文件的問題

    解決PLATFORMIO STM32F407VE工程卡死在啟動文件的問題由于工作原因,需要在linux平臺做固件開發(fā),因此在查詢了一些資料后,選擇了vscode+platformio的方式來搭建
    發(fā)表于 11-29 14:21 ?8次下載
    解決PLATFORMIO <b class='flag-5'>STM32F407VE</b>工程卡死在啟動文件的問題

    Micropython之二--基于F407VE Black F407VE的移植編譯

    Micropython之開篇–基于F407VE Black F407VE的移植開篇先寫點(diǎn)什么,嵌入式有關(guān)的網(wǎng)上比較熱的幾個(gè)項(xiàng)目:Arduino,Micropython,樹莓派,OpenMV,等等
    發(fā)表于 11-30 18:21 ?17次下載
    Micropython之二--基于<b class='flag-5'>F407VE</b> Black <b class='flag-5'>F407VE</b>的移植編譯

    【程序】STM32F407VE單片機(jī)通過SPI接口初始化88W8801 WiFi模塊并顯示CIS信息

    /1myogwFS687nCnsPEzU9ySQ筆者所用的單片機(jī)為:STM32F407VE程序沒有用STM32F4的SPI外設(shè),而是直接用GPIO產(chǎn)生SPI時(shí)序。目前程序完成了:88W8801 WiFi模塊的...
    發(fā)表于 12-22 19:34 ?11次下載
    【程序】<b class='flag-5'>STM32F407VE</b>單片機(jī)通過SPI接口初始化88W8801 WiFi模塊并顯示CIS信息
    主站蜘蛛池模板: 91久久精品国产亚洲| 超碰在线观看| 亚洲午夜精品A片久久WWW解说| 性吧 校园春色| 亚洲国产成人久久一区www妖精| 亚洲精品www久久久久久久软件| 野花韩国免费高清电影| 伊人色综合久久天天网| 91avcom| xxxxx69hd杨幂| 国产福利视频一区二区| 国产免费久久爱久久啪| 黄色软件色多多| 老鸭窝毛片| 青草影院天堂男人久久| 色橹橹欧美在线观看视频高清| 校花被扒衣吸乳羞羞漫画| 野花香在线观看免费观看大全动漫 | 亚洲 欧美 国产在线视频| 一本道高清码v京东热| 最新国产三级在线不卡视频| YY6080A旧里番在线观看| 国产精品久久大陆| 久久精品国产在热亚洲完整版| 免费。色婬网站| 色爱AV综合区| 亚洲片在线观看| 99视频全部看免费观| 国产精品久久久久成人免费| 精品人伦一区二区三区潘金莲 | 99久久精品国产高清一区二区| 草莓视频免费看| 国产三级精品三级在线观看| 老熟人老女人国产老太| 三级黄色在线| 伊人久久大香线蕉观看| 八妻子秋霞理在线播放| 好男人的视频在线观看| 欧美日韩视频一区二区三区| 亚洲 日韩 色 图网站| 99RE6这里只有精品国产AV|