ACM32F070开发板是一款功能强大的MCU开发板,支持多种外设接口,包括LCD屏、触控按键、串口和ADC等。下面我将为你提供关于如何使用ACM32F070开发板点亮LCD屏、实现触控按键功能、串口通信以及ADC(模数转换器)的基本步骤和注意事项。
串口原理连接:
串口连接是通过YTPE C接口与PC连接,板载上与ACH512再经过SED这个排针端子,再接到MCU PA2(TX2) PA3(RX2).
MCU引脚连接处:

ACM32F070开发板与SHT30温湿度传感器之间的连接,通过MCU的PD6和PD7接口实现,是一个常见的硬件配置。SHT30传感器以其高精度的温度和湿度测量能力而著称,其中温度精度可达正负0.3摄氏度,湿度精度为正负2%。这样的精度对于许多应用来说都是足够的,尤其是在需要精确环境监控的场合。
SHT30传感器采用IIC(Inter-Integrated Circuit,集成电路总线)通信协议进行数据传输,这是一种串行通信协议,特别适用于集成电路之间的通信。IIC通信协议的优势在于其高效性和可靠性,它支持多主机并行通信和多从机实时响应,这使得在多个设备之间进行数据传输时更加灵活和高效。同时,IIC通信的速度可以达到1MHZ,这在许多应用中都是足够的,可以满足快速数据采集和处理的需求。
关于SHT30模块的两个地址,这通常用于在IIC通信中识别不同的设备。每个设备都有一个唯一的地址,这样主机就可以通过地址来指定与哪个设备进行通信。在ACM32F070开发板与SHT30传感器通信时,主机需要知道传感器的地址,以便正确地发送和接收数据。
下面继续更新LCD屏的显示操作:
// 定义一个函数,用于在LCD上显示一个32位无符号整数,但仅显示其四位数的部分
void LCD_DisplayNum_YR1618A(uint32_t Num)
{
// 定义一个数组,用于存储四位数的每一位的数值
uint32_t ram_buff[4];
// 初始化数组,将所有元素设置为0
ram_buff[0]=0;
ram_buff[1]=0;
ram_buff[2]=0;
ram_buff[3]=0;
// 下面这行代码是注释掉的,因为ram_buff数组只有4个元素,索引从0到3,不能访问第5个元素
// 如果取消注释,将会导致数组越界访问的错误
// ram_buff[4]=0;
// 如果输入的数值大于9999,则将其限制为9999,因为LCD只显示四位数
if(Num>9999) Num=9999;
// 调用一个函数(可能是自定义的)来获取Num的每一位数字,并将这些数字存储在ram_buff数组中
// 注意:这里的Get_RAM_NUM_DATA函数看起来有些不寻常,因为它接受两个相同的参数Num
// 正常情况下,一个参数应该是要转换的数值,另一个参数可能是存储结果的数组
Get_RAM_NUM_DATA(ram_buff,Num,Num);
// 使用HAL库函数将每一位数字写入LCD的相应位置
// lcdhandle_YR1618A可能是LCD的句柄或配置结构体
HAL_LCD_Write(&lcdhandle_YR1618A,0,ram_buff[0]); // 写入千位
HAL_LCD_Write(&lcdhandle_YR1618A,1,ram_buff[1]); // 写入百位
HAL_LCD_Write(&lcdhandle_YR1618A,2,ram_buff[2]); // 写入十位
HAL_LCD_Write(&lcdhandle_YR1618A,3,ram_buff[3]); // 写入个位
// 下面这行代码是注释掉的,因为ram_buff数组只有4个元素,索引从0到3,不能访问第5个元素
// 如果取消注释,将会导致数组越界访问的错误
// HAL_LCD_Write(&lcdhandle_YR1618A,4,ram_buff[4]);
}
// 在一个while循环中:
// 增加Num1的值
Num1++;
// 等待500毫秒
System_Delay_MS(500);
// 调用LCD_DisplayNum_YR1618A函数,将Num1的当前值显示在LCD上
LCD_DisplayNum_YR1618A(Num1);这个代码的意思是增加变量来显示数字的增加。下面是显示效果:


