打印
[LKS32 软件]

基于凌鸥LKS32MC072的UART通信与ADC读取应用

[复制链接]
43|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
公羊子丹|  楼主 | 2024-10-11 09:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

凌鸥微电子的LKS32MC072是一款高性能的32位微控制器,采用Cortex-M0内核,适用于低功耗、嵌入式系统中的各种应用。本文将详细介绍如何使用LKS32MC072实现UART通信和ADC数据读取,并提供相应的代码示例。

应用场景在这篇文章中,我们将模拟一个简单的应用场景:通过LKS32MC072的UART接口与外部设备通信,并使用ADC模块读取模拟传感器的输入电压。主要功能包括:
  • 使用UART接口发送和接收数据。
  • 通过ADC读取电压信号并将其转换为数字值。
  • 将读取到的ADC数据通过UART发送到外部设备显示。

硬件设计硬件设计方面,我们使用LKS32MC072的UART1接口进行串口通信,GPIO引脚可以使用PA9作为TX,PA10作为RX。ADC模块通过GPIO的PA0引脚接入模拟电压信号,读取传感器的电压值。

代码实现接下来,我们将展示如何使用LKS32MC072 MCU的UART和ADC模块进行通信和数据读取。
#include "LKS32MC072.h"
#include "uart.h"
#include "adc.h"

#define UART_BUFFER_SIZE 64
char uart_buffer[UART_BUFFER_SIZE];

// 初始化函数声明
void SystemClock_Config(void);
void UART_Init(void);
void ADC_Init(void);
uint16_t ADC_Read(void);
void UART_SendString(char* str);

int main(void) {
    // 系统初始化
    SystemClock_Config();
    UART_Init();
    ADC_Init();
   
    while (1) {
        // 读取ADC数据
        uint16_t adc_value = ADC_Read();
        
        // 将ADC值转换为电压值,假设3.3V为满量程
        float voltage = (adc_value / 4095.0) * 3.3;
        
        // 将电压值通过UART发送
        snprintf(uart_buffer, UART_BUFFER_SIZE, "ADC Voltage: %.2fV\r\n", voltage);
        UART_SendString(uart_buffer);
        
        // 延时一段时间再读取
        HAL_Delay(1000);
    }
}

// 系统时钟配置
void SystemClock_Config(void) {
    // 系统时钟设置代码,此处省略具体时钟配置
}

// UART初始化
void UART_Init(void) {
    __HAL_RCC_USART1_CLK_ENABLE();  // 开启UART1时钟
    UART_HandleTypeDef huart1;
   
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 9600;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
   
    HAL_UART_Init(&huart1);
}

// ADC初始化
void ADC_Init(void) {
    __HAL_RCC_ADC1_CLK_ENABLE();  // 开启ADC时钟
   
    ADC_HandleTypeDef hadc1;
    hadc1.Instance = ADC1;
    hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    hadc1.Init.ScanConvMode = DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
   
    HAL_ADC_Init(&hadc1);
}

// ADC读取
uint16_t ADC_Read(void) {
    ADC_HandleTypeDef hadc1;
   
    HAL_ADC_Start(&hadc1);  // 开始ADC转换
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);  // 等待转换完成
    return HAL_ADC_GetValue(&hadc1);  // 获取ADC转换值
}

// UART发送字符串
void UART_SendString(char* str) {
    HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), HAL_MAX_DELAY);
}

代码解析
  • 系统初始化:通过SystemClock_Config配置系统时钟,UART_Init和ADC_Init分别初始化UART和ADC模块,确保硬件资源可以正常使用。
  • ADC读取:ADC_Read函数通过启动ADC并等待转换完成,最终返回12位的ADC数值,模拟信号的输入范围为0-3.3V,对应的ADC数值范围为0-4095。
  • UART通信:UART_SendString函数将格式化后的电压值通过UART发送到外部设备,方便进行显示或调试。
  • 主循环:在主循环中,每隔1秒读取一次ADC值,将其转换为电压值,并通过UART发送出去,便于查看传感器的输入。


代码运行结果当程序运行时,UART每隔1秒会发送类似以下数据到串口终端:
ADC Voltage: 2.54V

这表明ADC读取到了模拟输入信号,并成功通过UART发送出去。实际应用中,您可以连接不同类型的传感器,例如光传感器、温度传感器等,实现不同场景下的信号采集与处理。

总结本文详细介绍了LKS32MC072 MCU在UART通信和ADC数据读取中的应用,并提供了完整的代码示例。通过这种方式,用户可以轻松实现嵌入式系统中模拟信号的读取和数据传输。实际应用中,这种方式可以应用于环境监测、数据采集、工业控制等多个领域。

使用特权

评论回复
沙发
周半梅| | 2024-10-11 09:09 | 只看该作者
这个ADC和UART结合的例子真不错,实际项目中正好用得上。

使用特权

评论回复
板凳
帛灿灿| | 2024-10-11 09:09 | 只看该作者
我用过LKS32MC072,感觉挺好用的,资源丰富。

使用特权

评论回复
地板
童雨竹| | 2024-10-11 09:09 | 只看该作者
程序里有串口调试功能,调试起来方便多了。

使用特权

评论回复
5
万图| | 2024-10-11 09:10 | 只看该作者
HAL库真的省了很多时间,尤其是ADC和UART这些外设。

使用特权

评论回复
6
Wordsworth| | 2024-10-11 09:10 | 只看该作者
这款MCU的性能真的很不错,性价比也高。

使用特权

评论回复
7
Pulitzer| | 2024-10-11 09:10 | 只看该作者
这种读取模拟电压的例子在传感器应用里特别有用。

使用特权

评论回复
8
Bblythe| | 2024-10-11 09:10 | 只看该作者
可以考虑把延时改成定时器中断,这样更高效。

使用特权

评论回复
9
Uriah| | 2024-10-11 09:11 | 只看该作者
LKS的MCU文档也挺齐全的,学习起来挺快。

使用特权

评论回复
10
Clyde011| | 2024-10-11 09:11 | 只看该作者
有没有更复杂的传感器接入实例分享一下?

使用特权

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

本版积分规则

62

主题

4038

帖子

1

粉丝