WoodData大神发现了我寄存器版串口2程序的错误,改了以后果然好了。
原理图:
代码:
#include "sys.h"
#include "uart_loop.h"
/********************************************************************************************************
**函数信息 UartInit_Loop(void)
**功能描述 :初始化串口
**输入参数 :无
**输出参数 :无
********************************************************************************************************/
void UartInit_Loop(void)
{
//GPIO端口设置
RCC->AHBENR|=1<<17; //使能GPIOA口时钟
RCC->APB1ENR|=1<<17; //使能串口时钟
GPIOA->AFRL&=0x00ff;
GPIOA->AFRL|=0x1100; //
//UART 初始化设置
UART2->BRR = (SystemCoreClock / 16) /(115200);
UART2->FRA=(SystemCoreClock / 16) %(115200);
UART2->CCR|=0x30; //110000
UART2->GCR|=0x19; //11001;
UART2->GCR |= 0x0001; //使能串口2
GPIOA->CRL&=0XFFFF00FF;//IO状态设置
GPIOA->CRL|=0X00008B00;//IO状态设置
//printf("UART OK!\r\n");
}
/********************************************************************************************************
**函数信息 :uart_send(UART_TypeDef* UARTx,char c)
**功能描述 :串口发送字节
**输入参数 :UART_TypeDef* UARTx ,选择UART1、UART2、UART3
**输入参数 :char c ,串口发送的字节
**输出参数 :无
********************************************************************************************************/
void uart_send(char c)
{
UART2->TDR = c;
while(1)
{
if(UART2->ISR&0x1)
{
UART2->ICR = 0x1;
break;
}
}
}
/********************************************************************************************************
**函数信息 :unsigned char inbyte(UART_TypeDef* UARTx)
**功能描述 :串口接收函数
**输入参数 :UART_TypeDef* UARTx ,选择UART1、UART2、UART3
**输出参数 :unsigned char 串口接收返回的字节
********************************************************************************************************/
unsigned char inbyte(UART_TypeDef* UARTx)
{
unsigned char temp;
while(1)
{
if(UART2->ISR&0x2)
{
UART2->ICR = 0x2;
break;
}
}
temp = (uint8_t)UART2->RDR;
if(temp==0xd)//清除错误接收的数据
{
return 0;
}
return temp;
}
/********************************************************************************************************
**函数信息 :void Uart1RxTest(UART_TypeDef* UARTx)
**功能描述 :串口接收函数测试
**输入参数 :UART_TypeDef* UARTx ,选择UART1、UART2、UART3
**输出参数 :无
********************************************************************************************************/
void Uart2RxTest(UART_TypeDef* UARTx)
{
unsigned char temp;
temp = inbyte(UARTx);
if(temp!=0)
{
//printf("您输入的数据为:%c\r\n",temp);
uart_send(temp );
}
}
#include "delay.h"
#include "sys.h"
#include "uart.h"
#include "uart_loop.h"
/********************************************************************************************************
**函数信息 :int main (void)
**功能描述 :开机后,ARMLED闪动
**输入参数 :
**输出参数 :
********************************************************************************************************/
int main(void)
{
long int i;
UartInit_Loop(); //UART1的发送,可以通过串口软件打印UART OK
while(1) //无限循环
{
Uart2RxTest(UART2);//UART1的接收,在串口软件中输入字符,可以通过打印验证接收的数据是否正确
//uart_send(0x55);
//for(i=2000000;i>0;i--);
}
}
波特率不对关键在下面
#elif defined SYSCLK_HSI_48MHz
void SetSysClockTo48_HSI()
{
unsigned char temp=0;
RCC->CR|=RCC_CR_HSION;
while(!(RCC->CR&RCC_CR_HSIRDY));
//RCC->CFGR=RCC_CFGR_PPRE1_2; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
RCC->CFGR=((uint32_t)0x00000000); //APB1=DIV1;APB2=DIV1;AHB=DIV1; //改成这样就OK了。
RCC->CFGR&=~RCC_CFGR_PLLSRC; //PLLSRC ON
RCC->CR &=~(RCC_CR_PLLON); //清PLL// RCC->CR &=~(7<<20); //清PLL
RCC->CR &=~(0x1f<<26);
RCC->CR|=(4 - 1) << 26; //设置PLL值 2~16
FLASH->ACR=FLASH_ACR_LATENCY_1|FLASH_ACR_PRFTBE; //FLASH 1个延时周期
RCC->CR|=RCC_CR_PLLON; //PLLON
while(!(RCC->CR&RCC_CR_PLLRDY));//等待PLL锁定
RCC->CFGR&=~RCC_CFGR_SW;
RCC->CFGR|=RCC_CFGR_SW_PLL;//PLL作为系统时钟
while(temp!=0x02) //等待PLL作为系统时钟设置成功
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
}
#endif
用户手册部分:
效果图:
工程:
UART2_Reg.rar
(312.21 KB)
|