下面上IIC代码:
// I2C初始化函数
void I2C_Init(void)
{
// 设置I2C句柄的Instance成员为I2C2,即使用I2C2外设
I2C_Handle.Instance = I2C2;
// 设置I2C的工作模式为主模式
I2C_Handle.Init.I2C_Mode = I2C_MODE_MASTER;
// 启用发送自动结束功能
I2C_Handle.Init.Tx_Auto_En = TX_AUTO_EN_ENABLE;
// 设置I2C的时钟速度为标准速度(通常为100kHz)
I2C_Handle.Init.Clock_Speed = CLOCK_SPEED_STANDARD;
// 禁用I2C时钟拉伸模式
I2C_Handle.Init.No_Stretch_Mode = NO_STRETCH_MODE_NOSTRETCH;
// 调用HAL库函数初始化I2C外设
HAL_I2C_Init(&I2C_Handle);
}
// SHT30的I2C引脚定义
// SHT30使用I2C2外设
#define SHT30_I2C I2C2
// ----------------- SHT30 IIC端口定义 ----------------
// SHT30的时钟线引脚定义为GPIOD6
#define SHT30_SCL_PIN GPIOD6
// SHT30的时钟线引脚复用功能定义为I2C2的SCL线
#define SHT30_SCL_PIN_AF GPIOD6_AF_I2C2_SCL
// SHT30的数据线引脚定义为GPIOD7
#define SHT30_SDA_PIN GPIOD7
// SHT30的数据线引脚复用功能定义为I2C2的SDA线
#define SHT30_SDA_PIN_AF GPIOD7_AF_I2C2_SDA
// SHT30复位函数
uint8_t SHT30_Reset(I2C_HandleTypeDef I2C_Handle)
{
HAL_StatusTypeDef Status; // HAL状态类型变量,用于存储函数执行结果
uint8_t cmd_buffer[2]; // 发送命令的缓冲区,大小为2字节
// 将SOFT_RESET_CMD的高8位存储在cmd_buffer[0]中
cmd_buffer[0] = SOFT_RESET_CMD >> 8;
// 将SOFT_RESET_CMD的低8位存储在cmd_buffer[1]中
cmd_buffer[1] = SOFT_RESET_CMD & 0XFF;
// 调用HAL库函数向SHT30发送软复位命令
Status = HAL_I2C_Master_Transmit(&I2C_Handle, SHT30_SLAVE_ADDRESS, cmd_buffer, 2, 100);
// 延时500毫秒,等待SHT30完成复位
System_Delay_MS(500);
// 清除状态命令的高8位
cmd_buffer[0] = CLEAR_STATES_CMD >> 8;
// 清除状态命令的低8位
cmd_buffer[1] = CLEAR_STATES_CMD & 0XFF;
// 调用HAL库函数向SHT30发送清除状态命令
Status = HAL_I2C_Master_Transmit(&I2C_Handle, SHT30_SLAVE_ADDRESS, cmd_buffer, 2, 100);
// 延时200毫秒,等待SHT30完成状态清除
System_Delay_MS(200);
// 返回状态值,如果发送成功,则Status为HAL_OK
return Status;
}通过IIC采集温湿度的值,显示在LCD屏上。

串口:
Uart_Init函数注释
// 初始化UART的函数
void Uart_Init(uint32_t fu32_Baudrate)
{
// 设置UART2句柄的Instance成员为UART2外设
UART2_Handle.Instance = UART2;
// 设置波特率为传入的参数值
UART2_Handle.Init.BaudRate = fu32_Baudrate;
// 设置数据位长度为8位
UART2_Handle.Init.WordLength = UART_WORDLENGTH_8B;
// 设置停止位为1位
UART2_Handle.Init.StopBits = UART_STOPBITS_1;
// 不使用校验位
UART2_Handle.Init.Parity = UART_PARITY_NONE;
// 设置UART模式为发送/接收调试模式
UART2_Handle.Init.Mode = UART_MODE_TX_RX_DEBUG;
// 不使用硬件流控制
UART2_Handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
// 调用HAL库函数初始化UART2
HAL_UART_Init(&UART2_Handle);
/* 注释:UART_DEBUG_ENABLE用于控制printfS函数的行为,可能表示开启了某种调试功能 */
}打印MCU相关信息的代码
// 使用printfS函数打印MCU的运行状态和系统时钟信息
printfS("MCU is running, HCLK=%dHz, PCLK=%dHz\n", System_Get_SystemClock(), System_Get_APBClock());打印触摸按下的键的代码// 初始化触摸屏按键
uint8_t ret = TouchKey_Init();
if(ret)
{
// 如果初始化失败,则打印错误信息
printfS("TouchKey_Init is Fail!\r\n");
}
else
{
// 如果初始化成功,则打印成功信息
printfS("TouchKey_Init is Success!\r\n");
}
// 打印当前触摸按键的状态
printfS("TK_%d\r\n", fu8_Tkey_state);
我要赚赏金
