ARMday6作业

1,串口字符串收发现象实现图

2.串口控制灯亮灭

main.c

cs 复制代码
#include "uart4.h"

//封装延时函数
void delay(int ms)
{
    int i,j;
    for(i=0;i<ms;i++)
    {
        for(j=0;j<2000;j++)
        {}

    }
}

int strcmp(char *a1,char *a2)
{
  int i=0;
  while(a1[i]==a2[i])
  {
    if(a1[i]=='\0')
     {
        break;
     } 
      i++;
  }
  int sub=a1[i]-a2[i];
   return sub;
}

int main()
{
    //led初始化
    uart4_init();
    all_led_init();
    char buf[32];
    // char i;
    while(1)
    {
        // i=getchar();
        // putchar(i+1);
        // //最终的现象:键盘输入a,串口工具显示b 
        gets(buf);
       if(strcmp(buf,"L1T")==0)
       {
          LED1_ON();
       }
       if(strcmp(buf,"L1F")==0)
       {
          LED1_OFF();
       }

       if(strcmp(buf,"L2T")==0)
       {
          LED2_ON();
       }
       if(strcmp(buf,"L2F")==0)
       {
          LED2_OFF();
       }

       if(strcmp(buf,"L3T")==0)
       {
          LED3_ON();
       }
       if(strcmp(buf,"L3F")==0)
       {
          LED3_OFF();
       }
    }
    return 0;
}

usart4.h

cs 复制代码
#ifndef __UART4_H__
#define __UART4_H__

#include "led.h"
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"

void uart4_init();
void putchar(char a);
char getchar();
void gets(char *s);
void puts(char *s);
int strcmp(char *a1,char *a2);
#endif

usart4.c

cs 复制代码
#include "uart4.h"


void uart4_init()
{
    //使能GPIOB GPIOG UART4外设时钟
    RCC->MP_AHB4ENSETR |= (0x1<<1);//GPIOB
    RCC->MP_AHB4ENSETR |= (0x1<<6);//GPIOG
    RCC->MP_APB1ENSETR |= (0X1<<16);//UART4
    //设置PB2和PG11管脚复用
    //PB2
    GPIOB->MODER &= (~(0x3<<4));
    GPIOB->MODER |=(0x2<<4); 
    GPIOB->AFRL &= (~(0XF<<8));
    GPIOB->AFRL |= (0x8<<8);
    //PG11
    GPIOG->MODER &= (~(0x3<<22));
    GPIOG->MODER |=(0x2<<22); 
    GPIOB->AFRH &= (~(0XF<<12));
    GPIOB->AFRH |= (0x6<<12);
    //设置串口不使能 UE=0
    USART4->CR1 &= (~(0X1));
    //设置8位数据位
    USART4->CR1 &= (~(0x1<<12));
    USART4->CR1 &= (~(0x1<<28));
    //设置没有奇偶校验位
    USART4->CR1 &= (~(0x1<<10));
    //设置1位停止位
    USART4->CR2 &= (~(0x3<<12));
    //设置16倍过采样
    USART4->CR1 &= (~(0x1<<15));
    //设置时钟不分频
    USART4->PRESC &= (~(0xF));
    //设置波特率为115200
    USART4->BRR=0X22B;
    //使能发送器
    USART4->CR1 |= (0x1<<3);
    //使能接收器
     USART4->CR1 |= (0x1<<2);
    //使能uart4
     USART4->CR1 |= (0x1<<0);
    
}

//发送一个字符
void putchar(char a)
{
    //先判断发送数据寄存器是否为空
     //不为空阻塞等待
    while(!(USART4->ISR&(0x1<<7)));
    //为空向发送数据寄存器写入a的数据
   USART4->TDR=a;//写入数据
    //写入完成需要判断发送是否完成,不完成阻塞等待,完成了则函数结束
    while(!(USART4->ISR&(0x1<<6)));
}

//接收一个字符
char getchar()
{
    char a;
    //先判断接收数据寄存器中有没有准备好的数据
    //如果数据没有准备好则阻塞等待
    while(!(USART4->ISR&(0x1<<5)));
    //如果数据准备好了则读取
    a=USART4->RDR;
    //读取完毕将读取到的数据返回
    return a;
}

//发送字符串
void puts(char *s)
{
    while(*s)
    {
        putchar(*s);
        s++;
    }
    putchar('\n');// '\n'切换到下一行
    putchar('\r');//'\n'回车键,切换到行头

}

//接收字符串函数
void gets(char *s)
{
    while(1)
    {
        *s=getchar();
        putchar(*s);
        if((*s)=='\r')
            break;
        s++;
    }
    *s='\0';
    putchar('\n');//换行
}

实现现象

视频转gif在线工具:

https://www.tutieshi.com/video/

口袋视频转换器下载地址:

https://koudaishipin

相关推荐
hollq38 分钟前
STM32F103RCT6+STM32CubeMX+keil5(MDK-ARM)+Flymcu实现串口重定向
arm开发·stm32·嵌入式硬件
小鱼儿电子2 小时前
17-基于STM32的宠物饲养系统设计与实现
stm32·嵌入式硬件·物联网·宠物·宠物饲养系统
小莞尔4 小时前
【51单片机】【protues仿真】基于51单片机四层电梯系统
单片机·嵌入式硬件
CFZPL4 小时前
使用江科大串口发送函数发送freertos的vTaskList出现跑飞
单片机
F133168929574 小时前
WD5030A,24V降5V,15A 大电流,应用于手机、平板、笔记本充电器
stm32·单片机·嵌入式硬件·51单片机·硬件工程·pcb工艺
易享电子6 小时前
基于单片机电器断路器保护器系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
爱倒腾的老唐8 小时前
01、如何学习单片机
单片机·嵌入式硬件·学习
点灯小铭8 小时前
基于单片机的夹具压力控制系统设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计
雾削木14 小时前
stm32解锁芯片
javascript·stm32·单片机·嵌入式硬件·gitee
璞致电子16 小时前
fpga开发板ZYNQ 璞致 PZ7010/7020 邮票孔核心板简介-ZYNQ7000系列小系统学习板
linux·嵌入式硬件·学习·fpga开发·fpga·fpga开发板·xilinx开发板