STM32_串口通信的配置

配置内容如下:

复用功能设置 UARTx TX RX
1、选引脚 电器特性
2、初始化引脚、串口属性
3、AFR(H/L)复用功能

以下为STM32F407ZGTG芯片,配置一个USART1串口通信。

配置代码如下:

void InitUart1()
{
	u32 pclk=84000000;//参考时钟源APB2-84MHZ
	unsigned int ma=0;//整数
	unsigned int fa=0;//小数
	float div=0;//分频系数
	
    /*
     *配置GPIO口
     */
	RCC->AHB1ENR|=1<<0;//使能GPIOA
	//模式-配置PA9,10管脚 10
	GPIOA->MODER &=~(0xf<<18);//清零
	GPIOA->MODER |=0XA<<18;//1010-复用mode
	//类型-推挽 0
	GPIOA->OTYPER &=~(3<<9);
	//速度-100MHZ 11
	GPIOA->OSPEEDR |=0xf<<18;
	//上下拉-无 0
	GPIOA->PUPDR &=~(0xf<<18);
	//复用-AF7 AF[0]-AFRL AF[1]-AFRH
	GPIOA->AFR[1] &=~(0Xff<<4);//清零
	GPIOA->AFR[1] |=(0X77<<4);
	
   /*
    *UART1设置
    */
	RCC->APB2ENR |=1<<4;//使能串口1
	div=(float)(pclk)/(float)(16*9600);
	ma=(unsigned int)div;
	fa=(unsigned int)((div-ma)*16);
	//tmp=0xf; 	fa=fa&tmp;
	ma=ma<<4;
	ma=ma+fa;
	USART1->BRR=ma;//设置波特率
	//串口属性设置
	USART1->CR1 &=~(1<<15);//设置OVER8=0 16倍采样
	USART1->CR1 |=1<<3;//串口发送使能
	USART1->CR1 |=1<<2;//串口接收使能
	USART1->CR1 &=~(1<<12);//8位数据
	USART1->CR1 &=~(1<<10);//禁止奇偶校验
	USART1->CR2 &=~(3<<12);//一个停止位
	
	USART1->CR1 |=1<<13;//串口使能	
}

波特率寄存器手册:

 串口发送/接收数据:

//发送一个字符
void uart1_send_char(u8 ch)
{
	while((USART1->SR&0x40)==0)
	{
	}
	USART1->DR =(u8)ch;	
}
//发送一个字符串
void send_string(u8 *p)
{
	while(*p!='\0')
	{
		uart1_send_char(*p);
		p++;
	}
}
//接收数据
u8 uart1_rec(u8* pc)
{
	if(USART1->SR&(1<<5))//接收到数据
	{
		*pc=USART1->DR;
		return 0;
	}
	else{
		return 1;
	}
}

以下再多配置一个USART3:

#include "sys.h"
#include "MyUART3.h"
void InitUart3()
{
	u32 pclk=42000000;//参考时钟源APB1-42MHZ
	unsigned int ma=0;//整数
	unsigned int fa=0;//小数
	float div=0;//分频系数
	
	RCC->AHB1ENR|=1<<3;//使能GPIOD
	//模式-配置PD8,9管脚 10
	GPIOD->MODER &=~(0xf<<16);//清零
	GPIOD->MODER |=0XA<<16;//1010-复用mode
	//类型-推挽 0
	GPIOD->OTYPER &=~(3<<8);
	//速度-100MHZ 11
	GPIOD->OSPEEDR |=0xf<<16;
	//上下拉-无 0
	GPIOD->PUPDR &=~(0xf<<16);
	//复用-AF7
	GPIOD->AFR[1] &=~(0Xff<<0);
	GPIOD->AFR[1] |=(0X77<<0);
	
	//UART3设置
	RCC->APB1ENR |=1<<18;//使能串口1
	div=(float)(pclk)/(float)(16*9600);
	ma=(unsigned int)div;
	fa=(unsigned int)((div-ma)*16);
	//tmp=0xf; 	fa=fa&tmp;
	ma=ma<<4;
	ma=ma+fa;
	USART3->BRR=ma;
	//串口属性设置
	USART3->CR1 &=~(1<<15);//设置OVER8=0 16倍采样
	USART3->CR1 |=1<<3;//串口发送使能
	USART3->CR1 |=1<<2;//串口接收使能
	USART3->CR1 &=~(1<<12);//8位数据
	USART3->CR1 &=~(1<<10);//禁止奇偶校验
	USART3->CR2 &=~(3<<12);//一个停止位
	
	USART3->CR1 |=1<<13;//串口使能	
}

主函数调用:

main()
{
    while(1)
    {    
        u8 s=0;
        if(uart3_rec(&s)==0)//等待接收数据
	    {
	    	uart3_send_char(s);//发送数据
	    }
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值