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

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

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

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

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-05-28 13:51 ? 次閱讀

第一章 串口硬件引腳分析

STM32F407 的串口資源非常豐富,功能也很強(qiáng)勁。 STM32F407 最多可提供 6 路串口,有分?jǐn)?shù)波特率發(fā)生器、支持同步單線通信和半雙工單線通訊、支持 LIN、 支持調(diào)制解調(diào)器操作、 智能卡協(xié)議和 IrDA SIR ENDEC 規(guī)范、具有 DMA收發(fā)功能等,具體詳細(xì)信息可以查看官方的數(shù)據(jù)手冊(cè)。

image.pngimage.pngimage.pngimage.png

第二章 串口復(fù)用引腳介紹

串口寄存器介紹在手冊(cè)第26章

image.png

GPIO口復(fù)用功能引腳配置

image.png

F407串口對(duì)應(yīng)的引腳

image.png

配置復(fù)用功能的寄存器

image.png

串口時(shí)鐘頻率配置分析

image.png

第三章 串口1配置示例

Usart.c代碼示例:


#include "usart.h"

/*
函數(shù)功能:串口1初始化
函數(shù)形參:
u32 clock   :時(shí)鐘頻率(默認(rèn)*1000000HZ)  注意:APB1最大時(shí)鐘頻率為42MHZ  APB2最大時(shí)鐘頻率為84MHZ
u32 baud :波特率
硬件連接:
PA9--->TX
PA10-->RX
*/
void USART1_Init(u32 clock,u32 baud)
{
	/*1. 開(kāi)時(shí)鐘*/
	RCC->AHB1ENR|=1<<0;			//使能PORTA時(shí)鐘
	RCC->APB2ENR|=1<<4;			//使能USART1時(shí)鐘

	/*2. 復(fù)位串口時(shí)鐘*/
	RCC->APB2RSTR|=1<<4; 		//使能USART1復(fù)位時(shí)鐘
	RCC->APB2RSTR&=~(1<<4); //關(guān)閉USART1復(fù)位時(shí)鐘

	/*3. 配置GPIO口模式*/
	GPIOA->MODER&=~(0x3<<9*2); //清除模式
	GPIOA->MODER|=0x2<<9*2;    //配置復(fù)用功能模式

	GPIOA->MODER&=~(0x3<<10*2); //清除模式
	GPIOA->MODER|=0x2<<10*2;    //配置復(fù)用功能模式

	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復(fù)用功能模式為串口1

	GPIOA->AFR[1]&=~(0xF<<4*2); //清除PA10配置
	GPIOA->AFR[1]|=0x7<<4*2;    //配置PA10復(fù)用功能模式為串口1

	/*4. 配置USART-CR寄存器*/
	USART1->BRR=(clock*1000000)/baud;//配置波特率
	USART1->CR1|=1<<3;  //使能發(fā)送
	USART1->CR1|=1<<2;  //使能接收,并開(kāi)始搜尋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!='?')
	{
	USARTx->DR=*str;
	while(!(USARTx->SR&1<<7)){} //等待發(fā)送完成
	str++;
	}
}

復(fù)制代碼

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

復(fù)制代碼

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,"嵌入式開(kāi)發(fā)!rn");
		 }
		 
		 if(USART1->SR&1<<5) //接收到數(shù)據(jù)
		 {
			 c=USART1->DR;
			 USART1->DR=c; 	//將接收到的數(shù)據(jù)原路返回
		 }
	}
}

復(fù)制代碼

第四章 串口標(biāo)準(zhǔn)輸入輸出重定向

Usart.c文件增加代碼:

/*
函數(shù)功能:重寫printf底層函數(shù)接口
*/
int fputc(int c,FILE *stream)
{
	  USART1->DR=c; //發(fā)送一個(gè)字符
	  while(!(USART1->SR&1<<7)){}
		return c;
}

/*
函數(shù)功能:重新scanf底層函數(shù)接口
*/
int fgetc(FILE *stream) 
{
	  while(!(USART1->SR&1<<5)){}
    return USART1->DR;
}

復(fù)制代碼

image.png

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串口測(cè)試!rn");
		printf("請(qǐng)輸入數(shù)據(jù)按回車鍵結(jié)束: (串口軟件需要勾選發(fā)送新行)rn");
		scanf("%s",buff);
		printf("你輸入的數(shù)據(jù)為:%srnrnrn",buff);
	}
}

復(fù)制代碼

第五章 配置串口中斷接收

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

sys.c代碼示例

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

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 */
void SetNVICPriorityGrouping(IRQn_Type IRQn,uint32_t PreemptPriority, uint32_t SubPriority);
#endif

復(fù)制代碼

Usart.c文件示例


#include "usart.h"

