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); } } }
