ARM cortex-A7核UART实验 收发数据

头文件:

 1 #ifndef __UART4_H__                               
 2 #define __UART4_H__                               
 3                                                   
 4 #include "../common/include/stm32mp1xx_rcc.h"     
 5 #include "../common/include/stm32mp1xx_gpio.h"    
 6 #include "../common/include/stm32mp1xx_uart.h"    
 7                                                   
 8 //UART4串口初始化                                 
 9 void hal_uart_init(void);                         
10                                                   
11 //发送一个字符                                    
12 void hal_put(const char str);                     
13                                                   
14 //发送一个字符串                                  
15 void hal_put_string(const char* string);          
16                                                   
17 //接收一个字符                                    
18 char get_char(void);                              
19                                                   
20 //接收一个字符串                                  
21 char* get_string(void);                           
22                                                   
23 #endif                                            
                                                     
                                                     
                                                     

源文件:

  1 #include "uart4.h"
  2 
  3 //UART4串口初始化
  4 void hal_uart_init(void)
  5 {
  6     /********** RCC 相关寄存器初始化***********/
  7     RCC->MP_AHB4ENSETR |= (0x1<<1); //使能GPIOB组控制器
  8     RCC->MP_AHB4ENSETR |= (0x1<<6); //使能GPIOG组控制器
  9     RCC->MP_APB1ENSETR |= (0x1<<16); //使能UART4组控制器
 10 
 11     /********** GPIO 相关寄存器初始化***********/
 12     GPIOB->MODER &= (~(0x3<<4)); //设置PB2引脚为复用功能
 13     GPIOB->MODER |= (0x2<<4);
 14     GPIOG->MODER &= (~(0x3<<22)); //设置PG11引脚为复用功能
 15     GPIOG->MODER |= (0x2<<22);
 16 
 17     GPIOB->AFRL &= (~(0xf<<8)); //设置PB2引脚复用功能为 URAT4_RX
 18     GPIOB->AFRL |= (0x1<<11);
 19     GPIOG->AFRH &= (~(0xf<<12)); //设置PG11引脚复用功能为 URAT4_TX
 20     GPIOG->AFRH |= (0x6<<12);
 21 
 22     /********** UART4 相关寄存器初始化***********/
 23     //1.USART_CR1:设置数据位宽度,以及对应的控制器使能(UART控制器使能,发送寄存器使能,接收寄存器使能)
 24     USART4->CR1 &= (~(0x1<<28));
 25     USART4->CR1 &= (~(0x1<<12));
 26     USART4->CR1 &= (~(0x1<<15));
 27     USART4->CR1 &= (~(0x1<<10));
 28     USART4->CR1 |= (0x1<<3);
 29     USART4->CR1 |= (0x1<<2);
 30     USART4->CR1 |= 0x1;
 31 
 32     //2.USART_CR2:设置串口停止位
 33     USART4->CR2 &= (~(0x3<<12));
 34 
 35     //3.USART_BRR:设置串口波特率
 36     USART4->BRR = 0x22b;
 37 
 38     //7.USART_PRESC:设置串口分频器
 39     USART4->PRESC &= (~0xf);
 40 
 41 }
 42 
 43 //发送一个字符
 44 void hal_put(const char str)
 45 {
 46     //判断发送数据寄存器是否有数据
 47     while(!(USART4->ISR & (0x1<<7))); //位7为1时,可以发送数据,跳出循环
 48 
 49 //  USART4->TDR &= (~(0xff));
 50     USART4->TDR = str;
 51 
 52     //判断发送数据寄存器是否发送完成
 53     while(!(USART4->ISR & (0x1<<6)));//位6为1时,发送数据完成,跳出循环
 54 }
 55 
 56 //发送一个字符串
 57 void hal_put_string(const char* string)                                                                                                
 58 {
 59     //判断字符串结束标志
 60     while('\0' != *string)
 61     {
 62         hal_put(*string);
 63         string++;
 64     }
 65 }
 66 
 67 //接收一个字符
 68 char get_char(void)
 69 {
 70     //判断接收数据寄存器是否接收到数据
 71     while(!(USART4->ISR & (0x1<<5))); //位5为1时,可以读取数据,跳出循环
 72     return (char)USART4->RDR;
 73 }
 74 
 75 char buf[128] = "";
 76 //接收一个字符串
 77 char* get_string(void)
 78 {
 79     //键盘的回车键按下,对应的字符'\r'
 80     int i;
 81     for(i=0; i<(sizeof(buf)-1); i++)
 82     {
 83         buf[i] = get_char();
 84         hal_put(buf[i]);
 85 
 86         if('\r' == buf[i])
 87         {
 88             break;
 89         }
 90     }
 91     buf[i] = '\0';
 92     hal_put('\n');
 93 
 94     return buf;
 95 
 96 }
 97 
                                                                                                                                     

主函数测试:

 1 #include "uart4.h"
 2 
 3 extern void printf(const char *fmt, ...);
 4 void delay_ms(int ms)
 5 {
 6     int i,j;
 7     for(i = 0; i < ms;i++)
 8         for (j = 0; j < 1800; j++);
 9 }
10 
11 
12 int main()
13 {
14     hal_uart_init();
15     printf("ARM,YES!!!\n");
16     while(1)
17     {
18         //hal_put(get_char()+1);              
19         hal_put_string(get_string());
20     }
21     return 0;
22 }
                                                 
                                                 
                                                 
                                                 

实验现象:

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值