MCU是2501B,用drive层、HAL层、App层的思路写出C语言代码
时间: 2024-04-30 08:19:13 浏览: 6
以下是一个可能的MCU 2501B的C代码示例,按照drive层、HAL层、App层的思路组织:
Drive层:
```c
/*
* Drive层:底层驱动代码,通过寄存器访问控制硬件设备
*/
/* 定义MCU上GPIO的地址 */
#define GPIOA_BASE_ADDR 0x40000000
#define GPIOB_BASE_ADDR 0x40000400
#define GPIOC_BASE_ADDR 0x40000800
/* 定义GPIO的寄存器地址偏移量 */
#define GPIO_MODE_OFFSET 0x00
#define GPIO_OUTPUT_OFFSET 0x14
/* GPIO模式 */
#define GPIO_MODE_INPUT 0
#define GPIO_MODE_OUTPUT 1
/* GPIO输出状态 */
#define GPIO_OUTPUT_LOW 0
#define GPIO_OUTPUT_HIGH 1
/* 初始化GPIO为输出模式 */
void gpio_init_output(volatile uint32_t *gpio_base_addr, uint32_t pin) {
/* 设置GPIO模式为输出 */
*(gpio_base_addr + GPIO_MODE_OFFSET) &= ~(0x3 << (pin * 2));
*(gpio_base_addr + GPIO_MODE_OFFSET) |= (GPIO_MODE_OUTPUT << (pin * 2));
}
/* 将GPIO输出状态设置为高电平 */
void gpio_set_high(volatile uint32_t *gpio_base_addr, uint32_t pin) {
*(gpio_base_addr + GPIO_OUTPUT_OFFSET) |= (1 << pin);
}
/* 将GPIO输出状态设置为低电平 */
void gpio_set_low(volatile uint32_t *gpio_base_addr, uint32_t pin) {
*(gpio_base_addr + GPIO_OUTPUT_OFFSET) &= ~(1 << pin);
}
```
HAL层:
```c
/*
* HAL层:硬件抽象层,封装底层驱动代码,提供简单易用的API给上层应用程序
*/
/* GPIO的端口号 */
typedef enum {
GPIO_PORT_A,
GPIO_PORT_B,
GPIO_PORT_C,
} gpio_port_t;
/* GPIO的引脚号 */
typedef enum {
GPIO_PIN_0,
GPIO_PIN_1,
GPIO_PIN_2,
GPIO_PIN_3,
GPIO_PIN_4,
GPIO_PIN_5,
GPIO_PIN_6,
GPIO_PIN_7,
} gpio_pin_t;
/* 初始化GPIO为输出模式 */
void hal_gpio_init_output(gpio_port_t port, gpio_pin_t pin) {
volatile uint32_t *gpio_base_addr;
/* 根据端口号设置GPIO的基地址 */
switch (port) {
case GPIO_PORT_A:
gpio_base_addr = (volatile uint32_t *)GPIOA_BASE_ADDR;
break;
case GPIO_PORT_B:
gpio_base_addr = (volatile uint32_t *)GPIOB_BASE_ADDR;
break;
case GPIO_PORT_C:
gpio_base_addr = (volatile uint32_t *)GPIOC_BASE_ADDR;
break;
default:
return;
}
/* 调用底层驱动函数初始化GPIO为输出模式 */
gpio_init_output(gpio_base_addr, pin);
}
/* 将GPIO输出状态设置为高电平 */
void hal_gpio_set_high(gpio_port_t port, gpio_pin_t pin) {
volatile uint32_t *gpio_base_addr;
/* 根据端口号设置GPIO的基地址 */
switch (port) {
case GPIO_PORT_A:
gpio_base_addr = (volatile uint32_t *)GPIOA_BASE_ADDR;
break;
case GPIO_PORT_B:
gpio_base_addr = (volatile uint32_t *)GPIOB_BASE_ADDR;
break;
case GPIO_PORT_C:
gpio_base_addr = (volatile uint32_t *)GPIOC_BASE_ADDR;
break;
default:
return;
}
/* 调用底层驱动函数将GPIO输出状态设置为高电平 */
gpio_set_high(gpio_base_addr, pin);
}
/* 将GPIO输出状态设置为低电平 */
void hal_gpio_set_low(gpio_port_t port, gpio_pin_t pin) {
volatile uint32_t *gpio_base_addr;
/* 根据端口号设置GPIO的基地址 */
switch (port) {
case GPIO_PORT_A:
gpio_base_addr = (volatile uint32_t *)GPIOA_BASE_ADDR;
break;
case GPIO_PORT_B:
gpio_base_addr = (volatile uint32_t *)GPIOB_BASE_ADDR;
break;
case GPIO_PORT_C:
gpio_base_addr = (volatile uint32_t *)GPIOC_BASE_ADDR;
break;
default:
return;
}
/* 调用底层驱动函数将GPIO输出状态设置为低电平 */
gpio_set_low(gpio_base_addr, pin);
}
```
App层:
```c
/*
* App层:应用程序层,调用HAL层提供的API实现具体功能
*/
/* 定义LED的端口号和引脚号 */
#define LED_PORT GPIO_PORT_A
#define LED_PIN GPIO_PIN_0
/* 简单LED闪烁程序 */
int main() {
/* 初始化LED引脚为输出模式 */
hal_gpio_init_output(LED_PORT, LED_PIN);
while (1) {
/* 将LED输出状态设置为高电平 */
hal_gpio_set_high(LED_PORT, LED_PIN);
delay(100);
/* 将LED输出状态设置为低电平 */
hal_gpio_set_low(LED_PORT, LED_PIN);
delay(100);
}
return 0;
}
```