2.23作业

该代码示例展示了如何在STM32微控制器上初始化GPIO和UART4接口,用于控制LED灯和实现串口通信。通过RCC设置时钟,配置GPIO模式、速度和上拉下拉,以及USART4的工作模式和波特率。主函数中,程序接收串口输入的字符,根据接收到的数字控制相应LED的状态。
摘要由CSDN通过智能技术生成

#include "gpio.h"

void led_rcc_init()

{

RCC->MP_AHB4ENSETR &= (~(0x3<<4));

RCC->MP_AHB4ENSETR |= ((0x3<<4));

}

void led_gpio_init(gpio_t* gpio,unsigned int pin)

{

gpio->MODER &= (~(0x3<<(pin*2)));

gpio->MODER |= (0x1<<(pin*2));

gpio->OTYPER &= (~(0x1<<pin));

gpio->OSPEEDR &=(~(0x3<<(pin*2)));

gpio->PUPDR &=(~(0x3<<(pin*2)));

}

void led_on(gpio_t* gpio,unsigned int pin)

{

gpio->ODR |= 0x1<<pin;

}

void led_off(gpio_t* gpio,unsigned int pin)

{

gpio->ODR &= (~(0x1<<pin));

}

#include "uart4.h"

void uart4_rcc_init()

{

RCC->MP_AHB4ENSETR |= (0x1<<1);

RCC->MP_AHB4ENSETR |= (0x1<<6);

RCC->MP_APB1ENSETR |= (0x1<<16);

}

void uart4_gpio_init()

{

GPIOB->MODER &=(~(0x3<<4));

GPIOB->MODER |=((0x2<<4));

GPIOB->AFRL &=(~(0xf<<8));

GPIOB->AFRL |=((0x8<<8));

GPIOG->MODER &=(~(0x3<<22));

GPIOG->MODER |=((0x2<<22));

GPIOG->AFRH &=(~(0xf<<12));

GPIOG->AFRH |=((0x6<<12));

}

void uart4_init()

{

USART4->CR1 &= ~0x1;

USART4->CR1 &= (~(0x1<<28));

USART4->CR1 &= (~(0x1<<12));

USART4->CR1 &= (~(0x1<<15));

USART4->CR1 &= (~(0x1<<10));

USART4->CR2 &= (~(0x3<<12));

USART4->PRESC &= (~(0xf));

USART4->BRR |= 0x22B;

USART4->CR1 |= 0x1<<3;

USART4->CR1 |= 0x1<<2;

USART4->CR1 |= 0x1;

}

void uart4_put_char(char str)

{

while(!(USART4->ISR & (0x1<<6)));

USART4->TDR=str;

while(!(USART4->ISR & (0x1<<6)));

}

char uart4_get_char()

{

char ch;

while(!(USART4->ISR & (0x1<<5)));

ch=USART4->RDR;

return ch;

}

#include "uart4.h"

#include "gpio.h"

extern void printf(const char *fmt, ...);

void delay_ms(int ms)

{

int i,j;

for(i = 0; i < ms;i++)

for (j = 0; j < 1800; j++);

}

int main()

{

led_rcc_init();

led_gpio_init(GPIOE,10);

led_gpio_init(GPIOF,10);

led_gpio_init(GPIOE,8);

uart4_rcc_init();

uart4_gpio_init();

uart4_init();

while(1)

{

char ch=0;

ch=uart4_get_char();

if(ch=='1')

led_on(GPIOE,10);

else if(ch=='2')

led_on(GPIOF,10);

else if(ch=='3')

led_on(GPIOE,8);

else

{

led_off(GPIOE,10);

led_off(GPIOF,10);

led_off(GPIOE,8);

}

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值