灵动微电子的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等外设的应用。
|