[技术问答]

使用 GPIO、UART 和 Timer 实现基本功能

[复制链接]
307|6
手机看帖
扫描二维码
随时随地手机跟帖
grfqq325|  楼主 | 2024-9-30 23:58 | 显示全部楼层 |阅读模式
111111展示如何配置和使用 GPIO、UART 以及定时器,结合基本的 LED 闪烁和 UART 串口通信功能。
1. 项目准备
在开始编写代码前,确保以下开发环境和工具已经就绪:

IDE: Keil MDK 或 IAR Embedded Workbench(或者其他兼容 ARM 的开发工具)。
HC32 SDK: 使用官方 SDK 或库,可以从鸿芯半导体官方网站下载 SDK,内含硬件抽象层(HAL)库。
调试工具:可以使用 J-Link、ST-Link 等调试器。

使用特权

评论回复
grfqq325|  楼主 | 2024-9-30 23:59 | 显示全部楼层
程序设计概要
该程序将做以下几件事情:

配置一个 GPIO 引脚控制 LED,使 LED 以 1 秒的频率闪烁。
配置 UART1 接口,通过串口发送一条欢迎信息并实现简单的回显功能。
使用定时器中断控制 LED 的闪烁频率。

使用特权

评论回复
grfqq325|  楼主 | 2024-9-30 23:59 | 显示全部楼层
代码实现
引入必要的头文件和定义
首先引入 HC32 SDK 提供的头文件和定义,设置 LED 和 UART 引脚。

c
复制代码
#include "hc32_ddl.h"

// 定义 LED 引脚和 UART1 引脚
#define LED_PORT GPIO_PORT_1
#define LED_PIN GPIO_PIN_0

#define UART_RX_PORT GPIO_PORT_1
#define UART_RX_PIN GPIO_PIN_2
#define UART_TX_PORT GPIO_PORT_1
#define UART_TX_PIN GPIO_PIN_3

使用特权

评论回复
grfqq325|  楼主 | 2024-9-30 23:59 | 显示全部楼层
GPIO 配置
配置 GPIO 引脚以控制 LED,通过设置 GPIO 为输出模式,操作输出高低电平控制 LED 的亮灭。

c

void GPIO_Init(void)
{
    stc_gpio_init_t stcGpioCfg;

    // 初始化 GPIO 配置结构体
    MEM_ZERO_STRUCT(stcGpioCfg);
    stcGpioCfg.u16PinDir = PIN_DIR_OUT;  // 设置引脚为输出模式

    // 初始化 LED 引脚
    GPIO_Init(LED_PORT, LED_PIN, &stcGpioCfg);
}

使用特权

评论回复
grfqq325|  楼主 | 2024-9-30 23:59 | 显示全部楼层
UART 初始化
初始化 UART1 接口,设置波特率为 115200,配置接收和发送引脚。之后可以通过 UART 发送和接收数据。

c
复制代码
void UART_Init(void)
{
    stc_uart_init_t stcUartInit;
    MEM_ZERO_STRUCT(stcUartInit);

    // 配置 UART 初始化结构体
    stcUartInit.u32Baudrate = 115200;
    stcUartInit.u32OverSampleBit = UART_OVER_SAMPLE_8BIT;
    stcUartInit.u32StopBit = UART_STOPBIT_1BIT;
    stcUartInit.u32Parity = UART_PARITY_NONE;

    // 初始化 UART1
    UART_Init(M4_USART1, &stcUartInit);

    // 配置 TX 和 RX 引脚
    GPIO_SetFunc(UART_TX_PORT, UART_TX_PIN, GPIO_FUNC_5_USART);
    GPIO_SetFunc(UART_RX_PORT, UART_RX_PIN, GPIO_FUNC_5_USART);

    // 启用 UART 发送和接收功能
    UART_FuncCmd(M4_USART1, UART_RX | UART_TX, Enable);
}

使用特权

评论回复
grfqq325|  楼主 | 2024-9-30 23:59 | 显示全部楼层
定时器配置
配置 Timer4 来实现每秒触发中断,控制 LED 的闪烁。

c
复制代码
void Timer4_Init(void)
{
    stc_timer4_cnt_init_t stcCntInit;
    MEM_ZERO_STRUCT(stcCntInit);

    // 设置计数器周期为 1 秒(假设系统时钟为 16 MHz)
    stcCntInit.u16CntClkDiv = TIMER4_CNT_CLK_DIV256;
    stcCntInit.u16CntPeriod = 62500;  // 每个周期 = 16MHz / 256 / 62500 = 1Hz

    // 初始化 Timer4 计数器
    TIMER4_CNT_Init(M4_TMR41, &stcCntInit);

    // 启用 Timer4 中断
    TIMER4_CNT_IntCmd(M4_TMR41, Enable);
    NVIC_ClearPendingIRQ(TMR41_CNT_IRQn);
    NVIC_SetPriority(TMR41_CNT_IRQn, DDL_IRQ_PRIORITY_03);
    NVIC_EnableIRQ(TMR41_CNT_IRQn);

    // 启动 Timer4
    TIMER4_CNT_Start(M4_TMR41);
}

使用特权

评论回复
guijial511| | 2024-10-2 09:55 | 显示全部楼层
又是把正文当回复贴来发了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

483

帖子

4

粉丝