打印
[AT32F403/403A]

雅特力AT32 MCU在嵌入式系统中的应用及代码实现

[复制链接]
39|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
帛灿灿|  楼主 | 2024-10-9 08:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
雅特力AT32系列MCU凭借其高性价比、强大的功能和丰富的外设接口,在嵌入式系统设计中受到广泛的欢迎。AT32系列MCU拥有多种型号,可以满足从简单控制到复杂系统设计的需求,尤其在工业控制、物联网和智能设备中有着广泛的应用。本文将以AT32F403A系列为例,展示如何在嵌入式系统中使用该MCU,实现基本的GPIO控制、ADC采集和UART通信等功能。
AT32F403A简介AT32F403A是雅特力科技推出的高性能Cortex-M4内核MCU,最高工作频率可达200MHz。它集成了丰富的外设资源,如USART、ADC、I2C、SPI等,特别适合需要高速运算和数据处理的应用场景。同时,该MCU具有低功耗特性,非常适合应用在电池供电的嵌入式设备中。
项目配置
  • 开发环境:Keil MDK
  • 芯片型号:AT32F403A
  • 使用外设:GPIO、ADC、UART
  • 功能目标:实现按键检测、LED控制、传感器数据采集与串口通信
代码实现以下是AT32F403A MCU的代码实现,主要包括系统时钟配置、GPIO配置、ADC采集和UART通信的初始化和使用。
1. 初始化外设
#include "at32f4xx.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 adc_value = 0;

  while (1) {
    // 读取ADC数据
    adc_value = HAL_ADC_GetValue(&hadc1);
   
    // 通过UART发送ADC数据
    char buffer[20];
    sprintf(buffer, "ADC Value: %d\r\n", adc_value);
    HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
   
    // 按键按下则点亮LED
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
    } else {
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
    }

    HAL_Delay(500);  // 延时500ms
  }
}

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 GPIO_Config(void) {
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  // 配置LED引脚(PC13)
  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);

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

void UART_Config(void) {
  __HAL_RCC_USART2_CLK_ENABLE();
  
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  // 配置PA2、PA3为USART2引脚
  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;
  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 ADC_Config(void) {
  __HAL_RCC_ADC1_CLK_ENABLE();
  
  ADC_HandleTypeDef hadc1;
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  HAL_ADC_Init(&hadc1);

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

  HAL_ADC_Start(&hadc1);
}

代码说明
  • 系统时钟配置:代码中系统时钟配置为72MHz,外部时钟源HSE,适用于大多数应用场景。
  • GPIO配置:PA0为输入引脚,连接按键。PC13为输出引脚,控制LED的点亮与熄灭。
  • UART配置:USART2串口用于发送采集到的传感器数据,波特率设定为115200。
  • ADC配置:ADC1用于采集传感器的模拟数据,读取的数据通过UART发送至主机进行处理。

项目扩展在实际应用中,AT32F403A系列MCU的功能远不止于此,还可以结合更多外设和功能进行扩展,例如:
  • I2C接口通信:可以扩展传感器模块,如使用I2C通信与外部EEPROM或温湿度传感器模块通信。
  • SPI接口通信:结合SPI外设实现高速数据传输,适用于屏幕驱动或Flash存储器读写。
  • 低功耗模式:针对电池供电设备,可利用MCU的低功耗模式,实现更长时间的续航。

总结本文通过代码实例展示了雅特力AT32F403A MCU在嵌入式系统中的基本应用,利用GPIO、ADC和UART外设实现了简单的传感器数据采集与处理。通过灵活的外设组合,AT32 MCU可以满足各种嵌入式系统的需求,特别是在工业控制和物联网设备中具有广泛的应用前景。借助AT32F403A的强大功能,开发人员能够快速搭建高效、低功耗的嵌入式应用。


使用特权

评论回复
沙发
公羊子丹| | 2024-10-9 08:25 | 只看该作者
这个例子很实用,适合刚接触AT32的人。

使用特权

评论回复
板凳
周半梅| | 2024-10-9 08:25 | 只看该作者
UART这块儿我还不太熟,代码让我受益匪浅

使用特权

评论回复
地板
童雨竹| | 2024-10-9 08:25 | 只看该作者
AT32F403A性价比确实高,打算在下个项目试试。

使用特权

评论回复
5
万图| | 2024-10-9 08:26 | 只看该作者
这个ADC的采样精度如何?适合用来做什么项目?

使用特权

评论回复
6
Wordsworth| | 2024-10-9 08:26 | 只看该作者
有没有人知道如何在这个MCU上实现I2C通信?

使用特权

评论回复
7
Pulitzer| | 2024-10-9 08:26 | 只看该作者
我在低功耗模式下有点问题,有没有参考的解决方案?

使用特权

评论回复
8
Bblythe| | 2024-10-9 08:27 | 只看该作者
想看看这个芯片和STM32的性能对比,谁有相关测试数据?

使用特权

评论回复
9
Uriah| | 2024-10-9 08:27 | 只看该作者
按键检测和LED控制很常用,这个代码可以直接套用到我的项目。

使用特权

评论回复
10
Clyde011| | 2024-10-9 08:27 | 只看该作者
UART通信速率能不能更高?有没有波特率调整的代码?

使用特权

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

本版积分规则

29

主题

3687

帖子

0

粉丝