为了能够使用开发板NUCLEO-F746ZG与智能显示模块建立联系,本想着很简单的一件事情,可走了不少的弯路,费了一点周折。
先说遇到的囧事:
(1)NUCLEO-F746ZG开发板的UART8不能使用。使用STM32CubeMX配置完成后,写完程序,开发板定时发送数据,使用USB转TTL的工具监测发送数据,发现一直没有数据发出。我简单看了一下时钟配置:UART8的时钟与LPTIM在一起,是不是这个原因,我还得好好看看数据手册查找一下。
使用UART7一点问题没有,反复验证UART8始终没有数据发出,很奇怪。
(2)TTL转RS232模块,这个以前从网上买的,给我留了一个大坑:它的DB9定义中2脚和3脚定义是反的,本来2脚应该是RXD,3脚是TXD,没想到2脚是TXD,3脚是RXD。
让我一顿好测试呀,换了模块,飞线,折腾半天。
前两个问题解决以后,那就简单多了。在程序中定时发送数据:
void SendHIM(uint16_t cmd, uint8_t *Tdata,uint16_t CharLen)
{
uint16_t i=0;
SendBuf_COM[0]=FrameHeader; //0xAA
SendBuf_COM[1]=cmd; //命令
SendBuf_COM[2+CharLen] = FrameEnd>>24;
SendBuf_COM[3+CharLen] = (FrameEnd>>16)&0xff;
SendBuf_COM[4+CharLen] = (FrameEnd&0xffff)>>8;
SendBuf_COM[5+CharLen] = FrameEnd&0xff;
if(CharLen>0){
for(i=0; i<CharLen; i++) //数据
{
SendBuf_COM[2+i]=*(Tdata++);
}
}
sendCount=6+CharLen; //发送数据长度
HAL_UART_Transmit(&huart7,(uint8_t*)SendBuf_COM,sendCount,1000); //发送接收到的数据
while(__HAL_UART_GET_FLAG(&huart7,UART_FLAG_TC)!=SET); //等待发送结束
}
另外我把屏的命令定义了,想用的可以随时复制粘贴:
//Parameter setting
#define CMD_ShakeHands 0x30 //用于确认屏是否连接正常
#define CMD_ReadVersion 0x31 //读版本号
#define CMD_ReadPageNumber 0x32 //读取当前正在显示的页面 ID
#define CMD_TouchCoordinatesBack 0x72 //0X73 //自动返回触摸位置坐标
#define CMD_TouchDataBack 0x77 //自动返回数据(键盘录入数据或触摸键运算操作数据)
#define CMD_TouchIDback 0x78 //自动返回页面 ID 和触摸键 ID
#define CMD_SetWorkMode 0xE0 //设定模块的通信波特率、触摸返回码、文本显示模式
#define CMD_CutoverProject 0xE1 //切换到指定工程并显示
#define CMD_SetTouchScreenCalibration 0xE4 //设定触摸屏进入校准模式
#define CMD_SetScreensaver 0x5E //设置进入屏保时间和屏保状态下的背光亮度
#define CMD_SetBacklight 0x5F //设置背光亮度
#define CMD_SetBuzzerDuration 0x79 //设置蜂鸣器 1 次的鸣叫时间
#define CMD_BuzzerControl 0x7A //控制蜂鸣器打开关闭、声音频率、时间长短
#define CMD_SetClock 0x9C //设置模块日期时间
#define CMD_ReadClock 0x9B //读取模块日期时间
#define CMD_WriteFlash 0x90 //写入数据到 flash (Flash 中数据断电可保存)
#define CMD_ReadFlash 0x91 //读取 flash 数据
#define CMD_ReadUSRBINData 0x93 //读取 USR.BIN 中用户文件数据
#define CMD_FormatInternalStorage 0xE2 //格式化内部存储器(工程包,Flash 数据,加密设定都会被清空)
#define CMD_DecryptInternalMemory 0xE3 //用于内部存储器盘加密的情况下, 对内部存储器进行一次解锁
//Display control
#define CMD_PageDisplay 0x70 //显示指定的页面(画面)
#define CMD_SetControlFontColor 0x7E //更改页面中字符串变量或数字变量的字体颜色
#define CMD_SetControlBackgroundColor 0x7F //改变页面中字符串变量或数字变量的背景色
#define CMD_SetFont 0xE7 //设置字库国家码和外扩 Codepage
#define CMD_RefreshControl 0xE8 //设定当前画面暂停刷新或开始刷新,暂停刷新后触摸键无响应、变量显示不更新数据。
//Variable read and write
#define CMD_WriteNumericVariables 0x82 //写数字变量 可往 16/32/64 位数字变量地址中连续写入多个数据
#define CMD_ReadNumericVariables 0x83 //读数字变量 读取 16/32/64 位数字变量地址中的连续多个数据
#define CMD_WriteCurveData 0x4D //曲线数据写 对曲线图数据写入, 控制曲线图的显示,以修改的方式进行刷新
#define CMD_PushLefttoWriteCurveData 0x4E //左推进写曲线数据 对曲线图数据写入, 以推进的方式控制曲线图的显示有利于对数据变化随时间变化的曲线显示减小传输的数据量
#define CMD_Set8bitSystemRegister 0x3B //8 位系统寄存器设定 用于控制计数寄存器的工作方式
#define CMD_ReadSystemRegisterData 0x3C //读取系统寄存器数据 读取寄存器中数据
#define CMD_WriteBitmapData 0x4B //位图数据写 单色位图数据写入, 控制位图显示
#define CMD_WriteBitmapCompressedData 0x4C //位图压缩数据写 单色位图压缩数据写入, 可减小数据量,控制位图显示
#define CMD_WriteStringVariable 0x42 //写字符串变量
#define CMD_ReadStringVariable 0x43 //读字符串变量 对字符串变量进行读写, 可用于控制字符串控件显示
#define CMD_FillStringVariables 0x46 //填充字符串变量
#define CMD_Write16bitNumericVariable 0x3D //写 16 位数字变量 对 16 位数据变量进行读写, 可用于控制:数值控件显示, 图标索引显示,十进位图标显示进度条显示, VPK 操作等 0x3E 读 16 位数字变量
#define CMD_Read16bitNumericVariable 0x3E //填充 16 位数字变量
#define CMD_Fill16bitNumericVariable 0x3F //填充 16 位数字变量
#define CMD_Write32bitNumericVariable 0x44 //写 32 位数字变量对 32 位数据变量进行读写。可用于控制数值控件显示控制十进制图标显示
#define CMD_Read32bitNumericVariable 0x45 //读 32 位数字变量
#define CMD_Fill32bitNumericVariable 0x47 //填充 32 位数字变量
#define CMD_Write64bitNumericVariable 0x48 //写 64 位数字变量
#define CMD_Read64bitNumericVariable 0x49 //读 64 位数字变量 对 64 位数据变量进行读写。可用于控制数值控件显示
#define CMD_Fill64bitNumericVariable 0x4A //填充 64 位数字变量
#define CMD_VariableFlashDataExchange 0x94 //变量与 Flash 数据交换 对变量与 Flash 之间进行数据交换
#define CMD_WriteusrbinFiletoVP 0x95 //写 usr.bin 文件到 VP 从 usr.bin 文件中读取数据到 VP 变量中
#define FrameHeader 0xAA //帧头
#define FrameEnd 0xCC33C33C //帧尾
一切准备就绪,编译完成后,下载程序,请看效果:
这次只是简单的开发板与显示屏建立联系,程序就不上传了,等我把程序整理完成后,把功能做进去再分享给大家。