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

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

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

STM32F407 串口配置步驟

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-07-06 14:29 ? 次閱讀

介紹STM32F407串口配置步驟,完成串口的數(shù)據(jù)發(fā)送與接收、實現(xiàn)中斷接收,支持printf重定向。

STM32F407 串口配置說明

STM32F4 的串口資源相當豐富的,功能也相當強勁,STM32F407ZGT6 最多可提供 6 路串口,有分數(shù)波特率發(fā)生器、支持同步單線通信和半雙工單線通訊、支持 LIN、 支持調(diào)制解調(diào)器操作、 智能卡協(xié)議和 IrDA SIR ENDEC 規(guī)范、具有 DMA 等。

【1】串口硬件引腳分析

img

img

img

【2】串口復用引腳介紹

串口寄存器介紹在手冊第26章

img

GPIO口復用功能引腳配置

img

img

F407串口對應的引腳

img

配置復用功能的寄存器

img

串口時鐘頻率配置分析

img

【3】串口1配置示例

Usart.c代碼示例:

#include "usart.h"
 ?
 /*
 函數(shù)功能:串口1初始化
 函數(shù)形參:
  u32 clock   :時鐘頻率(默認*1000000HZ)  注意:APB1最大時鐘頻率為42MHZ  APB2最大時鐘頻率為84MHZ
  u32 baud :波特率
 硬件連接:
 PA9--- >TX
 PA10-- >RX
 */
 void USART1_Init(u32 clock,u32 baud)
 {
 /*1. 開時鐘*/
 RCC- >AHB1ENR|=1< 0;//使能PORTA時鐘
 RCC- >APB2ENR|=1< 4;//使能USART1時鐘
 
 /*2. 復位串口時鐘*/
 RCC- >APB2RSTR|=1< 4; //使能USART1復位時鐘
 RCC- >APB2RSTR&=~(1< 4); //關(guān)閉USART1復位時鐘
 
 /*3. 配置GPIO口模式*/
   GPIOA- >MODER&=~(0x3< 9*2); //清除模式
 GPIOA- >MODER|=0x2< 9*2;    //配置復用功能模式
 
 GPIOA- >MODER&=~(0x3< 10*2); //清除模式
 GPIOA- >MODER|=0x2< 10*2;    //配置復用功能模式
 
 GPIOA- >OTYPER&=~(0x1< 9);  //0表示推挽輸出
 
 GPIOA- >OSPEEDR&=~(0x3< 9*2); //清除之前配置
 GPIOA- >OSPEEDR|=0x2< 9*2;    //50MHZ輸出速度
 
 GPIOA- >PUPDR&=~(0x3< 10*2); //清除之前配置
 GPIOA- >PUPDR|=0x1< 10*2;    //配置上拉
 
 GPIOA- >AFR[1]&=~(0xF< 4*1); //清除PA9配置
 GPIOA- >AFR[1]|=0x7< 4*1;    //配置PA9復用功能模式為串口1
 
 GPIOA- >AFR[1]&=~(0xF< 4*2); //清除PA10配置
 GPIOA- >AFR[1]|=0x7< 4*2;    //配置PA10復用功能模式為串口1
 
 /*4. 配置USART-CR寄存器*/
 USART1- >BRR=(clock*1000000)/baud;//配置波特率
 USART1- >CR1|=1< 3;  //使能發(fā)送
 USART1- >CR1|=1< 2;  //使能接收,并開始搜尋RX引腳上的起始位
 USART1- >CR1|=1< 13; //USART模塊使能。
 }
 ?
 ?
 /*
 函數(shù)功能:串口字符串發(fā)送
 函數(shù)形參:
 USART_TypeDef *USARTx :串口的類型 (USART1 USART2 USART3)
 u8 *str:將要發(fā)送的字符串
 */
 void USARTxSendString(USART_TypeDef *USARTx,u8 *str)
 {
 while(*str!='\\0')
 {
 USARTx- >DR=*str;
   while(!(USARTx- >SR&1< 7)){} //等待發(fā)送完成
 str++;
 }
 }
 ?
 ?

Usart.h代碼示例

#ifndef USART_H
 #define USART_H
 #include "stm32f4xx.h"
 void USART1_Init(u32 clock,u32 baud);
 void USARTxSendString(USART_TypeDef *USARTx,u8 *str);
 #endif
 ?

Main.c代碼示例

