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