在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

詳解STM32F407VE中的串行總線功能

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

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

圖片

這樣,我們就知道串行總線所產生的高低電平時序了。其實除了正常數據傳輸所用到的Bit位之外,串行總線還有數據傳輸的控制標記位,通常有起始位、停止位和校驗位,但在我們實際使用串行總線時常常只使用一個起始位和一個停止位而不使用校驗位。于是,我們使用STM32的標準庫來完成串行總線的配置工作。首先來配置串口的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。我們將其主優先級設置為2,子優先級設置為0。接下來配置串口2的兩個信號線引腳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);

最后,配置串口的相關參數和中斷方式:

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的波特率設置為115200,并設置數據位為8Bit,一個停止位,無校驗位。并設置了接收和發送中斷。

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

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;
    }
  }
}

實際上,串口的發送和接收都是采用了void USART2_IRQHandler()串口2的中斷函數來完成的,當我們需要發送一個字節的數據時,調用void uart_write(uint8_t data)函數將data這個字節的數據存放到發送隊列(發送緩沖區)當中,并同時打開發送中斷。在發送中斷函數中從發送隊列當中取出需要發送的字節發送到串行總線上。

相反的,當接收總線上收到一個字節的數據時,就會產生一個接收中斷,void USART2_IRQHandler()接收中斷函數調用void uart_data_in(uint8_t data)函數將這個字節的數據存放到接收隊列(接收緩沖區)當中,而我們通過調用int uart_read(uint8_t* ch)函數來從接收隊列中讀取接收到的數據。

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

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++)
    {
    }
  }
}

我們使用上機的串口讀寫程序來得到STM32通過串口發送的數據:

圖片

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

圖片

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

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

    關注

    2270

    文章

    10915

    瀏覽量

    356751
  • 中斷
    +關注

    關注

    5

    文章

    900

    瀏覽量

    41590
  • 串口
    +關注

    關注

    14

    文章

    1557

    瀏覽量

    76731
  • 串行總線
    +關注

    關注

    1

    文章

    183

    瀏覽量

    30661
收藏 人收藏

    評論

    相關推薦

    STM32F407VE uart5發送數據給串口顯示屏,IO無法拉低怎么解決?

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

    stm32f405rgt6和stm32f407ve口4使用PA0跟PA1時,發送正常,接收不到數據,為什么?

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

    STM32F407VE使用Visual studio 2017 + VisualGDB 5.4版調試程序,運行時報錯的原因?

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

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

    stm32f407ZG的程序,能燒錄入stm32f407VE嗎,不考慮引腳數不同功能能等效嗎
    發表于 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...
    發表于 08-03 06:18

    STM32F407VE單片機通過FSMC驅動Ilitek ILI9325液晶屏的方法

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

    STM32F103RE或STM32F407VE復位引腳的接法

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

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

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

    基于STM32F407VE芯片的新建STUDIO工程編譯報錯大家幫忙看一下是什么問題

    新建了一個基于芯片的工程,芯片型號STM32F407VE,工程創建完成后即進行了構建,然后有就有了如下報錯,請大家幫忙看一下是什么問題,謝謝啦!
    發表于 09-16 15:26

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

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

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

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

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

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

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

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

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

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

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

    /1myogwFS687nCnsPEzU9ySQ筆者所用的單片機為:STM32F407VE程序沒有用STM32F4的SPI外設,而是直接用GPIO產生SPI時序。目前程序完成了:88W8801 WiFi模塊的...
    發表于 12-22 19:34 ?11次下載
    【程序】<b class='flag-5'>STM32F407VE</b>單片機通過SPI接口初始化88W8801 WiFi模塊并顯示CIS信息
    主站蜘蛛池模板: 青娱乐伊人| 日本午夜大片a在线观看| 亚洲欧美视频在线播放| 一区二区不卡免费视频| 日本在线一区二区| 欧美一区亚洲二区| 最近最新视频中文字幕4| 中国一级特黄真人毛片| 亚洲精品久久久久影| 天堂免费观看| 欧美特级黄| 久久99精品久久久久久野外| 中文字幕一区二区三区不卡 | 五月六月婷婷| 色屋在线| 美女 免费 视频 黄的| 日韩免费观看一级毛片看看| 亚洲五月婷| 中文字幕一区二区三区不卡| 欧洲精品不卡1卡2卡三卡| 中文天堂最新版在线精品| 天堂视频在线观看| 快乐你懂的在线视频免费观看| 国产高清在线免费| 狠狠色噜噜狠狠狠狠奇米777 | 免费91视频| 日本亚洲在线| 一级黄色免费毛片| 依依成人精品无v国产| 四虎影院的网址| 四虎影院在线免费观看| 五月激情婷婷网| 女人张开腿让男人做爽爽| 日本三级免费观看| 精品一区二区视频| 亚洲va欧美va国产综合久久| 天天做天天玩天天爽天天| 国产深夜福利在线观看网站| 亚洲免费一| 四虎国产视频| 国产1区二区|