#include "stm32f4xx.h" // Device header
 #include "led.h"
 #include "delay.h"
 #include "key.h"
 #include "usart.h"
 int main(void)
 {
 u8 key,i,c;
 LED_Init();
 KEY_Init();
 USART1_Init(84,115200);
 while(1)
 {
  key=ScanKeyVal(0);
  if(key)
  {
   i=!i;
 LED0(i);
   LED1(i);
 USARTxSendString(USART1,"萬邦易嵌嵌入式開發(fā)!\\r\\n");
  }
  
  if(USART1- >SR&1< 5) //接收到數(shù)據(jù)
  {
  c=USART1- >DR;
  USART1- >DR=c; //將接收到的數(shù)據(jù)原路返回
  }
 }
 }
 ?
 ?

【4】串口標準輸入輸出重定向

Usart.c文件增加代碼:

#include "usart.h"
 ?
 /*
 函數(shù)功能:串口1初始化
 函數(shù)形參:
  u32 clock   :時鐘頻率(默認*1000000HZ)  注意:APB1最大時鐘頻率為42MHZ  APB2最大時鐘頻率為84MHZ
  u32 baud :波特率
 硬件連接:
 PA9--- >TX
 PA10-- >RX
 */
 void USART1_Init(u32 clock,u32 baud)
 {
 /*1. 開時鐘*/
 RCC- >AHB1ENR|=1< 0;//使能PORTA時鐘
 RCC- >APB2ENR|=1< 4;//使能USART1時鐘
 
 /*2. 復位串口時鐘*/
 RCC- >APB2RSTR|=1< 4; //使能USART1復位時鐘
 RCC- >APB2RSTR&=~(1< 4); //關(guān)閉USART1復位時鐘
 
 /*3. 配置GPIO口模式*/
   GPIOA- >MODER&=~(0x3< 9*2); //清除模式
 GPIOA- >MODER|=0x2< 9*2;    //配置復用功能模式
 
 GPIOA- >MODER&=~(0x3< 10*2); //清除模式
 GPIOA- >MODER|=0x2< 10*2;    //配置復用功能模式
 
 GPIOA- >OTYPER&=~(0x1< 9);  //0表示推挽輸出
 
 GPIOA- >OSPEEDR&=~(0x3< 9*2); //清除之前配置
 GPIOA- >OSPEEDR|=0x2< 9*2;    //50MHZ輸出速度
 
 GPIOA- >PUPDR&=~(0x3< 10*2); //清除之前配置
 GPIOA- >PUPDR|=0x1< 10*2;    //配置上拉
 
 GPIOA- >AFR[1]&=~(0xF< 4*1); //清除PA9配置
 GPIOA- >AFR[1]|=0x7< 4*1;    //配置PA9復用功能模式為串口1
 
 GPIOA- >AFR[1]&=~(0xF< 4*2); //清除PA10配置
 GPIOA- >AFR[1]|=0x7< 4*2;    //配置PA10復用功能模式為串口1
 
 /*4. 配置USART-CR寄存器*/
 USART1- >BRR=(clock*1000000)/baud;//配置波特率
 USART1- >CR1|=1< 3;  //使能發(fā)送
 #ifdef USART1_INTERRUPT
 USART1- >CR1|=1< 5;  //開啟串口接收中斷
 SetNVICPriorityGrouping(USART1_IRQn,1,3); //設(shè)置中斷優(yōu)先級
 #endif
 USART1- >CR1|=1< 2;  //使能接收,并開始搜尋RX引腳上的起始位
 USART1- >CR1|=1< 13; //USART模塊使能。
 }
 ?
 ?
 /*
 函數(shù)功能:串口字符串發(fā)送
 函數(shù)形參:
 USART_TypeDef *USARTx :串口的類型 (USART1 USART2 USART3)
 u8 *str:將要發(fā)送的字符串
 */
 void USARTxSendString(USART_TypeDef *USARTx,u8 *str)
 {
 while(*str!='\\0')
 {
 USARTx- >DR=*str;
 while(!(USARTx- >SR&1< 7)){} //等待發(fā)送完成
 str++;
 }
 }
 ?
 ?
 /*
 函數(shù)功能:重寫printf底層函數(shù)接口
 */
 int fputc(int c,FILE *stream)
 {
   USART1- >DR=c; //發(fā)送一個字符
   while(!(USART1- >SR&1< 7)){}
 return c;
 }
 ?
 ?
 /*
 函數(shù)功能:重新scanf底層函數(shù)接口
 */
 int fgetc(FILE *stream) 
 {
   while(!(USART1- >SR&1< 5)){}
     return USART1- >DR;
 }
 ?
 ?
 /*
 函數(shù)功能:串口1的中斷服務函數(shù)
 */
 void USART1_IRQHandler(void)
 {
   u8 data;
 if(USART1- >SR&1< 5)
 {
  data=USART1- >DR;
    USART1- >DR=data;
 }
 }
 ?
 ?
 ?
 ?

