案例2
案例3
/* 主函数 */
int main(void)
{
/* 系统初始化 */
GPIO_Config();
DAC_Config();
while(1)
{
/* 按键检测 */
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) // 按键按下
{
if(press_time == 0) // 按键初次按下
press_time = HAL_GetTick();
/* 长按检测 */
if(HAL_GetTick() - press_time >= LONG_PRESS_TIME)
{
flash_mode = 0;
Set_LED_Brightness(4095); // 最大亮度
}
}
else // 按键释放
{
if(press_time > 0) // 之前按键是按下状态
{
uint32_t press_duration = HAL_GetTick() - press_time;
if(press_duration < SHORT_PRESS_TIME) // 短按
{
press_count++;
if(press_count == 1)
last_press_time = HAL_GetTick();
/* 双击检测 */
if(press_count == 2)
{
if(HAL_GetTick() - last_press_time < DOUBLE_CLICK_TIME)
{
flash_mode = 1; // 进入闪烁模式
press_count = 0;
}
else
{
press_count = 1;
last_press_time = HAL_GetTick();
}
}
}
else if(press_duration < LONG_PRESS_TIME) // 单击
{
if(!flash_mode)
{
brightness_level = (brightness_level + 1) % 5;
Set_LED_Brightness(brightness_value[brightness_level]);
}
}
press_time = 0;
}
}
/* 闪烁模式处理 */
if(flash_mode)
{
Flash_Mode_Handler();
}
/* 双击超时处理 */
if(press_count == 1 && HAL_GetTick() - last_press_time >= DOUBLE_CLICK_TIME)
{
press_count = 0;
}
}
}
案例4
案例5
RV1106开发板驱动ST7701S LCD屏幕开发流程 */
/*
硬件连接
LCD引脚连接:
RESET -> GPIO
CS -> GPIO
RS/DC -> GPIO
RGB接口 -> RV1106 RGB接口
CLK -> RV1106时钟输出
背光控制 -> GPIO
驱动开发步骤
设备树配置
:
{
status = "okay";
panel {
compatible = "sitronix,st7701s";
width = <640>;
height = <480>;
<MEDIA_BUS_FMT_RGB565_1X16>; =
{
<&timing0>; =
timing0: timing0 {
<27000000>; =
hactive = <640>;
vactive = <480>;
<2>; =
<8>; =
<8>; =
<2>; =
<8>; =
<8>; =
};
};
};
};
LCD驱动程序
:
实现panel_simple_probe()初始化函数
配置LCD时序参数
实现enable/disable函数
实现背光控制
Buildroot配置
make menuconfig:
选择rv1106_defconfig
使能DRM驱动
使能ST7701S面板驱动
应用程序开发
API进行显示控制:
#include <drm/drm.h>
#include <drm/drm_mode.h>
int main()
{
1. 打开DRM设备
int fd = open("/dev/dri/card0", O_RDWR);
2. 获取显示资源
drmModeRes *res = drmModeGetResources(fd);
3. 创建framebuffer
struct drm_mode_create_dumb create = {
640, =
480, =
16, // RGB565 =
};
DRM_IOCTL_MODE_CREATE_DUMB, &create);
4. 映射framebuffer
struct drm_mode_map_dumb map = {
create.handle, =
};
DRM_IOCTL_MODE_MAP_DUMB, &map);
void *fb = mmap(0, create.size, PROT_READ|PROT_WRITE,
fd, map.offset);
5. 填充红色背景
uint16_t red = 0xF800; // RGB565红色
i = 0; i < 640*480; i++) {
red; =
}
6. 绘制黑色"hello"文字
使用字体库绘制文字
7. 显示framebuffer
crtc_id, fb_id, 0, 0, &conn_id, 1, mode);
return 0;
}
调试验证
检查LCD初始化时序
验证RGB时序参数
测试显示效果
优化刷新率和显示质量
注意事项
电源时序要求
RGB接口时序
背光控制时序
DMA传输配置
显示缓冲区管理
*/
扫码加入
硬件技术交流群
面包板社区DIY活动进行中!👇
https://mbb.eet-china.com/forum/topic/147007_1_1.html
社
在面包板社区博客/论坛分享你的DIY电子设计,并在发布文章时添加【电子DIY】标签,字数不限,文章通过社区评审,将有丰富奖励送给您!
【奖项设置】
二等奖(不限人数):福禄克F15B PRO MAX万用表、华为WATCH FIT 2...(任选一个)
三等奖(不限人数):小米手环9 NFC版、小米mini筋膜枪2C、价值¥300电子常用工具大礼包...(任选一个)
【文章要求】
1、内容要求原创,必须和电子行业相关,且首次发布于互联网
2、内容应包括:设计思路、成品展示(如电路原理、功能展示、成本控制方案或清单、代码等)涉及核心知识产权的内容可不展示。
3. 活动期间,同一ID可多次参加,等质量条件下多发作品可累积评分。
活动时间:2024.11.13 - 2025.02.13
点击阅读原文,了解活动详情!