1.串口发出命令实现点灯
uart4.c
#include "uart4.h"
void uart4_config()
{
//使能外设时钟
RCC->MP_AHB4ENSETR |=(0x1<<1);
RCC->MP_AHB4ENSETR |=(0x1<<6);
RCC->MP_APB1ENSETR |=(0x1<<16);
RCC->MP_AHB4ENSETR |=(0x3<<4);
//设置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);
//设置管脚复用
GPIOB->MODER &=(~(0x3<<4));
GPIOB->MODER |=(0x2<<4);
GPIOB->AFRH &=(~(0xF<<8));
GPIOB->AFRH &=(~(0x8<<8));
GPIOG->MODER &=(0x3<<22);
GPIOG->MODER |=(0x2<<22);
GPIOG->AFRH &=(~(0xF<<12));
GPIOG->AFRH &=(~(0x6<<12));
//设置串口禁用
USART4->CR1 &=(~0x1);
//设置数据位宽
USART4->CR1 &=(~(0x1<<12));
USART4->CR1 &=(~(0x1<<28));
//设置无奇偶校验位
USART4->CR1 &=(~(0x1<<10));
//16倍过采样
USART4->CR1 &=(~(0x1<<15));
//设置1位停止位
USART4->CR2 &=(~(0x3<<12));
//设置不分频
USART4->PRESC &=(~0xf);
//设置波特率
USART4->BRR =0X22B;
//使能发射器
USART4->CR1 |=(0x1<<3);
//使能接收器
USART4->CR1 |=(0x1<<2);
//使能串口
USART4->CR1 |=(0x1);
}
char getchar()
{
char a;
//判断是否为空
while(!(USART4->ISR &(0x1<<5)));
//读取数据
a=USART4->RDR;
return a;
}
int strcmp(char a)
{
switch (a)
{
case '1':GPIOE->ODR |=(0x1<<10);
break;
case '2':GPIOE->ODR &=(~(0x1<<10));
break;
case '3':GPIOF->ODR |=(0x1<<10);
break;
case '4':GPIOF->ODR &=(~(0x1<<10));
break;
case '5':GPIOE->ODR |=(0x1<<8);
break;
case '6':GPIOE->ODR &=(~(0x1<<8));
break;
}
}
main.c
#include "uart4.h"
int main()
{
char a;
uart4_config();
while(1)
{
a=getchar();
strcmp(a);
}
return 0;
}
uart4.h
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"
void uart4_config();
char getchar();
int strcmp(char a);
#endif