沁恒电子的CH32V103 MCU因其高性能和低功耗在嵌入式应用中占据了重要位置,尤其是对于物联网、工业自动化等应用领域,CH32V103提供了足够的计算能力和丰富的外设接口。它基于RISC-V架构,具有开放性和灵活性,能够支持广泛的开发工具和应用场景。本文将介绍如何在实际项目中使用CH32V103 MCU,并通过代码实例展示其GPIO控制、ADC采集和UART通信的应用。
CH32V103简介CH32V103 MCU是一款基于RISC-V内核的32位低功耗微控制器,工作频率高达72MHz,拥有丰富的外设资源,如GPIO、USART、I2C、SPI、ADC、PWM等,且支持低功耗模式,非常适合用于需要高效数据处理的项目。其开发工具链也很完善,支持Keil、IAR和开放的RISC-V开发环境。
项目配置- 开发环境:Keil MDK
- 芯片型号:CH32V103C8T6
- 使用外设:GPIO、ADC、USART
- 功能目标:实现基本的按键输入、LED控制、传感器数据采集以及串口通信功能
代码实现以下是基于CH32V103的代码示例,主要涉及GPIO初始化、ADC配置和UART串口通信的实现。
1. 系统初始化与外设配置#include "ch32v10x.h"
void System_Init(void);
void GPIO_Init(void);
void ADC_Init(void);
void UART_Init(void);
int main(void) {
System_Init();
GPIO_Init();
ADC_Init();
UART_Init();
uint16_t adc_value;
while(1) {
// 获取ADC的模拟输入数据
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
adc_value = ADC_GetConversionValue(ADC1);
// 通过UART发送ADC数据
char buffer[20];
sprintf(buffer, "ADC Value: %d\n", adc_value);
USART_SendString(USART1, buffer);
// 按键按下时点亮LED
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) {
GPIO_SetBits(GPIOC, GPIO_Pin_13);
} else {
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}
Delay(500); // 延时500ms
}
}
void System_Init(void) {
SystemCoreClockUpdate(); // 更新系统时钟
}
void GPIO_Init(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
// 配置LED引脚(PC13)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 配置按键引脚(PA0)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 输入上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void ADC_Init(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
// 配置ADC通道
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
// 开启ADC
ADC_Cmd(ADC1, ENABLE);
}
void UART_Init(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 配置PA9 (USART1 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 (USART1 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 = 115200;
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 USART_SendString(USART_TypeDef* USARTx, char* str) {
while (*str) {
USART_SendData(USARTx, *str++);
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
}
void Delay(uint32_t time) {
while (time--) {
__NOP(); // 空操作,作为延时
}
}
代码分析- 系统初始化:System_Init函数用于配置MCU的时钟系统,并确保所有外设时钟正常工作。
- GPIO配置:GPIO引脚分别用于LED控制和按键输入,其中PA0连接按键,PC13连接LED。
- ADC配置:ADC1配置为单通道连续采样模式,用于采集模拟信号,采样结果通过UART发送至主机。
- UART通信:USART1用于串口通信,波特率设置为115200,配合使用串口助手可以接收到MCU发送的ADC数据。
项目扩展CH32V103系列MCU的强大功能不仅限于GPIO控制、ADC采集和UART通信,还可以通过其丰富的外设接口扩展更多功能:
- I2C接口:与外部传感器模块或EEPROM通信,获取环境数据或存储配置信息。
- SPI接口:用于高速数据传输,例如与显示屏或Flash存储器进行数据交互。
- PWM控制:生成精确的PWM波形,用于电机控制、LED亮度调节等应用。
- 低功耗模式:通过配置低功耗模式,可在不需要连续工作的场合延长电池供电设备的使用寿命。
总结本文通过代码实例展示了沁恒CH32V103 MCU在嵌入式系统中的应用,结合GPIO、ADC和UART外设,实现了简单的按键检测、LED控制和传感器数据采集与通信。该MCU具有高效、低功耗的特点,适用于物联网、工业自动化等多个领域。通过CH32V103丰富的外设接口和开放的开发环境,开发者可以轻松实现复杂的嵌入式系统设计。
|