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


    头文件:

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

    源文件:

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

    主函数测试:

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

    实验现象:

     

     

  • 相关阅读:
    CSDN认证C1级别学习笔记 - JavaScript基础篇
    全波形反演的深度学习方法: 第 3 章 常规反演
    ZYNQ UltraScale MPSOC,使用PL端AXI_UART16550IP核,且在PS端控制下实现RS485通信-----轮询方式
    亚马逊一分钟1000+的僵尸链接获取只需三步
    CANopen扫盲
    【JAVA】网页版登录注册系统2.0
    A-Level化学半反应配平法
    AIOT入门指南:探索人工智能与物联网的交汇点
    【技术分享】NB860+Lierda云平台=上电即上云——云管端协作让万物互联更简单(二)
    宜居行星最新报道
  • 原文地址:https://blog.csdn.net/weixin_60354809/article/details/128105224