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

[复制链接]
 楼主| 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通信传输状态信息。
  1. #include "mm32_device.h"
  2. #include "hal_conf.h"
  3. #include "hal_gpio.h"
  4. #include "hal_uart.h"

  5. // 定义LED和按键引脚
  6. #define LED_PIN GPIO_PIN_0
  7. #define LED_PORT GPIOA
  8. #define BUTTON_PIN GPIO_PIN_1
  9. #define BUTTON_PORT GPIOB

  10. void System_Init(void);
  11. void GPIO_Init(void);
  12. void UART_Init(void);
  13. void LED_Toggle(void);
  14. void UART_Send_String(char *str);

  15. int main(void)
  16. {
  17.     System_Init();  // 系统初始化
  18.     GPIO_Init();    // 初始化GPIO
  19.     UART_Init();    // 初始化UART
  20.    
  21.     while (1)
  22.     {
  23.         if (GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN) == RESET) // 按键按下
  24.         {
  25.             HAL_Delay(50); // 简单的去抖动延时
  26.             if (GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN) == RESET)
  27.             {
  28.                 LED_Toggle();  // 切换LED状态
  29.                 UART_Send_String("LED Toggled\r\n");  // 发送串口消息
  30.                
  31.                 while (GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN) == RESET); // 等待按键松开
  32.             }
  33.         }
  34.     }
  35. }

  36. void System_Init(void)
  37. {
  38.     SystemCoreClockUpdate();  // 更新系统时钟
  39.     HAL_Init();  // 初始化HAL库
  40. }

  41. void GPIO_Init(void)
  42. {
  43.     GPIO_InitTypeDef GPIO_InitStruct;
  44.    
  45.     // LED引脚配置
  46.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  47.     GPIO_InitStruct.GPIO_Pin = LED_PIN;
  48.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  49.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  50.     GPIO_Init(LED_PORT, &GPIO_InitStruct);
  51.    
  52.     // 按键引脚配置
  53.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  54.     GPIO_InitStruct.GPIO_Pin = BUTTON_PIN;
  55.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入
  56.     GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
  57. }

  58. void UART_Init(void)
  59. {
  60.     USART_InitTypeDef USART_InitStructure;
  61.     GPIO_InitTypeDef GPIO_InitStructure;
  62.    
  63.     // USART1时钟使能
  64.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
  65.    
  66.     // 配置PA9 (TX) 引脚
  67.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  68.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  69.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  70.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  71.    
  72.     // 配置PA10 (RX) 引脚
  73.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  74.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  75.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  76.    
  77.     // USART参数配置
  78.     USART_InitStructure.USART_BaudRate = 9600;
  79.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  80.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  81.     USART_InitStructure.USART_Parity = USART_Parity_No;
  82.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  83.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  84.    
  85.     USART_Init(USART1, &USART_InitStructure);
  86.     USART_Cmd(USART1, ENABLE);  // 使能USART1
  87. }

  88. void LED_Toggle(void)
  89. {
  90.     GPIO_WriteBit(LED_PORT, LED_PIN, (BitAction)(1-GPIO_ReadOutputDataBit(LED_PORT, LED_PIN)));
  91. }

  92. void UART_Send_String(char *str)
  93. {
  94.     while (*str)
  95.     {
  96.         USART_SendData(USART1, *str++);
  97.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);  // 等待发送完成
  98.     }
  99. }

代码分析
  • 系统初始化:在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 | 显示全部楼层
串口通信部分写得很清楚,调试串口信息果然方便了不少。
童雨竹 发表于 2024-10-11 13:40 | 显示全部楼层
不知道能不能再分享一些PWM控制的例子,最近在做电机控制。
万图 发表于 2024-10-11 13:41 | 显示全部楼层
我发现这款MCU的资源确实很丰富,性价比也不错。
Wordsworth 发表于 2024-10-11 13:41 | 显示全部楼层
每次按键按下之后通过串口发送状态,这个想法很棒,调试时很实用。
Bblythe 发表于 2024-10-11 13:42 | 显示全部楼层
按键去抖动那块可以考虑用定时器中断,我之前用过效果不错。
Uriah 发表于 2024-10-11 13:42 | 显示全部楼层
灵动的芯片支持的外设很多,感觉可以做很多有趣的项目。
Clyde011 发表于 2024-10-11 13:43 | 显示全部楼层
MM32F103的中断响应速度不错,用在实时性要求高的项目里挺合适的。
showbar 发表于 2024-10-21 10:59 | 显示全部楼层
固件库里面没有HAL_Init()这个函数接口,而且我现在存在个问题,是程序下载进去无现象(无法点灯),调试观测程序执行都是正常的。
wangguanfu 发表于 2024-11-28 04:20 来自手机 | 显示全部楼层
官网都踏马找不到MM32F103这个系列与资料了,但是市场上还大量这芯片在售在用,这踏马就是一个完全没有责任心的公司
wangguanfu 发表于 2024-11-28 04:21 来自手机 | 显示全部楼层
一个完全没有责任心的公司的产品,官网找不到一点点存在的信息,哪怕停产也没必要这样吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

5731

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部