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地址区间。
驱动流程
-
配置RST和INT引脚的复用功能与电气属性
-
拉取RST引脚,完成触控芯片硬件复位
-
初始化I2C2外设,作为和芯片通信的总线
-
配置GIC中断控制器:注册gt9147中断处理函数,设置中断优先级,使能对应中断通道
-
配置INT引脚的中断触发方式,下降沿触发(配置值为01)
-
读取芯片ID(寄存器地址0x8140),确认I2C通信正常
-
中断服务函数中,先判断当前按下的点数,再依次读取每个点的坐标
// 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坐标
// ...
}