img

Main.c代碼示例

#include "stm32f4xx.h" // Device header
 #include "led.h"
 #include "delay.h"
 #include "key.h"
 #include "usart.h"
 int main(void)
 {
 u8 i;
 u8 buff[100];
 LED_Init();
 KEY_Init();
 USART1_Init(84,115200);
 while(1)
 {
 i=!i;
 LED0(i);
 LED1(i);
 printf("STM32F407串口測試!\\r\\n");
 printf("請輸入數(shù)據(jù)按回車鍵結(jié)束: (串口軟件需要勾選發(fā)送新行)\\r\\n");
 scanf("%s",buff);
 printf("你輸入的數(shù)據(jù)為:%s\\r\\n\\r\\n\\r\\n",buff);
 }
 }
 ?
 ?

第一步需要先編寫設(shè)置中斷優(yōu)先級的函數(shù):

sys.c代碼示例

#include "sys.h"
 /*
 函數(shù)功能:設(shè)置NVIC中斷控制器優(yōu)先級
 函數(shù)形參:
 IRQn_Type IRQn:中斷線
 uint32_t PreemptPriority:搶占優(yōu)先級
 uint32_t SubPriority:次優(yōu)先級
 */
 void SetNVICPriorityGrouping(IRQn_Type IRQn,uint32_t PreemptPriority, uint32_t SubPriority)
 {
  uint32_t Priority;
  NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2); //設(shè)置優(yōu)先級分組,每個工程只能設(shè)置一次
    Priority=NVIC_EncodePriority(NVIC_PriorityGroup_2,PreemptPriority,SubPriority); //編碼優(yōu)先級
    NVIC_SetPriority(IRQn,Priority); //設(shè)置優(yōu)先級
    NVIC_EnableIRQ(IRQn);
 }
 ?
 ?

Sys.h文件代碼示例:

?
 #ifndef _SYS_H
 #define _SYS_H
 #include "stm32f4xx.h"
 /*中斷控制器分組*/
 #define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                             4 bits for subpriority */
 #define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                             3 bits for subpriority */
 #define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                             2 bits for subpriority */
 #define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                             1 bits for subpriority */
 #define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                             0 bits for subpriority */
 ?
 /**
 @code  
  The table below gives the allowed values of the pre-emption priority and subpriority according
  to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function
   ============================================================================================================================
     NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority  | Description
   ============================================================================================================================
    NVIC_PriorityGroup_0  |                0                  |            0-15             |   0 bits for pre-emption priority
                          |                                   |                             |   4 bits for subpriority
   ----------------------------------------------------------------------------------------------------------------------------
    NVIC_PriorityGroup_1  |                0-1                |            0-7              |   1 bits for pre-emption priority
                          |                                   |                             |   3 bits for subpriority
   ----------------------------------------------------------------------------------------------------------------------------    
    NVIC_PriorityGroup_2  |                0-3                |            0-3              |   2 bits for pre-emption priority
                          |                                   |                             |   2 bits for subpriority
   ----------------------------------------------------------------------------------------------------------------------------    
    NVIC_PriorityGroup_3  |                0-7                |            0-1              |   3 bits for pre-emption priority
                          |                                   |                             |   1 bits for subpriority
   ----------------------------------------------------------------------------------------------------------------------------    
    NVIC_PriorityGroup_4  |                0-15               |            0                |   4 bits for pre-emption priority
                          |                                   |                             |   0 bits for subpriority                       
   ============================================================================================================================
 @endcode
 */
 void SetNVICPriorityGrouping(IRQn_Type IRQn,uint32_t PreemptPriority, uint32_t SubPriority);
 #endif
 ?

Usart.c文件示例
審核編輯:湯梓紅

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

    關(guān)注

    18

    文章

    5949

    瀏覽量

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

    關(guān)注

    5

    文章

    895

    瀏覽量

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

    關(guān)注

    14

    文章

    1540

    瀏覽量

    76059
  • STM32F407
    +關(guān)注

    關(guān)注

    15

    文章

    187

    瀏覽量

    29330
  • Printf
    +關(guān)注

    關(guān)注

    0

    文章

    81

    瀏覽量

    13608
