打印
[单片机芯片]

沁恒CH32V103 MCU的实际应用与代码实现

[复制链接]
728|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
万图|  楼主 | 2024-10-9 08:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沁恒电子的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丰富的外设接口和开放的开发环境,开发者可以轻松实现复杂的嵌入式系统设计。


使用特权

评论回复
沙发
周半梅| | 2024-10-9 08:31 | 只看该作者
这个ADC采样速率怎么样?够用不?

使用特权

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

本版积分规则

38

主题

3709

帖子

0

粉丝