串口通信的字符串和字符输入输出实现

uart.h

1 #ifndef __UART4_H__
  2 #define __UART4_H__
  3 #include"stm32mp1xx_gpio.h"
  4 #include"stm32mp1xx_rcc.h"
  5 #include"stm32mp1xx_uart.h"
  6 void uart4_init();
  7 void led_init();
  8 void putchar(char c);
  9 char getchar();
 10 void puts(char *s);
 11 void gets(char *s);
 12 int mystrcmp(char *dest,char *
 13 #endif                

uart4.c

1 #include "uart4.h"
  2 //led灯的初始化函数
  3 void led_init()
  4 {
  5     // 设置GPIOE/GPIOF时钟使能
  6     RCC->MP_AHB4ENSETR |= (0x3 << 4);
  7     // 设置PE10/PE8/PF10为输出模式
  8     GPIOE->MODER &= (~(0x3 << 20));
  9     GPIOE->MODER |= (0x1 << 20);
 10     GPIOE->MODER &= (~(0x3 << 16));
 11     GPIOE->MODER |= (0x1 << 16);
 12     GPIOF->MODER &= (~(0x3 << 20));
 13     GPIOF->MODER |= (0x1 << 20);
 14     // 设置PE10/PE8/PF10为推挽输出
 15     GPIOE->OTYPER &= (~(0x1 << 10));
 16     GPIOE->OTYPER &= (~(0X1 << 8));
 17     GPIOF->OTYPER &= (~(0x1 << 10));
 18     // 设置PE10/PE8/PF10输出速度为低速
 19     GPIOE->OSPEEDR &= (~(0x3 << 20));
 20     GPIOE->OSPEEDR &= (~(0X3 << 16));
 21     GPIOF->OSPEEDR &= (~(0x3 << 20));
 22     // 设置PE10/PE8/PF10无上拉下拉
 23     GPIOE->PUPDR &= (~(0x3 << 20));
 24     GPIOE->PUPDR &= (~(0X3 << 16));
 25     GPIOF->PUPDR &= (~(0X3 << 20));
 26 }
 27 //uart4的初始化函数
 28 void uart4_init()
 29 {
 30    //使能UART5,GPIOG/GPIOB的外设闹钟
 31    RCC->MP_APB1ENSETR |= (0x1<<16);
 32    RCC->MP_AHB4ENSETR |= (0x1<<1);
 33    RCC->MP_AHB4ENSETR |= (0x1<<6);
 34    //设置PG11为复用功能                                  
 35    GPIOG->MODER |= (0x3<<22);
 36    GPIOG->MODER &= (~(0x1<<22));
 37    //设置PG11为UART_TX为复用功能
 38    GPIOG->AFRH &= (0x0<<12);
 39    GPIOG->AFRH |= (0x6<<12);
    //设置PB2为复用功能
 41    GPIOB->MODER &= (~(0x3<<4));
 42    GPIOB->MODER |= (0x2<<4);                             
 43    //设置PB2为UART_RX为复用功能
 44    GPIOB->AFRL &= (~(0xf<<8));
 45    GPIOB->AFRL |= (0x8<<8);
 46    //设置禁用串口,UE=0
 47    USART4->CR1 &= (~(0x1));
 48    //设置8bit数据位
 49    USART4->CR1 &= (~(0x1<<12));
 50    USART4->CR1 &= (~(0x1<<28));
 51    //设置串口16倍过采样
 52    USART4->CR1 &= (~(0x1<<15));
 53    //设禁用奇偶校验位
 54    USART4->CR1 &= (~(0x1<<10));
 55    //设置1bit停止位
 56    USART4->CR2 &= (~(0x3<<12));
 57    //设置波特率115200
 58    USART4->BRR = 0x22b;
 59    //设置时钟不分频
 60    USART4->PRESC &= (~(0xf));
 61    //设置使能发送器
 62    USART4->CR1 |= (0x1<<3);
 63    //设置使能接收器
 64    USART4->CR1 |= (0x1<<2);
 65    //设置使能串口
 66    USART4->CR1 |= (0x1);
 67 }
 68 //封装单个字符串发送函数
 69 void putchar(char c)
 70 {
 71    //判断发送数据寄存器是否为空
 72    while(!(USART4->ISR & (0x1<<7)));
 73    //寄存器为空时将数据保存到TDR中
 74    USART4->TDR = c;
 75    //阻塞等待数据发送结束,函数结束
76    while(!(USART4->ISR & (0x1<<6)));
 77 }
 78 //封装单个字符串接收函数
 79 char getchar()
 80 {
 81    //阻塞等待数据读取结束
 82    while(!(USART4->ISR & (0x1<<5)));
 83    return USART4->RDR;
 84 }
 85 //发送一个字符串
 86 void puts(char *s)
 87 {
 88    while(*s)
 89    {
 90      putchar(*s);
 91      s++;
 92    }
 93    //发送完字符串让光标显示在下一行的最开头
 94    putchar('\n');
 95    putchar('\r');
 96 }
 97 //接收字符串                                             
 98 void gets(char *s)
 99 {
100    while(1)
101    {
102       *s=getchar();
103       putchar(*s);
104       if(*s == '\r')
105       {
106          break;
107       }
108       s++;
109    }
110    *s = '\0';
111    putchar('\n');
112 }
113 //自定义字符串比较函数
114 int mystrcmp(char *dest,char *src)
115 {
116    while(*dest && *src)
117    {
118      if(*dest!=*src)
119         return *dest-*src;
120         dest++;
121         src++;
122    }
123    if(*dest==*src)
124 
125    return 0;
126 }

main.c

1 #include "uart4.h"
  2 
  3 int main()
  4 {
  5     led_init();
  6     uart4_init();
  7     char *des = "0";
  8 
  9     char a = 'c';
 10     //char buf[32];
 11     while(1)
 12     {
 13        //gets(buf);
 14        //puts(buf);
 15        putchar(a);
 16        getchar();
 17 
 18        gets(des);
 19        puts(des);
 20     }
 21
 22     return 0;
 23 }

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值