收藏 人收藏

    評論

    相關(guān)推薦

    STM32F407 GPIO口輸入配置配置步驟

    介紹STM32F407新建寄存器工程流程,介紹輸入模式的配置方式,以按鍵為例完成按鍵輸入檢測。
    的頭像 發(fā)表于 07-06 14:28 ?2064次閱讀
    <b class='flag-5'>STM32F407</b> GPIO口輸入<b class='flag-5'>配置</b><b class='flag-5'>配置</b><b class='flag-5'>步驟</b>

    STM32F407 位帶配置步驟

    介紹STM32F407位帶操作方法,設(shè)置寄存器的偏移量,實現(xiàn)按GPIO口指定位進行讀寫操作,方便編程。
    的頭像 發(fā)表于 07-06 14:30 ?1161次閱讀
    <b class='flag-5'>STM32F407</b> 位帶<b class='flag-5'>配置</b><b class='flag-5'>步驟</b>

    STM32F407 外部中斷配置步驟

    介紹STM32F407外部中斷配置步驟,以按鍵為例,實現(xiàn)外部中斷配置,使用按鍵觸發(fā)中斷進行LED燈控制。
    的頭像 發(fā)表于 07-06 14:31 ?1817次閱讀
    <b class='flag-5'>STM32F407</b> 外部中斷<b class='flag-5'>配置</b><b class='flag-5'>步驟</b>

    stm32f407串口通信的代碼

    stm32f407串口通信的代碼 原理圖還有封裝 很清楚自己畫的
    發(fā)表于 03-21 17:22 ?0次下載

    STM32F407串口采用DMA收發(fā)數(shù)據(jù)

    STM32F407串口采用DMA收發(fā)數(shù)據(jù)調(diào)試可用!
    發(fā)表于 06-17 16:00 ?58次下載

    STM32F407模板

    STM32F407模板,感興趣可以看看。
    發(fā)表于 07-25 18:52 ?131次下載

    STM32F407 UCOS III實驗

    STM32F407 UCOS III實驗,介紹基于STM32F407的UCOSIII實例,參考下
    發(fā)表于 09-22 14:08 ?81次下載

    STM32CubeMX 配置STM32F407 實現(xiàn)HAL庫延時微妙方案

    STM32CubeMX 配置STM32F407 實現(xiàn)HAL庫延時微妙方案
    發(fā)表于 11-24 20:51 ?20次下載
    <b class='flag-5'>STM32</b>CubeMX <b class='flag-5'>配置</b><b class='flag-5'>STM32F407</b> 實現(xiàn)HAL庫延時微妙方案

    STM32F407串口UART 基礎(chǔ)配置STM32CubeMX

    STM32F407串口UART 基礎(chǔ)配置STM32CubeMX
    發(fā)表于 11-29 16:06 ?54次下載
    <b class='flag-5'>STM32F407</b>的<b class='flag-5'>串口</b>UART 基礎(chǔ)<b class='flag-5'>配置</b><b class='flag-5'>STM32</b>CubeMX

    STM32F407STM32F105 CAN通訊失敗的定位解決

    STM32F407STM32F105的CAN通訊失敗問題,經(jīng)過一系列的測試分析,發(fā)現(xiàn)并解決問題,實現(xiàn)正常的CAN通訊。問題的現(xiàn)象STM32F407 板上安裝25MHz晶體,作為HSE時鐘,內(nèi)部
    發(fā)表于 12-02 16:51 ?18次下載
    <b class='flag-5'>STM32F407</b>與<b class='flag-5'>STM32F</b>105 CAN通訊失敗的定位解決

    STM32F407開發(fā)板用戶手冊】第21章 STM32F407的NVIC中斷分組和配置(重要)

    STM32F407開發(fā)板用戶手冊】第21章 STM32F407的NVIC中斷分組和配置(重要)
    發(fā)表于 12-04 13:51 ?21次下載
    【<b class='flag-5'>STM32F407</b>開發(fā)板用戶手冊】第21章 <b class='flag-5'>STM32F407</b>的NVIC中斷分組和<b class='flag-5'>配置</b>(重要)

    STM32F407引腳資源總結(jié)

    STM32F407引腳資源總結(jié)定時器 串口 ADC
    發(fā)表于 12-27 18:54 ?94次下載
    <b class='flag-5'>STM32F407</b>引腳資源總結(jié)

    STM32F407原理圖下載

    STM32F407原理圖下載
    發(fā)表于 01-17 13:44 ?419次下載

    STM32F407入門開發(fā): 串口配置

    STM32F407串口資源非常豐富,功能也很強勁。 STM32F407 最多可提供 6 路串口,有分數(shù)波特率發(fā)生器、支持同步單線通信和半雙工單線通訊、支持 LIN、 支持調(diào)制解調(diào)器
    的頭像 發(fā)表于 05-28 13:51 ?1.1w次閱讀
    <b class='flag-5'>STM32F407</b>入門開發(fā): <b class='flag-5'>串口</b><b class='flag-5'>配置</b>

    stm32f407原理圖

    stm32f407原理圖
    發(fā)表于 07-14 16:07 ?202次下載