打印
[MM32软件]

【MM32 eMiniBoard测评报告】+ 7、串口2寄存器

[复制链接]
474|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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)

使用特权

评论回复
沙发
caizhiwei| | 2020-4-26 09:49 | 只看该作者
小辣椒,您好~
加油哦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:绿水本无忧因风皱面,青山原不老为雪白头。

553

主题

3530

帖子

19

粉丝