完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
前言
基于STM32F407实现与迪文串口屏T5L系列的串口通信,实现8位,16位,32位的数据读写。 PS:不包含完整程序,这里只说一下核心的代码。 一、串口需要的相关实现 数据类型 #define u8 unsigned char #define u16 unsigned short #define u32 unsigned int //32位int与8位char互转 typedef union { u32 intdata; u8 chardata[4]; }int_char_unioin; //16位short与8位char互转 typedef union { u16 shortdata; u8 chardata[2]; }short_char_unioin; 需要自定义实现的变量和函数 buffer——串口收发缓冲区数组。 send_buffer()——向串口发送buffer数组。 delay_time——等待迪文屏返回数据的时间,例:5ms,迪文屏上OS的周期是20ms,读写过快可能出问题。(可能有更好的方法,一般情况下几ms还是可以容忍的。) clear_usart()——清空串口缓冲区数组buffer,如用memset()将数组置零即可。 二、迪文屏读写 STM32与迪文屏的通信核心在于向迪文屏中定义的变量进行读写,迪文屏中的变量用一个16位数据表示其地址。迪文屏的用户可操作地址空间为0x1000-0xFFFF,我们要做的就是在这个区间内的一个地址上读写数据,这个地址指向的数据类型由DGUS II(迪文屏开发上位机软件)设置,详细内容可以查看迪文公司的应用开发指南。 2.1 向迪文屏写数据 向迪文屏上的16位地址写8位,16位,32位数据。 /************************************************************************************ * @name : write_to_dwin * @brief : 串口4向迪文屏写数据 * @param : addr_h 变量地址高字节 addr_l 变量地址低字节 value_h 变量值高字节 value_l 变量值低字节 * @retval : ************************************************************************************/ void write_to_dwin(u8 addr_h, u8 addr_l, u8 value_h, u8 value_l) { u8 write_cmd[8] = {0x5A, 0xA5, 0x05, 0x82, addr_h, addr_l, value_h, value_l}; send_buffer(write_cmd, sizeof(write_cmd)); } void writeu8_to_dwin(u16 addr, u8 data) { short_char_unioin m; m.shortdata = addr; write_to_dwin(m.chardata[1], m.chardata[0], 0x00, data); } void writeu16_to_dwin(u16 addr, u16 data) { short_char_unioin m; m.shortdata = addr; short_char_unioin n; n.shortdata = data; write_to_dwin(m.chardata[1], m.chardata[0], n.chardata[1], n.chardata[0]); } void writeu32_to_dwin(u16 addr, u32 data) { short_char_unioin m; m.shortdata = addr; int_char_unioin n; n.intdata = data; u8 write_cmd[10] = {0x5A, 0xA5, 0x07, 0x82, m.chardata[1], m.chardata[0], n.chardata[3], n.chardata[2], n.chardata[1], n.chardata[0]}; send_buffer(write_cmd, sizeof(write_cmd)); } 2.2 从迪文屏读取数据 从迪文屏上的16位地址上读取8位,16位,32位数据。 /************************************************************************************ * @name : read_from_dwin * @brief : 串口4从迪文屏读数据 * @param : addr_h 变量地址高字节 addr_l 变量地址低字节 size 数据大小(单位:字/两字节/16位) * @retval : ************************************************************************************/ void read_from_dwin(u8 addr_h, u8 addr_l, u8 size) { clear_usart(); u8 read_cmd[7] = {0x5A, 0xA5, 0x04, 0x83, addr_h, addr_l, size}; send_buffer(read_cmd, sizeof(read_cmd)); } u8 readu8_from_dwin(u16 addr) { u8 data = 0; short_char_unioin m; m.shortdata = addr; read_from_dwin(m.chardata[1], m.chardata[0], 0x01); delay_xms(delay_time); if (buffer[0] == 0x5A && buffer[1] == 0xA5 && buffer[3] == 0x83) //返回数据检查 { if(buffer[4] == m.chardata[1] && buffer[5] == m.chardata[0]) //地址检查 { data = buffer[8]; } } clear_usart(); return data; } u16 readu16_from_dwin(u16 addr) { u16 data = 0; short_char_unioin m; short_char_unioin n; m.shortdata = addr; read_from_dwin(m.chardata[1], m.chardata[0], 0x01); delay_xms(delay_time); if (buffer[0] == 0x5A && buffer[1] == 0xA5 && buffer[3] == 0x83) //返回数据检查 { if(buffer[4] == m.chardata[1] && buffer[5] == m.chardata[0]) //地址检查 { n.chardata[1] = buffer[7]; n.chardata[0] = buffer[8]; data = n.shortdata; } } clear_usart(); return data; } u32 readu32_from_dwin(u16 addr) { u32 data = 0; short_char_unioin m; m.shortdata = addr; int_char_unioin n; read_from_dwin(m.chardata[1], m.chardata[0], 0x02); delay_xms(delay_time); if (buffer[0] == 0x5A && buffer[1] == 0xA5 && buffer[3] == 0x83) //返回数据检查 { if(buffer[4] == [1] && buffer[5] == m.chardata[0]) //地址检查 { n.chardata[3] = buffer[7]; n.chardata[2] = buffer[8]; n.chardata[1] = buffer[9]; n.chardata[0] = buffer[10]; data = n.intdata; } } clear_usart(); return data; } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1754 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1613 浏览 1 评论
1053 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
721 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1667 浏览 2 评论
1931浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
716浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
562浏览 3评论
587浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
546浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 14:31 , Processed in 1.215675 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号