那曲檬骨新材料有限公司

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

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

3天內不再提示

STM32F407 串口配置步驟

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

介紹STM32F407串口配置步驟,完成串口的數據發送與接收、實現中斷接收,支持printf重定向。

STM32F407 串口配置說明

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

【1】串口硬件引腳分析

img

img

img

【2】串口復用引腳介紹

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

img

GPIO口復用功能引腳配置

img

img

F407串口對應的引腳

img

配置復用功能的寄存器

img

串口時鐘頻率配置分析

img

【3】串口1配置示例

Usart.c代碼示例:

#include "usart.h"
 ?
 /*
 函數功能:串口1初始化
 函數形參:
  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); //關閉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;  //使能發送
 USART1- >CR1|=1< 2;  //使能接收,并開始搜尋RX引腳上的起始位
 USART1- >CR1|=1< 13; //USART模塊使能。
 }
 ?
 ?
 /*
 函數功能:串口字符串發送
 函數形參:
 USART_TypeDef *USARTx :串口的類型 (USART1 USART2 USART3)
 u8 *str:將要發送的字符串
 */
 void USARTxSendString(USART_TypeDef *USARTx,u8 *str)
 {
 while(*str!='\\0')
 {
 USARTx- >DR=*str;
   while(!(USARTx- >SR&1< 7)){} //等待發送完成
 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,"萬邦易嵌嵌入式開發!\\r\\n");
  }
  
  if(USART1- >SR&1< 5) //接收到數據
  {
  c=USART1- >DR;
  USART1- >DR=c; //將接收到的數據原路返回
  }
 }
 }
 ?
 ?

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

Usart.c文件增加代碼:

#include "usart.h"
 ?
 /*
 函數功能:串口1初始化
 函數形參:
  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); //關閉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;  //使能發送
 #ifdef USART1_INTERRUPT
 USART1- >CR1|=1< 5;  //開啟串口接收中斷
 SetNVICPriorityGrouping(USART1_IRQn,1,3); //設置中斷優先級
 #endif
 USART1- >CR1|=1< 2;  //使能接收,并開始搜尋RX引腳上的起始位
 USART1- >CR1|=1< 13; //USART模塊使能。
 }
 ?
 ?
 /*
 函數功能:串口字符串發送
 函數形參:
 USART_TypeDef *USARTx :串口的類型 (USART1 USART2 USART3)
 u8 *str:將要發送的字符串
 */
 void USARTxSendString(USART_TypeDef *USARTx,u8 *str)
 {
 while(*str!='\\0')
 {
 USARTx- >DR=*str;
 while(!(USARTx- >SR&1< 7)){} //等待發送完成
 str++;
 }
 }
 ?
 ?
 /*
 函數功能:重寫printf底層函數接口
 */
 int fputc(int c,FILE *stream)
 {
   USART1- >DR=c; //發送一個字符
   while(!(USART1- >SR&1< 7)){}
 return c;
 }
 ?
 ?
 /*
 函數功能:重新scanf底層函數接口
 */
 int fgetc(FILE *stream) 
 {
   while(!(USART1- >SR&1< 5)){}
     return USART1- >DR;
 }
 ?
 ?
 /*
 函數功能:串口1的中斷服務函數
 */
 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("請輸入數據按回車鍵結束: (串口軟件需要勾選發送新行)\\r\\n");
 scanf("%s",buff);
 printf("你輸入的數據為:%s\\r\\n\\r\\n\\r\\n",buff);
 }
 }
 ?
 ?

第一步需要先編寫設置中斷優先級的函數:

sys.c代碼示例

#include "sys.h"
 /*
 函數功能:設置NVIC中斷控制器優先級
 函數形參:
 IRQn_Type IRQn:中斷線
 uint32_t PreemptPriority:搶占優先級
 uint32_t SubPriority:次優先級
 */
 void SetNVICPriorityGrouping(IRQn_Type IRQn,uint32_t PreemptPriority, uint32_t SubPriority)
 {
  uint32_t Priority;
  NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2); //設置優先級分組,每個工程只能設置一次
    Priority=NVIC_EncodePriority(NVIC_PriorityGroup_2,PreemptPriority,SubPriority); //編碼優先級
    NVIC_SetPriority(IRQn,Priority); //設置優先級
    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文件示例
審核編輯:湯梓紅

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

    關注

    18

    文章

    6072

    瀏覽量

    136431
  • 中斷
    +關注

    關注

    5

    文章

    900

    瀏覽量

    41755
  • 串口
    +關注

    關注

    14

    文章

    1558

    瀏覽量

    77052
  • STM32F407
    +關注

    關注

    15

    文章

    188

    瀏覽量

    29652
  • Printf
    +關注

    關注

    0

    文章

    83

    瀏覽量

    13732
收藏 人收藏

    評論

    相關推薦

    STM32F407 GPIO口輸入配置配置步驟

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

    STM32F407 位帶配置步驟

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

    STM32F407 外部中斷配置步驟

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

    stm32f407串口通信的代碼

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

    STM32F407串口采用DMA收發數據

    STM32F407串口采用DMA收發數據調試可用!
    發表于 06-17 16:00 ?60次下載

    STM32F407模板

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

    STM32F407 UCOS III實驗

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

    STM32CubeMX 配置STM32F407 實現HAL庫延時微妙方案

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

    STM32F407串口UART 基礎配置STM32CubeMX

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

    STM32F407STM32F105 CAN通訊失敗的定位解決

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

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

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

    STM32F407引腳資源總結

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

    STM32F407原理圖下載

    STM32F407原理圖下載
    發表于 01-17 13:44 ?425次下載

    STM32F407入門開發: 串口配置

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

    stm32f407原理圖

    stm32f407原理圖
    發表于 07-14 16:07 ?212次下載
    老牌百家乐官网娱乐城| 澳门百家乐官网765118118| 优博国际娱乐城| 大发888官方备用| 威尼斯人娱乐城博彩网站| 体球网比分| 大发8888娱乐城| 百家乐庄闲偏差有多大| 百家乐扑克桌布| 百家乐娱乐城公司| 百家乐官方网址| 百家乐试玩网站| 百家乐官网娱乐城体验金| 博狗百家乐官网的玩法技巧和规则| 百家乐官网赌博娱乐| 赌场百家乐官网试玩| 金宝博百家乐官网娱乐城| 百家乐官网高手论坮| 百家乐官网最低下注| 百家乐官网电子作弊器| 百家乐官网输了100万| 百家乐官网视频游戏网址| 在线百家乐官网大家赢| 帝豪百家乐官网利来| 百家乐官网娱乐城返水| 百家乐官网能赚大钱吗| 免佣百家乐官网赌场优势| 百家乐官网信息| 蓝盾百家乐官网赌场娱乐网规则| 凯斯百家乐官网的玩法技巧和规则| 天博百家乐官网娱乐城| 在线百家乐代理| 打百家乐官网纯打庄的方法| 蓝盾百家乐官网赌场娱乐网规则| 百家乐官网园天将| 澳门百家乐在线| 网络百家乐会输钱的多吗| 大发888 m摩卡游戏| 墨脱县| 六合彩百家乐官网有什么平码| 百家乐官网分|