stm32寄存器——串口通信


void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到 USARTDIV
mantissa=temp;  //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分 
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能 PORTA 口时钟
RCC->APB2ENR|=1<<14; //使能串口时钟
GPIOA->CRH&=0XFFFFF00F;//IO 状态设置
GPIOA->CRH|=0X000008B0;//IO 状态设置
RCC->APB2RSTR|=1<<14; //复位串口 1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1 位停止,无校验位.
#if EN_USART1_RX  //如果使能了接收
//使能接收中断
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQn,2);//组 2,最低优先级
#endif
}

 这是uart 

#include "sys.h"
#include "usart.h"        
#include "delay.h"    
#include "led.h" 
#include "beep.h"      

int main(void)
{    
  u16 t;u16 len; u16 times=0;    
    Stm32_Clock_Init(9);     //系统时钟设置
    delay_init(72);            //延时初始化
    LED_Init();                   //初始化与LED连接的硬件接口
  uart_init (72,115200);
    while(1)
    {
      if(USART_RX_STA&0X8000)
        {
          len=USART_RX_STA&0X3FFF;
            printf("\r\n您发送的消息为:\r\n\r\n");
            for(t=0;t<len;t++)
            {
              USART1->DR=USART_RX_BUF[t];
                while(( USART1->SR&0X40)==0);
            }
            printf("\r\n\r\n");
          USART_RX_STA=0;
        }else
        {
         times++;
            if(times%5000==0)
            {
              printf("\r\n战舰STM32开发板串口实验\r\n");
                printf("正点原子@AL\r\n\r\n");
            }
            if(times%200==0)printf("请输入数据包,以回车键结束\r\n");
            if(times%30==0)LED0=!LED0;
            delay_ms(10);
        }
    }
}    

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM