zoukankan      html  css  js  c++  java
  • STM32串口1寄存器配置。

    寄存器配置比较难入门。

    void USART1_Init(u32 pclk2,u32 bound)  ////USART1使用PCLK2(最高72MHz),其它USART使用PCLK1(最高36MHz)

    float temp;
    u16 mantissa;
    u16 fraction;

    //--- 计算串口波特率--- 
    temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
    mantissa=temp; //得到整数部分
    fraction=(temp-mantissa)*16; //得到小数部分
    mantissa<<=4;
    mantissa+=fraction;

    //--- usart 1 串口 A9 T,A10 R ---
    RCC->APB2ENR|=1<<2;       //使能Port A端口时钟
    RCC->APB2ENR|=1<<14;     //使能串口1时钟
    GPIOA->CRH&=0XFFFFF00F;  //IO状态设置
    GPIOA->CRH|=0X000008B0;  //IO状态设置 A9推挽输出50MHz A10上拉输入

    RCC->APB2RSTR|=1<<14;  //复位串口1
    RCC->APB2RSTR&=~(1<<14);  //停止复位

    USART1->BRR=mantissa;  // 波特率设置
    USART1->CR1 |= 0X200C;  //无校验位.
    USART1->CR2 &= 0<<12;  //1位停止


    USART1->CR1 |= 1<<5;    //RXNE 接收缓冲区非空中断使能
    USART1->CR1 |= 1<<4;    //IDLE 空闲中断使能
    USART1->CR1 |= 1<<3;    //TE 使能发送
    USART1->CR1 |= 1<<2;    //RE 使能接收

    NVIC_Init_DMA(2,2,USART1_IRQn,2);//组2,最低优先级

    }

    //串口中断函数

    void USART1_IRQHandler(void) //串口1中断服务程序
    {
    if(USART1->SR&(1<<5)) //接收到数据
    {
    U1RxBuff[U1RxCounter++] = USART_ReceiveData(USART1);
    }
    else if(USART1->SR&(1<<4)) //空闲中断
    {
    USART1->SR;//先读SR
    USART1->DR;//再读DR
    //此处处理接收数据
    }
    }

    //中断优先级配置

    //NVIC_Group:NVIC分组 0~4 总共5组
    void NVIC_PriorityGroupConfig_DMA(u8 NVIC_Group)
    {
    u32 temp,temp1;
    temp1=(~NVIC_Group)&0x07;//取后三位
    temp1<<=8;
    temp=SCB->AIRCR; //读取先前的设置
    temp&=0X0000F8FF; //清空先前分组
    temp|=0X05FA0000; //写入钥匙
    temp|=temp1;
    SCB->AIRCR=temp; //设置分组
    }
    //-------------------- 设置NVIC --------------------
    //NVIC_PreemptionPriority:抢占优先级
    //NVIC_SubPriority :响应优先级
    //NVIC_Channel :中断编号
    //NVIC_Group :中断分组 0~4
    //注意优先级不能超过设定的组的范围!否则会有意想不到的错误
    //组划分:
    //组0:0位抢占优先级,4位响应优先级
    //组1:1位抢占优先级,3位响应优先级
    //组2:2位抢占优先级,2位响应优先级
    //组3:3位抢占优先级,1位响应优先级
    //组4:4位抢占优先级,0位响应优先级
    //NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先
    void NVIC_Init_DMA(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
    {
    u32 temp;
    NVIC_PriorityGroupConfig_DMA(NVIC_Group);//设置分组
    temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
    temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
    temp&=0xf;//取低四位
    if(NVIC_Channel<32)
    NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK)
    else NVIC->ISER[1]|=1<<(NVIC_Channel-32);
    NVIC->IP[NVIC_Channel]|=temp<<4;//设置响应优先级和抢断优先级
    }

  • 相关阅读:
    HDU 2098 分拆素数和 数论
    CodeForces The Endless River
    CodeForces Good Words
    CodeForces A or B Equals C
    HDU 1251 统计难题 字典树/STL
    CSUOJ 1555 Inversion Sequence 线段树/STL
    OpenJudge P4979 海贼王之伟大航路 DFS
    敌兵布阵 线段树
    HDU 4004 The Frog's Games 二分
    HDU 2578 Dating with girls(1) 二分
  • 原文地址:https://www.cnblogs.com/Gustavo-G/p/13334835.html
Copyright © 2011-2022 走看看