A7\M4核串口实验
1、分析電路圖
UART4_RX------>PB2
UART4_TX------>PG11
2、RCC章節分析
使能GPIOB和GPIOG控制器
RCC_MP_AHB4ENSETR[1] = 1------->使能GPIOB這一組控制器
RCC_MP_AHB4ENSETR[6] = 1------->使能GPIOG這一組控制器
3、GPIO章節分析
3.1分析GPIOx_MODER寄存器:設置PB2和PG11引腳為復用功能
GPIOB_MODER[5:4] = 10 ------->設置PB2引腳為復用功能
GPIOG_MODER[23:22] = 10 ------->設置PG11引腳為復用功能
3.2分析GPIOx_MODER寄存器:
GPIOB_AFRL[11:8] = 1000 ------->設置PB2引腳為復用功能UART4_Rx
GPIOG_AFRH[15:12] = 0110 ------->設置PG11引腳為復用功能UART4_Tx
4、UART章節
4.1分析USART_CR1寄存器
USART_CR1[28][12] = 00 ------->設置串口8位數據位
USART_CR1[15] = 0 ------->設置串口16倍采樣率,會影響波特率的計算
USART_CR1[10] = 0------->設置串口無奇偶校驗位
USART_CR1[3] = 1------->設置串口發送寄存器使能
USART_CR1[2] = 1------->設置串口接收寄存器使能
USART_CR1[0] = 1------->設置串口接收使能
4.2分析USART_CR2寄存器
設置串口1位停止位
4.3分析USART_BRR寄存器
設置串口波特率為115200bps,系統提供的串口時鐘源:64MHZ
BRR = 64MHZ / 115200 = 0x22b
USART4_BRR = 0x22b ------->設置串口波特率為115200
4.4分析USART_RDR寄存器:接收數據存放在接收數據寄存器中
4.5分析USART_TDR寄存器:發送數據存放在發送數據寄存器中
4.6分析USART_PRESC寄存器:設置串口不分頻
4.7分析USART_ISR寄存器:
USART_ISR[6]:判斷一幀數據是否發送完成,這位只可以讀
特點:如果發送數據完成之后,才可以發送下一幀數據
?讀0:發送數據沒有完成,需要等待
讀1:發送數據完成,可以發送下一幀數據
USART_ISR[5]:判斷接收數據寄存器是否有數據可讀,這位只可以讀
特點:接收數據寄存器有數據,才可以讀數據
讀0:沒有接收到數據,需要等待
讀1:接收到數據,可以讀這個數據
代碼演示
#include "uart4.h" //1.初始化函數 void uart4_init() {//rccRCC->MP_AHB4ENSETR |=(0x1 << 1);RCC->MP_AHB4ENSETR |=(0x1 << 6);RCC->MP_APB1ENSETR |=(0x1 << 16);//GPIOGPIOB->MODER &=(~(0x3 << 4));GPIOB->MODER |=(0x2 << 4);GPIOG->MODER &=(~(0x3 << 22));GPIOG->MODER |=(0x2 << 22);GPIOB->AFRL &=(~(0xf << 8));GPIOB->AFRL |=(0x8 << 8);GPIOG->AFRH &=(~(0xf << 12));GPIOG->AFRH |=(0x6 << 12);//UARTif(USART4->CR1 &(0x1 << 0)){//將UE位禁止USART4->CR1 &=(~(0x1 << 0));}//1.串口初始化 8位數據位 無奇偶校驗位USART4->CR1 &=(~(0x1 << 12));USART4->CR1 &=(~(0x1 << 28));USART4->CR1 &=(~(0x1 << 10));//2.設置串口一位停止位USART4->CR2 &=(~(0x3 << 12));//3.設置串口的16倍采樣率USART4->CR1 &=(~(0x1 << 15));//4.設置串口不分頻USART4->PRESC &=(~(0xf));//5.設置串口波特率115200USART4->BRR &=(~(0xffff << 0));USART4->BRR |=(0x22b << 0);//6.設置串口發送器使能USART4->CR1 |=(0x1 << 3);//7.設置串口接收器使能USART4->CR1 |=(0x1 << 2);//8.設置串口使能USART4->CR1 |=(0x1 << 0); } //2.發送一個字符 void put_char(const char str) {//1.判斷發送數據寄存器是否有數據 ISR[7]//讀0:發送數據寄存器滿,需要等待//讀1:發送數據寄存器為空while(!(USART4->ISR &(0x1 << 7)));//2.將要發送的字符寫入到發送數據寄存器中USART4->TDR &=(~(0xff));USART4->TDR =str;//3.判斷發送數據是否發送完成//讀0:發送數據沒有完成,等待//讀1:發送數據完成while(!(USART4->ISR &(0x1 << 6))); } //3.發送一個字符串 void put_string(const char* str) {//判斷是否為'\0'while(*str != '\0'){put_char(*str);str++;} //一個一個發送 } //4.接收一個字符 char get_char() {char ch;//1.判斷接收寄存器是否有數據可讀 ISR[5]//讀0:沒有數據可讀,需要等待//讀1:有數據可讀while(!(USART4->ISR & (0x1 << 5)));//2.將接收數據寄存器中內容讀出來ch=USART4->RDR;return ch; } char buf[50]={0}; //5.接收一個字符串 char* get_string() { put_char('\n');put_char('\r');int i=0;//1.循環進行接收while((buf[i] = get_char()) != '\r'){put_char(buf[i]);i++;}put_char('\n');put_char('\r');//2.循環實現:接收一個字符之后,發送一個字符//3.當鍵盤回車鍵按下之后代表字符串接收結束'\r'//4.字符串補'\0'buf[i]='\0';return buf; }總結
以上是生活随笔為你收集整理的A7\M4核串口实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5+CSS3+JS小实例:倒计时
- 下一篇: Markdown 简易教程