[LKS32 软件] 基于凌鸥LKS32MC072的UART通信与ADC读取应用

[复制链接]
1730|11
 楼主| 公羊子丹 发表于 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模块进行通信和数据读取。
  1. #include "LKS32MC072.h"
  2. #include "uart.h"
  3. #include "adc.h"

  4. #define UART_BUFFER_SIZE 64
  5. char uart_buffer[UART_BUFFER_SIZE];

  6. // 初始化函数声明
  7. void SystemClock_Config(void);
  8. void UART_Init(void);
  9. void ADC_Init(void);
  10. uint16_t ADC_Read(void);
  11. void UART_SendString(char* str);

  12. int main(void) {
  13.     // 系统初始化
  14.     SystemClock_Config();
  15.     UART_Init();
  16.     ADC_Init();
  17.    
  18.     while (1) {
  19.         // 读取ADC数据
  20.         uint16_t adc_value = ADC_Read();
  21.         
  22.         // 将ADC值转换为电压值,假设3.3V为满量程
  23.         float voltage = (adc_value / 4095.0) * 3.3;
  24.         
  25.         // 将电压值通过UART发送
  26.         snprintf(uart_buffer, UART_BUFFER_SIZE, "ADC Voltage: %.2fV\r\n", voltage);
  27.         UART_SendString(uart_buffer);
  28.         
  29.         // 延时一段时间再读取
  30.         HAL_Delay(1000);
  31.     }
  32. }

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

  37. // UART初始化
  38. void UART_Init(void) {
  39.     __HAL_RCC_USART1_CLK_ENABLE();  // 开启UART1时钟
  40.     UART_HandleTypeDef huart1;
  41.    
  42.     huart1.Instance = USART1;
  43.     huart1.Init.BaudRate = 9600;
  44.     huart1.Init.WordLength = UART_WORDLENGTH_8B;
  45.     huart1.Init.StopBits = UART_STOPBITS_1;
  46.     huart1.Init.Parity = UART_PARITY_NONE;
  47.     huart1.Init.Mode = UART_MODE_TX_RX;
  48.     huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  49.     huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  50.    
  51.     HAL_UART_Init(&huart1);
  52. }

  53. // ADC初始化
  54. void ADC_Init(void) {
  55.     __HAL_RCC_ADC1_CLK_ENABLE();  // 开启ADC时钟
  56.    
  57.     ADC_HandleTypeDef hadc1;
  58.     hadc1.Instance = ADC1;
  59.     hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  60.     hadc1.Init.ScanConvMode = DISABLE;
  61.     hadc1.Init.ContinuousConvMode = DISABLE;
  62.     hadc1.Init.DiscontinuousConvMode = DISABLE;
  63.     hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  64.     hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  65.     hadc1.Init.NbrOfConversion = 1;
  66.    
  67.     HAL_ADC_Init(&hadc1);
  68. }

  69. // ADC读取
  70. uint16_t ADC_Read(void) {
  71.     ADC_HandleTypeDef hadc1;
  72.    
  73.     HAL_ADC_Start(&hadc1);  // 开始ADC转换
  74.     HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);  // 等待转换完成
  75.     return HAL_ADC_GetValue(&hadc1);  // 获取ADC转换值
  76. }

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

代码解析
  • 系统初始化:通过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秒会发送类似以下数据到串口终端:
  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 | 显示全部楼层
程序里有串口调试功能,调试起来方便多了。
万图 发表于 2024-10-11 09:10 | 显示全部楼层
HAL库真的省了很多时间,尤其是ADC和UART这些外设。
Wordsworth 发表于 2024-10-11 09:10 | 显示全部楼层
这款MCU的性能真的很不错,性价比也高。
Pulitzer 发表于 2024-10-11 09:10 | 显示全部楼层
这种读取模拟电压的例子在传感器应用里特别有用。
Bblythe 发表于 2024-10-11 09:10 | 显示全部楼层
可以考虑把延时改成定时器中断,这样更高效。
Uriah 发表于 2024-10-11 09:11 | 显示全部楼层
LKS的MCU文档也挺齐全的,学习起来挺快。
Clyde011 发表于 2024-10-11 09:11 | 显示全部楼层
有没有更复杂的传感器接入实例分享一下?
枝江小狼王 发表于 2025-9-1 17:24 | 显示全部楼层
万图 发表于 2024-10-11 09:10
HAL库真的省了很多时间,尤其是ADC和UART这些外设。

你好,这个hal库是哪个软件上的
枝江小狼王 发表于 2025-9-1 18:02 | 显示全部楼层
楼主,你好里面程序里的hal库是在哪款软件上配置的,我在官网找了一下并没有找到
您需要登录后才可以回帖 登录 | 注册

本版积分规则

200

主题

6534

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部