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