打印
[MM32生态]

灵动MM32F103 MCU的应用与代码实现——基于按键控制LED和UART通信

[复制链接]
667|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Pulitzer|  楼主 | 2024-10-11 13:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

灵动微电子的MM32F103系列MCU是基于Cortex-M3内核的高性能32位单片机,具备较强的处理能力和丰富的外设,广泛应用于消费电子、智能家居、工业控制等领域。本文将介绍MM32F103在按键控制LED和UART通信中的应用,并提供详细的代码示例,帮助开发者更好地掌握该芯片的使用。

MM32F103简介MM32F103是一款高性能、低功耗的32位单片机,基于ARM Cortex-M3架构,主频高达72MHz,具有丰富的外设如UART、SPI、I2C、ADC等模块。其强大的运算能力和丰富的I/O资源,使其适合各类嵌入式应用。
本文将展示如何使用MM32F103 MCU实现按键控制LED的开关,并通过UART向PC发送LED状态,方便调试与监控。

硬件配置
  • MCU型号:MM32F103RCT6
  • 功能模块:按键控制LED、UART通信
  • 开发环境:Keil MDK + MM32标准外设库
硬件设计简洁明了,按键用于控制LED的亮灭状态,MCU通过UART将LED状态信息发送到PC进行调试和监控。

代码实现以下代码展示了如何使用MM32F103 MCU实现按键控制LED,并通过UART通信传输状态信息。
#include "mm32_device.h"
#include "hal_conf.h"
#include "hal_gpio.h"
#include "hal_uart.h"

// 定义LED和按键引脚
#define LED_PIN GPIO_PIN_0
#define LED_PORT GPIOA
#define BUTTON_PIN GPIO_PIN_1
#define BUTTON_PORT GPIOB

void System_Init(void);
void GPIO_Init(void);
void UART_Init(void);
void LED_Toggle(void);
void UART_Send_String(char *str);

int main(void)
{
    System_Init();  // 系统初始化
    GPIO_Init();    // 初始化GPIO
    UART_Init();    // 初始化UART
   
    while (1)
    {
        if (GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN) == RESET) // 按键按下
        {
            HAL_Delay(50); // 简单的去抖动延时
            if (GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN) == RESET)
            {
                LED_Toggle();  // 切换LED状态
                UART_Send_String("LED Toggled\r\n");  // 发送串口消息
               
                while (GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN) == RESET); // 等待按键松开
            }
        }
    }
}

void System_Init(void)
{
    SystemCoreClockUpdate();  // 更新系统时钟
    HAL_Init();  // 初始化HAL库
}

void GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
   
    // LED引脚配置
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStruct.GPIO_Pin = LED_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LED_PORT, &GPIO_InitStruct);
   
    // 按键引脚配置
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStruct.GPIO_Pin = BUTTON_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入
    GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
}

void UART_Init(void)
{
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
   
    // USART1时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
   
    // 配置PA9 (TX) 引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    // 配置PA10 (RX) 引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    // USART参数配置
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
   
    USART_Init(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE);  // 使能USART1
}

void LED_Toggle(void)
{
    GPIO_WriteBit(LED_PORT, LED_PIN, (BitAction)(1-GPIO_ReadOutputDataBit(LED_PORT, LED_PIN)));
}

void UART_Send_String(char *str)
{
    while (*str)
    {
        USART_SendData(USART1, *str++);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);  // 等待发送完成
    }
}

代码分析
  • 系统初始化:在System_Init()中更新系统时钟,并调用HAL库初始化所有外设模块。
  • GPIO初始化:通过GPIO_Init()配置GPIO引脚。LED引脚配置为推挽输出模式,按键引脚配置为上拉输入模式。
  • UART初始化:UART_Init()函数配置USART1,波特率设为9600,PA9和PA10分别作为TX和RX引脚。串口用于将按键操作后LED的状态信息发送至上位机。
  • LED控制:通过LED_Toggle()函数切换LED的亮灭状态。
  • 串口发送数据:UART_Send_String()函数用于通过UART发送字符串信息,传递LED状态至上位机。


应用扩展
  • ADC读取传感器数据:灵动MM32F103内置多通道ADC,可以通过配置ADC模块来读取模拟传感器的电压值。
  • PWM控制:通过配置定时器,可以实现PWM信号的输出,控制电机速度或LED亮度。
  • 中断处理:利用外部中断(EXTI)可以实现按键中断功能,提升响应速度。
  • I2C和SPI通信:MM32F103支持I2C和SPI通信,可以轻松扩展外部存储设备、传感器等外设。


总结本文详细介绍了灵动MM32F103 MCU的应用场景,包括按键控制LED和UART通信的代码实现。该芯片功能强大,适用于各种嵌入式应用场景。在实际开发中,可以根据项目需求进一步扩展ADC、PWM、I2C等外设的应用。

使用特权

评论回复
沙发
公羊子丹| | 2024-10-11 13:39 | 只看该作者
这个按键控制LED的例子真好,刚好用在我的毕业设计上了。

使用特权

评论回复
板凳
周半梅| | 2024-10-11 13:39 | 只看该作者
我之前用过STM32,发现MM32的操作也蛮类似的,上手挺快的。

使用特权

评论回复
地板
帛灿灿| | 2024-10-11 13:40 | 只看该作者
串口通信部分写得很清楚,调试串口信息果然方便了不少。

使用特权

评论回复
5
童雨竹| | 2024-10-11 13:40 | 只看该作者
不知道能不能再分享一些PWM控制的例子,最近在做电机控制。

使用特权

评论回复
6
万图| | 2024-10-11 13:41 | 只看该作者
我发现这款MCU的资源确实很丰富,性价比也不错。

使用特权

评论回复
7
Wordsworth| | 2024-10-11 13:41 | 只看该作者
每次按键按下之后通过串口发送状态,这个想法很棒,调试时很实用。

使用特权

评论回复
8
Bblythe| | 2024-10-11 13:42 | 只看该作者
按键去抖动那块可以考虑用定时器中断,我之前用过效果不错。

使用特权

评论回复
9
Uriah| | 2024-10-11 13:42 | 只看该作者
灵动的芯片支持的外设很多,感觉可以做很多有趣的项目。

使用特权

评论回复
10
Clyde011| | 2024-10-11 13:43 | 只看该作者
MM32F103的中断响应速度不错,用在实时性要求高的项目里挺合适的。

使用特权

评论回复
11
showbar| | 2024-10-21 10:59 | 只看该作者
固件库里面没有HAL_Init()这个函数接口,而且我现在存在个问题,是程序下载进去无现象(无法点灯),调试观测程序执行都是正常的。

使用特权

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

本版积分规则

29

主题

3596

帖子

0

粉丝