/*
函數(shù)功能:串口1初始化
函數(shù)形參:
 u32 clock   :時(shí)鐘頻率(默認(rèn)*1000000HZ)  注意:APB1最大時(shí)鐘頻率為42MHZ  APB2最大時(shí)鐘頻率為84MHZ
 u32 baud :波特率
硬件連接:
PA9--->TX
PA10-->RX
*/
void USART1_Init(u32 clock,u32 baud)
{
	/*1. 開(kāi)時(shí)鐘*/
	RCC->AHB1ENR|=1<<0;			//使能PORTA時(shí)鐘
	RCC->APB2ENR|=1<<4;			//使能USART1時(shí)鐘

	/*2. 復(fù)位串口時(shí)鐘*/
	RCC->APB2RSTR|=1<<4; 		//使能USART1復(fù)位時(shí)鐘
	RCC->APB2RSTR&=~(1<<4); //關(guān)閉USART1復(fù)位時(shí)鐘

	/*3. 配置GPIO口模式*/
	GPIOA->MODER&=~(0x3<<9*2); //清除模式
	GPIOA->MODER|=0x2<<9*2;    //配置復(fù)用功能模式

	GPIOA->MODER&=~(0x3<<10*2); //清除模式
	GPIOA->MODER|=0x2<<10*2;    //配置復(fù)用功能模式

	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復(fù)用功能模式為串口1

	GPIOA->AFR[1]&=~(0xF<<4*2); //清除PA10配置
	GPIOA->AFR[1]|=0x7<<4*2;    //配置PA10復(fù)用功能模式為串口1

	/*4. 配置USART-CR寄存器*/
	USART1->BRR=(clock*1000000)/baud;//配置波特率
	USART1->CR1|=1<<3;  //使能發(fā)送
	#ifdef USART1_INTERRUPT
	USART1->CR1|=1<<5;  //開(kāi)啟串口接收中斷
	SetNVICPriorityGrouping(USART1_IRQn,1,3); //設(shè)置中斷優(yōu)先級(jí)	
	#endif
	USART1->CR1|=1<<2;  //使能接收,并開(kāi)始搜尋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!='?')
	{
		USARTx->DR=*str;
		while(!(USARTx->SR&1<<7)){} //等待發(fā)送完成
		str++;
	}
}


/*
函數(shù)功能:重寫printf底層函數(shù)接口
*/
int fputc(int c,FILE *stream)
{
	USART1->DR=c; //發(fā)送一個(gè)字符
	while(!(USART1->SR&1<<7)){}
	return c;
}


/*
函數(shù)功能:重新scanf底層函數(shù)接口
*/
int fgetc(FILE *stream) 
{
	while(!(USART1->SR&1<<5)){}
	return USART1->DR;
}


/*
函數(shù)功能:串口1的中斷服務(wù)函數(shù)
*/
void USART1_IRQHandler(void)
{
	u8 data;
	if(USART1->SR&1<<5)
	{
		data=USART1->DR;
		USART1->DR=data;
	}
}

復(fù)制代碼
image.png

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

    關(guān)注

    31

    文章

    5343

    瀏覽量

    120348
  • STM32F407
    +關(guān)注

    關(guān)注

    15

    文章

    187

    瀏覽量

    29454
  • 串口配置
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    1630
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32F407 GPIO口輸入配置配置步驟

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

    STM32F407 串口配置步驟

    介紹STM32F407串口配置步驟,完成串口的數(shù)據(jù)發(fā)送與接收、實(shí)現(xiàn)中斷接收,支持printf重定向。
    的頭像 發(fā)表于 07-06 14:29 ?3136次閱讀
    <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 ?60次下載

    STM32F407 UCOS III實(shí)驗(yàn)

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

    STM32F407 開(kāi)發(fā)板原理圖

    STM32F407 開(kāi)發(fā)板原理圖
    發(fā)表于 09-22 16:12 ?393次下載
    <b class='flag-5'>STM32F407</b> <b class='flag-5'>開(kāi)發(fā)</b>板原理圖

    STM32F407開(kāi)發(fā)板用戶手冊(cè)】第13章 STM32F407啟動(dòng)過(guò)程詳解

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

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

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

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

    STM32F407串口UART 基礎(chǔ)配置STM32CubeMX
    發(fā)表于 11-29 16:06 ?55次下載
    <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

    STM32F407開(kāi)發(fā)板用戶手冊(cè)】第14章 STM32F407的電源,復(fù)位和時(shí)鐘系統(tǒng)

    STM32F407開(kāi)發(fā)板用戶手冊(cè)】第14章 STM32F407的電源,復(fù)位和時(shí)鐘系統(tǒng)
    發(fā)表于 12-02 16:21 ?42次下載
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>開(kāi)發(fā)</b>板用戶手冊(cè)】第14章 <b class='flag-5'>STM32F407</b>的電源,復(fù)位和時(shí)鐘系統(tǒng)

    STM32F407開(kāi)發(fā)板用戶手冊(cè)】第1章?? 初學(xué)STM32F407的準(zhǔn)備工作

    STM32F407開(kāi)發(fā)板用戶手冊(cè)】第1章?? 初學(xué)STM32F407的準(zhǔn)備工作
    發(fā)表于 12-04 13:36 ?75次下載
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>開(kāi)發(fā)</b>板用戶手冊(cè)】第1章?? 初學(xué)<b class='flag-5'>STM32F407</b>的準(zhǔn)備工作

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

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

    STM32F407開(kāi)發(fā)板用戶手冊(cè)】第19章 STM32F407的GPIO應(yīng)用之按鍵FIFO

    STM32F407開(kāi)發(fā)板用戶手冊(cè)】第19章 STM32F407的GPIO應(yīng)用之按鍵FIFO
    發(fā)表于 12-05 15:21 ?39次下載
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>開(kāi)發(fā)</b>板用戶手冊(cè)】第19章 <b class='flag-5'>STM32F407</b>的GPIO應(yīng)用之按鍵FIFO

    STM32F407入門開(kāi)發(fā): 位帶操作

    STM32F407的位帶操作可以實(shí)現(xiàn)類似51單片機(jī)中寄存器的操作方法,操作GPIO口代碼簡(jiǎn)潔方便。 關(guān)于位段的操作在Cortex-M3M4權(quán)威指南里有詳細(xì)描述:
    的頭像 發(fā)表于 05-28 13:50 ?3672次閱讀
    <b class='flag-5'>STM32F407</b><b class='flag-5'>入門開(kāi)發(fā)</b>: 位帶操作

    STM32F407 FreeRTOS開(kāi)發(fā)手冊(cè) V1.1

    STM32F407 FreeRTOS開(kāi)發(fā)手冊(cè)_V1.1PDF文件下載。
    發(fā)表于 07-31 11:16 ?52次下載