配置内容如下:
复用功能设置 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);//发送数据
}
}
}