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

// ...

}

相关推荐
Dev_XH6 分钟前
【成品设计】基于物联网的旅游生态农业互动系统
stm32·单片机·嵌入式硬件·物联网·旅游
旖旎夜光1 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
旖旎夜光2 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
叼烟扛炮7 小时前
[LangChain] 学习笔记(07):大模型长出手脚——工具(Tools)定义与调用闭环
笔记·学习·langchain
叼烟扛炮11 小时前
[LangChain] 学习笔记(06):突破大模型限制——结构化输出(Structured Output)
windows·笔记·学习·langchain
且从容.12 小时前
VUE3学习笔记(根据黑马教程总结)
笔记·学习
Industio_触觉智能13 小时前
RK3506 Buildroot系统目录地图-上|7个关键符号链接与构建产物全解析
嵌入式硬件·sdk·智能硬件·固件·瑞芯微·系统编译·rk3506
蒸蒸yyyyzwd14 小时前
关于 AI 开发相关的一些面经。
笔记·学习
LongRunning14 小时前
【Linux】RK3568-OpenCV+YOLO(八)
linux·opencv·yolo
2603_9696948515 小时前
JDBC 基础学习笔记:API 核心原理解析与 CRUD 代码实操
数据库·笔记·mysql·学习方法·database·sql注入