• 方案介紹
    • 【1】串口硬件引腳分析
    • 【2】串口復用引腳介紹
    • 【3】串口1配置示例
    • 【4】串口標準輸入輸出重定向
  • 附件下載
  • 相關推薦
申請入駐 產(chǎn)業(yè)圖譜

STM32F407 串口配置步驟

03/29 08:42
1023
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

更多詳細資料請聯(lián)系.docx

共1個文件

介紹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); //關閉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!='?')
	{
			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ā)!rn");
			 }
			 
			 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); //關閉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); //設置中斷優(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!='?')
	{
		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串口測試!rn");
				printf("請輸入數(shù)據(jù)按回車鍵結束: (串口軟件需要勾選發(fā)送新行)rn");
				scanf("%s",buff);
				printf("你輸入的數(shù)據(jù)為:%srnrnrn",buff);
		}
}


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

sys.c代碼示例

#include "sys.h"
/*
函數(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); //設置優(yōu)先級分組,每個工程只能設置一次
   Priority=NVIC_EncodePriority(NVIC_PriorityGroup_2,PreemptPriority,SubPriority); //編碼優(yōu)先級
   NVIC_SetPriority(IRQn,Priority); //設置優(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文件示例

img

  • 更多詳細資料請聯(lián)系.docx
    下載

相關推薦