• C语言 cortex-A7核UART总线实验


    一、C

    1)uart4.h

    1. #ifndef __UART4_H__
    2. #define __UART4_H__
    3. #include "stm32mp1xx_rcc.h"
    4. #include "stm32mp1xx_gpio.h"
    5. #include "stm32mp1xx_uart.h"
    6. //PB2 ---> UART4_RX
    7. //PG11 ---> UART4_TX
    8. //RCC/GPIO/UART4章节初始化
    9. void hal_uart4_init();
    10. //发送一个字符
    11. void hal_put_char(const char ch);
    12. //发送一个字符串
    13. void hal_put_string(const char* string);
    14. //接收一个字符
    15. char hal_get_char();
    16. //接收一个字符串
    17. char* hal_get_string();
    18. #endif

    2)uart.c

    1. #include "uart4.h"
    2. extern void delay_ms(int ms);
    3. //RCC/GPIO/UART4章节初始化
    4. void hal_uart4_init()
    5. {
    6. //RCC章节初始化
    7. //1.使能GPIOB组控制器 MP_AHB4ENSETR[1] = 1 0x50000A28[1]
    8. RCC->MP_AHB4ENSETR |= (0X1 << 1);
    9. //2.使能GPIOG组控制器 MP_AHB4ENSETR[6] = 1 0x50000a28[6]
    10. RCC->MP_AHB4ENSETR |= (0X1 << 6);
    11. //3.使能UART4组控制器 MP_AHB4ENSETR[11] = 1 PB2 PG11---> 0x500000A00[16]
    12. RCC->MP_APB1ENSETR |= (0X1 << 16);
    13. //GPIO章节初始化
    14. //1.设置PB2引脚为复用功能模式 MODER[5:4] = 10
    15. GPIOB->MODER &= (~(0x1 << 4));
    16. GPIOB->MODER |= (0x1 << 5);
    17. //2.设置PB2引脚复用功能为UART4_RX功能 AFRL[11:8] = 1000
    18. GPIOB->AFRL &= (~(0xf << 8));
    19. GPIOB->AFRL |= (0x1 << 11);
    20. //设置PG11引脚为复用功能模式 MODER[23:22] = 10
    21. GPIOG->MODER &= (~(0x1 << 22));
    22. GPIOG->MODER |= (0x1 << 23);
    23. //设置PG11引脚复用功能为UART4_TX功能 AFRH[15:12] = 0110
    24. GPIOG->AFRH &= (~(0xf << 12));
    25. GPIOG->AFRH |= (0x6 << 12);
    26. //UART4章节初始化
    27. //8N1 115200 使能位 代码编写逻辑
    28. //0.设置串口UE=0 CR1[0] = 0
    29. if(USART4->CR1 & (0x1 << 0))
    30. {
    31. delay_ms(500);
    32. USART4->CR1 &= (~(0x1 << 0));
    33. }
    34. //1.设置1位起始位,8位数据位 CR1[28][12] = 00
    35. USART4->CR1 &= (~(0x1 << 12));
    36. USART4->CR1 &= (~(0x1 << 28));
    37. //2.设置串口1位停止位 CR2[13:12] = 00
    38. USART4->CR2 &= (~(0x3 << 12));
    39. //3.设置串口无校验位 CR1[10] = 0
    40. USART4->CR1 &= (~(0x1 << 10));
    41. //4.设置串口16倍采样率 CR1[15] = 0
    42. USART4->CR1 &= (~(0x1 << 15));
    43. //5.设置串口不分频 PRESC[3:0] = 0000
    44. USART4->PRESC &= (~(0xf << 0));
    45. //6.设置串口波特率为115200 BRR = 0X22b
    46. //USART4->BRR &= (~(0xffff)); //可以不清零
    47. USART4->BRR |= (0x22b); //直接置0x22b // |= :按位赋值, = 直接赋值
    48. //7.设置串口发送位使能 CR1[3] = 1
    49. USART4->CR1 |= (0x1 << 3);
    50. //8.设置串口接受位使能 CR1[2] = 1
    51. USART4->CR1 |= (0x1 << 2);
    52. //9.设置串口使能 CR1[0] = 1
    53. USART4->CR1 |= (0x1 << 0);
    54. }
    55. //发送一个字符
    56. void hal_put_char(const char ch)
    57. {
    58. //1.判断发送数据寄存器是否为空 ISR[7]
    59. //读0:发送数据寄存器满,需要等待 for while
    60. //读1:发送数据寄存器空,可以发送数据
    61. while(!(USART4->ISR & (0X1 << 7)));
    62. //2.将参数ch传递过来的内容,赋值给TDR寄存器
    63. USART4->TDR = (volatile unsigned int)ch;
    64. //3.判断一帧数据是否发送完成 ISR[6]
    65. //读0:一帧数据没有发送完成,需要等待 for while
    66. //读1:一帧数据发送完成,可以发送下一帧数据
    67. while(!(USART4->ISR & (0x1 << 6)));
    68. }
    69. //发送一个字符串
    70. void hal_put_string(const char* string)
    71. {
    72. //判断字符串是否为\0
    73. while(*string)
    74. {
    75. //一个字符一个字符进行发送
    76. hal_put_char(*string++);
    77. }
    78. hal_put_char('\r');
    79. hal_put_char('\n');
    80. }
    81. //接收一个字符
    82. char hal_get_char()
    83. {
    84. char ch;
    85. //1.判断接收数据寄存器是否不为空 ISR[5]
    86. //读0:没有接收到数据,需要等待 for while
    87. //读1:接收到数据,可以将数据读出
    88. while(!(USART4->ISR & (0x1 << 5)));
    89. //2.将接收数据寄存器中RDR,读出来
    90. ch = (char)USART4->RDR;
    91. return ch;
    92. }
    93. char buffer[50] = {0};
    94. //接收一个字符串
    95. char* hal_get_string()
    96. {
    97. int i=0;
    98. for(i=0;i<49;i++)
    99. {
    100. buffer[i] = hal_get_char(); //开发板接收一个字符
    101. hal_put_char(buffer[i]); //发送一个字符显示串口工具
    102. if(buffer[i] == '\r')
    103. break;
    104. }
    105. buffer[i] = '\0';
    106. hal_put_char('\n');
    107. return buffer;
    108. }

    3)main.c

    1. #include "uart4.h"
    2. extern void printf(const char *fmt, ...);
    3. void delay_ms(int ms)
    4. {
    5. int i,j;
    6. for(i = 0; i < ms;i++)
    7. for (j = 0; j < 1800; j++);
    8. }
    9. int main()
    10. {
    11. hal_uart4_init();
    12. hal_put_string("hello");
    13. while(1)
    14. {
    15. //单个字符
    16. //hal_put_char(hal_get_char() + 1);
    17. //字符串
    18. hal_put_string(hal_get_string());
    19. }
    20. return 0;
    21. }

    4)效果

    实验一:收发字符

    实验二:收发字符串

    二、函数实现

    1)uart4.h

    2)uart.c

    3)main.c

    4)效果

    实验一:收发字符

    实验二:收发字符串

  • 相关阅读:
    Redis基础整理1.1
    Java追加式将内容写入yml文件
    如何将CAD导入GIS并且找到正确的投影坐标
    c语言以及高级语言中的float到底是什么以及IEEE754
    pcl--第十一节 点云外接立方体和点云模板匹配
    分布式系统设计案例学习笔记-如何设计一个分布式计数服务
    【C/C++】结构体&内存对齐
    嵌入式学习笔记(36)什么是定时器
    【网络安全 --- xss-labs靶场通关(11-20关)】详细的xss-labs靶场通关思路及技巧讲解,让你对xss漏洞的理解更深刻
    Pytorch:张量的梯度计算
  • 原文地址:https://blog.csdn.net/Smallxu_/article/details/133148823