串口通訊實驗
結果:沒完成
main.c
#include "uart4.h"
char Str;
int main()
{//串口通信初始化hal_uart_init();while(1){// hal_delayms(1000);// Str = hal_get_char();// if(Str){// hal_put_char(Str+1);// }}return 0;
}
uart4.c
#include "uart4.h"
void hal_delayms(int ms)
{int i,j;for(i=0;i<ms;i++){for(j=0;j<2000;j++);}
}
void hal_uart_init()
{/*****RCC初始化*********///AHB4總線使能GPIOB[1]、GPIOG寄存器[6]RCC->MP_AHB4ENSETR |= (1<<1);RCC->MP_AHB4ENSETR |= (1<<6);//APB1總線使能USART4寄存器[16]RCC->MP_APB1ENSETR |= (1<<16);/*****UART初始化********///PRESC 不分頻 [3:0]=0000USART4->PRESC &= 0<<3;//BRR 規定波特率 16倍采樣率 64M 115200USART4->BRR=0X22B;//64000000/115200//CR1//設置M[1:0]='00'位,分別為[28][12]位 規定數據位長度8位USART4->CR1 &= ~(1<<28);USART4->CR1 &= ~(1<<12);//采樣率設置 16位 [15]=0 (UE==0時設置)USART4->CR1 &= ~(1<<15);//無校驗位 [10]=0 (UE==0時設置)USART4->CR1 &= ~(1<<10);//設置TE位,在發送的一開始發送空閑幀 [3]=1//設置RE,檢測開始位 [2] = 1//設置UE位,使能USART 1 [0]=1USART4->CR1 |= 0x0D;//1101//CR2//規定停止位1位 [13:12]=00USART4->CR2 &= ~(0x3<<12);/*****GPIO初始化********///設置PB[2] RX PG[11]TX 為復用模式 10GPIOB->MODER &= ~(0x3<<4);GPIOB->MODER |= 1<<5;GPIOG->MODER &= ~(0x03<<22);GPIOG->MODER |= 1<<23;//配置寄存器為USART功能 AF8GPIOB->AFRL &= ~(0xf<<8);GPIOB->AFRL |= (0x8<<8);GPIOG->AFRH &= ~(0xf<<12);GPIOG->AFRH |= (0x3<<13);
}
void hal_put_char(char str){//判斷ISR[7]的值if((USART4->ISR & 0x00000080) ==0x00000080){//表示數據寄存器為空USART4->TDR=str;}//判斷ISR[6]的值if((USART4->ISR & 0x00000040) ==0x00000040){//一次數據發送完成}
}
char hal_get_char(){//判斷ISR[5]的值if((USART4->ISR & 0x00000020) == 0x00000020){//表明收到數據return USART4->RDR;}return 0;
}
uart4.h
#ifndef __LED_H__
#define __LED_H__
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
void hal_uart_init();//uart初始化
void hal_put_char(char str);//發送一個字符
void hal_put_string(char *string);//發送一個字符串
char hal_get_char();//接受一個字符
char hal_get_string();//接受一個字符串
void hal_delayms(int ms);
#endif