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坐标

// ...

}

相关推荐
深圳市恒锐丰科技杨生2 分钟前
SS6209L 30V 集成 MOS 半桥功率芯片|LeadPower 率能半导体
嵌入式硬件·硬件工程
问心无愧05133 分钟前
[极客大挑战 2019]HardSQL
笔记
m0_646429974 分钟前
BCrypt 与 JWT 认证流程学习笔记
笔记·学习
apple_692658858 分钟前
QX 效率启动器安装包:开源生产力工具,快捷键统一入口Raycast免费开源平替版来啦
学习·开源·办公
comyccccc11 分钟前
STM32最小系统板高效布线与铺铜优化学习笔记
单片机·嵌入式硬件
Lsetea15 分钟前
OpenSSL的checkhost显示不匹配却退出0:名称检查与证书验收
linux·https·shell·ssl证书·openssl
张文君27 分钟前
Ubuntu iSCSI CHAP认证与Win11挂载
linux·运维·ubuntu
一直C29 分钟前
嵌入式 Linux 驱动开发学习笔记:中断、等待队列与工作队列
linux·驱动开发·嵌入式硬件·学习·imx6ull
程序员-Benothing36 分钟前
Linux防火墙配置教程:iptables、firewalld、nftables、ufw
linux·运维·服务器
问心无愧051342 分钟前
[GXYCTF2019]BabyUpload
笔记