ARM学习笔记(12)

PWM与电容触控屏裸机驱动要点

PWM部分

计数器时钟配置为1MHz时,每个计数步长对应1微秒。输出1KHz的PWM信号,周期就是1ms,对应周期寄存器的数值设为1000即可。

PWM的周期由周期寄存器配置,占空比由采样比较寄存器控制,占空比的变化逻辑和引脚极性直接相关:

  • 引脚默认高电平:采样寄存器值越大,占空比越大

  • 引脚默认低电平:采样寄存器值越大,占空比越小

// PWM初始化:1MHz计数时钟,1KHz周期,50%占空比

void pwm_init(void)

{

// 配置引脚复用为PWM功能

pwm_gpio_config();

// 设置周期寄存器:1ms = 1000 * 1us

PWM->PERIOD = 1000;

// 设置比较寄存器:50%占空比

PWM->CMP = 500;

// 配置引脚极性、启动计数器

PWM->CR = (1 << 0) | (0 << 1);

}

电容触控屏部分

电容触控屏通过感应电压变化识别触摸操作,和电阻屏的工作原理不同,电阻屏需要做校准。

常用的触控芯片有两款,都是4.3寸屏用的:

  • GT1158:I2C设备地址 0x14

  • GT9147:I2C设备地址 0x5D,支持最多5点多点触控

芯片内部寄存器可以直接读取设备ID、触摸点数、每个点的XY坐标等信息,坐标数据存放在0x8158 ~ 0x815B地址区间。

驱动流程

  1. 配置RST和INT引脚的复用功能与电气属性

  2. 拉取RST引脚,完成触控芯片硬件复位

  3. 初始化I2C2外设,作为和芯片通信的总线

  4. 配置GIC中断控制器:注册gt9147中断处理函数,设置中断优先级,使能对应中断通道

  5. 配置INT引脚的中断触发方式,下降沿触发(配置值为01)

  6. 读取芯片ID(寄存器地址0x8140),确认I2C通信正常

  7. 中断服务函数中,先判断当前按下的点数,再依次读取每个点的坐标

// GT9147 读指定寄存器

unsigned char gt9147_read(unsigned short reg)

{

unsigned char data;

i2c_start();

i2c_write_byte(0x5D << 1);

i2c_write_byte(reg >> 8);

i2c_write_byte(reg & 0xff);

i2c_repeat_start();

i2c_write_byte((0x5D << 1) | 1);

data = i2c_read_byte(0);

i2c_stop();

return data;

}

// 触控中断处理函数

void gt9147_irq_handler(void)

{

unsigned char point_num;

// 读取当前触摸点数

point_num = gt9147_read(0x814F) & 0x0F;

// 根据点数依次读取X、Y坐标

// ...

}

相关推荐
奇思妙想聪明勤奋的小羊1 小时前
ai-agent-book第五章:Coding Agent 与通用 Agent 学习笔记
人工智能·笔记·学习
可涵不会debug1 小时前
C++ std::bind 实战教程:线程池、回调场景全覆盖
linux·开发语言·c++
优化Henry2 小时前
BBU与RRU光链路详解:从双纤一收一发到单纤双向
网络·笔记·学习·5g·tdd
yi0112 小时前
DAY17: LeetCode 139|单词拆分:从“把单词删掉”到用 DP 记录合法切口
人工智能·笔记·python·算法·leetcode·动态规划
璞致电子2 小时前
基于 AD9361 (PZSDR‑P201Pro) 软件无线电实战综述:从板卡选型、硬件平台升级到 GNU Radio QPSK 完整收发链路
经验分享·嵌入式硬件·fpga开发·软件无线电·sdr·璞致电子
青梅味猪大肠2 小时前
【操作系统-26】进程互斥软件实现-Peterson算法
linux·运维·服务器
高斯的手稿08012 小时前
CS+中,全局变量的正确管理方式
嵌入式硬件
辣知3 小时前
辣知·化智68 半仙隐士渭水钓的不是鱼
学习
俊基科技3 小时前
喇叭 95dB、麦克风贴到 1cm,回音还能消干净?拆解 A-29P 的消回音设计
嵌入式硬件·硬件开发·ai降噪·回音消除·拾音降噪