ARM 用串口来实现灯的点亮

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 main()

{

    led_init();

	uart4_init();

    //char buf[128];

    char *str;

   

    //char i;

    while(1)

    {

       /*i=getchar();

        putchar(i+1);

        putchar('\n');

        putchar('\r');*/

        str=gets();

        puts(str);



        if(strcmp(str,"led1_on"))

        {

            GPIOE->ODR |= (0X1<<10);  

        }

        else if(strcmp(str,"led1_off"))

        {

            GPIOE->ODR &= ~(0X1<<10);

        }

        else if(strcmp(str,"led2_on"))

        {

            GPIOE->ODR |= (0X1<<8);

        }

        else if(strcmp(str,"led2_off"))

        {

            GPIOE->ODR &= ~(0X1<<8);

        }

        else if(strcmp(str,"led3_on"))

        {

            GPIOF->ODR |= (0X1<<10);

        }

        else if(strcmp(str,"led3_off"))

        {

            GPIOF->ODR &= ~(0X1<<10);

        }

    }

    return 0;

	

}

src/uart4.c

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

char buf[128]={0};
//led数据初始化
void led_init()
{
    //设置GPIOE/GPIOF时钟使能
    RCC->MP_AHB4ENSETR |=(0X3<<4);
    //设置PE10/PE8/PF10为输出模式
    //PE10
    GPIOE->MODER &=(~(0X3<<20));
    GPIOE->MODER |=(0X1<<20);
    //PE8
    GPIOE->MODER &=(~(0X3<<16));
    GPIOE->MODER |=(0X1<<16);
    //PF10
    GPIOF->MODER &=(~(0X3<<20));
    GPIOF->MODER |=(0X1<<20);
    //设置PE10/PE8/PF10为推完输出
    //PE10
    GPIOE->OTYPER &=(~(0X1<<10));
    //PE8
    GPIOE->OTYPER &=(~(0X1<<8));
    //PF10
    GPIOF->OTYPER &=(~(0X1<<10));
    //设置PE10/PE8/PF10为输出速度为低速
    //PE10
    GPIOE->OSPEEDR &=(~(0X3<<20));
    //PE8
    GPIOE->OSPEEDR &=(~(0X3<<16));
    //PF10
    GPIOF->OSPEEDR &=(~(0X3<<20));
    //设置PE10/PE8/PF10为无上拉无下拉
    GPIOE->PUPDR &=(~(0X3<<20));
    //PE8
    GPIOE->PUPDR &=(~(0X3<<20));
    //PE10
    GPIOE->PUPDR &=(~(0X3<<20));
}

void uart4_init()
{
    //使能GPIOB GPIOG UART4外设时钟
    RCC->MP_AHB4ENSETR |= (0x1<<1);
    RCC->MP_AHB4ENSETR |= (0x1<<6);
    RCC->MP_APB1ENSETR |= (0x1<<16);
    //设置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);
    GPIOG->AFRL &=(~(0xf<<12));
    GPIOG->AFRL |=(0x6<<12);
    //设置串口不使能UE=O
    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);
}

//发送一个字符
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');
    putchar('\r');
}
//接收字符串
char *gets()
{
    unsigned int i;
    for(i=0;i<50;i++)
    {
        buf[i]=getchar();
        putchar(buf[i]);
        if((buf[i])=='\r')
            break;
    }
    buf[i]='\0';
    putchar('\n');
    putchar('\r');

    return buf;
}

//比较两个字符串函数
int strcmp(char *dest, char *src)
{
    if(*dest == *src)
        return 0;
    while(*dest && *src)
    {
        if(*dest != *src)
        {
            return *dest - *src;
        }
        dest++;
        src++;
    }
    return 0;
}

src/uart4.h

cs 复制代码
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
void led_init();
void uart4_init();
void putchar(char a);
char getchar();
void puts(char *s);
char *gets();
int strcmp(char *dest, char *src);

#endif
相关推荐
AAA代码批发商2 小时前
DAY43 ARM 体系结构学习笔记|嵌入式入门,从硬件组件到流水线、内存与栈帧
arm开发·笔记·学习
女神下凡3 小时前
带NPU的电脑 和不带NPU的电脑 在使用上有什么不样
arm开发·单片机·pcm
T1mzhou17 小时前
ARM64 Linux 6.10 内核驱动(12):dd.c:probe/ remove、延迟 probe
linux·服务器·c语言·arm开发·arm
Doraemomo18 小时前
IMX6ULL裸机开发——系统主频和时钟配置
arm开发·嵌入式硬件·makefile·imx6ull
T1mzhou21 小时前
ARM64 平台安全学习记录
linux·服务器·arm开发·arm
云栖梦泽1 天前
网络设备驱动(1)
linux·arm开发·嵌入式硬件
零依赖极客2 天前
Day 9·1 KV 也量化——q8 KV 把缓存与 decode 带宽压到一半
c语言·开发语言·arm开发·人工智能·缓存·矩阵
secondyoung3 天前
I2C通信协议详解
arm开发·驱动开发·stm32·单片机·嵌入式硬件·mcu·51单片机
奔跑的架构师3 天前
[A-50]ARMv9/v8-DVFS系统架构
linux·arm开发·架构·系统架构·arm
零依赖极客3 天前
Day 8·1 自注意力机制:Q·K^T/softmax/V的在线计算
c语言·arm开发·人工智能·llama