打印
[N32G45x]

国民技术MCU在物联网设备中的应用与代码实现

[复制链接]
34|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
周半梅|  楼主 | 2024-10-9 08:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

随着物联网设备的广泛应用,MCU的需求也在快速增长。国民技术(Nationz)作为国内知名的MCU供应商,其产品在低功耗、高性能和安全性上表现出色,特别适用于物联网领域的嵌入式设备开发。本文将以国民技术的N32G45x系列MCU为例,展示如何在物联网设备中实现数据采集和控制功能,并提供相应的代码实例。

项目配置
  • 开发环境:Keil MDK
  • 芯片型号:N32G45
  • 外设使用:GPIO、ADC、UART
  • 功能目标:实现传感器数据采集并通过串口发送数据
代码实现1. 初始化外设首先,我们需要初始化GPIO、ADC和UART外设。GPIO用于读取按键状态,ADC用于采集传感器数据,UART用于通过串口传输数据。
#include "n32g45x.h"

void SystemClock_Config(void);
void UART_Config(void);
void GPIO_Config(void);
void ADC_Config(void);

int main(void) {
  HAL_Init();
  SystemClock_Config();
  GPIO_Config();
  UART_Config();
  ADC_Config();

  uint16_t sensor_value = 0;

  while (1) {
    // 读取传感器数据
    sensor_value = HAL_ADC_GetValue(&hadc);
   
    // 通过串口发送传感器数据
    char msg[20];
    sprintf(msg, "Sensor: %d\r\n", sensor_value);
    HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
   
    // 检查按键状态并执行相应操作
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 点亮LED
    } else {
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // 熄灭LED
    }
   
    HAL_Delay(1000); // 延时1秒
  }
}

void SystemClock_Config(void) {
  // 系统时钟配置,采用外部高速时钟源
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}

void UART_Config(void) {
  // UART外设配置
  __HAL_RCC_USART2_CLK_ENABLE();
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  
  GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  UART_HandleTypeDef huart2;
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  HAL_UART_Init(&huart2);
}

void GPIO_Config(void) {
  // GPIO配置,用于按键和LED
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  // 配置LED引脚
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  // 配置按键引脚
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void ADC_Config(void) {
  // ADC配置,用于传感器数据采集
  __HAL_RCC_ADC1_CLK_ENABLE();
  
  ADC_HandleTypeDef hadc;
  hadc.Instance = ADC1;
  hadc.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc.Init.ContinuousConvMode = ENABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.NbrOfConversion = 1;
  HAL_ADC_Init(&hadc);

  ADC_ChannelConfTypeDef sConfig = {0};
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5;
  HAL_ADC_ConfigChannel(&hadc, &sConfig);

  HAL_ADC_Start(&hadc);
}

2. 功能说明
  • 该代码实现了通过ADC读取传感器数据,并通过UART串口发送到上位机。按键用于控制LED的点亮和熄灭,LED状态由GPIO控制。
  • 通过HAL_UART_Transmit()函数,MCU将采集的传感器数据以字符串的形式传输给PC或其他设备。
  • 代码使用了延时函数HAL_Delay(1000)来控制数据发送的频率。

项目扩展
  • 网络通信:可以将UART替换为SPI或I2C与无线模块通信,从而实现物联网设备与云端的连接。
  • 低功耗设计:N32G45x支持低功耗模式,可以结合传感器唤醒功能,实现功耗优化,适用于电池供电的物联网设备。
  • 加密通信:国民技术的MCU具有内置的加密算法引擎,可以用于物联网设备中的安全通信,保障数据的隐私和安全。

总结本文展示了如何使用国民技术的N32G45x MCU进行物联网设备的开发,利用MCU的GPIO、ADC和UART外设实现了传感器数据的采集和传输。通过代码实例,我们可以快速理解MCU的外设配置和基本功能。在实际项目中,国民技术MCU凭借其高性能和安全性,可以广泛应用于智能家居、工业控制和智慧医疗等物联网场景。

使用特权

评论回复
沙发
公羊子丹| | 2024-10-9 08:18 | 只看该作者
感觉这个例子还挺实用的,直接可以用在我的传感器项目里。

使用特权

评论回复
板凳
帛灿灿| | 2024-10-9 08:18 | 只看该作者
这款MCU的低功耗模式做得怎么样?有没有具体的功耗测试数据?

使用特权

评论回复
地板
童雨竹| | 2024-10-9 08:19 | 只看该作者
UART的通信速率可以再提升吗?我想用来传输更大的数据。

使用特权

评论回复
5
万图| | 2024-10-9 08:19 | 只看该作者
有没有人试过用国民技术的MCU做过加密通信?

使用特权

评论回复
6
Wordsworth| | 2024-10-9 08:19 | 只看该作者
这个芯片比STM32价格更有优势,打算考虑换芯片。

使用特权

评论回复
7
Pulitzer| | 2024-10-9 08:19 | 只看该作者
GPIO读写速度怎么样?能不能用来处理高速信号?

使用特权

评论回复
8
Bblythe| | 2024-10-9 08:20 | 只看该作者
代码中加一个中断处理按键的例子会更完善。

使用特权

评论回复
9
Uriah| | 2024-10-9 08:20 | 只看该作者
有没有教程讲讲如何通过WiFi模块实现物联网功能?

使用特权

评论回复
10
Clyde011| | 2024-10-9 08:20 | 只看该作者
看起来这个ADC的精度还不错,打算拿来测一些模拟信号。

使用特权

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

本版积分规则

30

主题

3611

帖子

0

粉丝