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);