本文根据一周CC2541笔记汇总得来——
适合概览和知识快速索引——
全部链接:
中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探
中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~
OSAL操作系统-实验20 模拟IIC通信+硬件IIC(Mpu6050)
一、OLED
二、OSAL 操作系统-实验 11 普通按键
按键的中断代码和使用方法
![](https://i-blog.csdnimg.cn/blog_migrate/f330b6fca714f495a1a122a14ba0724c.png)
P01 即是 cc2054x 的 p0.1, 通过 10k 电阻接地, 因此 p0.1 作为输入的时候, 常态就是低电平, 当 s1, 按下的时候, p0.1 变成高电平。
❤ 在 Hal_key.c (ble-cc254x-1.3.2-osal\components\hal\target\cc2540eb) 中,
是
osal
的按键
驱动文件, 主要是实现 按键的初始化与中断服务函数, 里边也包含 5 向按键的驱动, 5 向
按键与 s1 按键相比, 多了一个 adc 采样, 5 向按键, 实际上是先触发一个按键中断, 然后,
再进行 adc 采样, 每个方向的按键被按下后, 由于分压不一样, 因此 adc 数值也就不一样,
这样就能区分不同的按键了。
驱动文件, 主要是实现 按键的初始化与中断服务函数, 里边也包含 5 向按键的驱动, 5 向
按键与 s1 按键相比, 多了一个 adc 采样, 5 向按键, 实际上是先触发一个按键中断, 然后,
再进行 adc 采样, 每个方向的按键被按下后, 由于分压不一样, 因此 adc 数值也就不一样,
这样就能区分不同的按键了。
驱动比较复杂,应用相对简单
Hal_key.c (ble-cc254x-1.3.2-osal\components\hal\target\cc2540eb)
![](https://i-blog.csdnimg.cn/blog_migrate/a2834504d2ded8ec601ae7476698be3e.png)
上升沿触发P01引脚
![](https://i-blog.csdnimg.cn/blog_migrate/5162c566de2d5301ac5793e1c8fa19ae.png)
(用了很多宏定义!便于移植)
![](https://i-blog.csdnimg.cn/blog_migrate/af25916d7bc0323357dd8893a7adacd8.png)
默认为上升沿中断
279-281是P01口中断配置
![](https://i-blog.csdnimg.cn/blog_migrate/27995a4c937ed95fec4a1d29e190bd70.png)
中断函数为halProcessKeyInterrupt()
![](https://i-blog.csdnimg.cn/blog_migrate/e2c08c47db6af84d9395bdda32da6be0.png)
在该中断处理函数中检测中断标志位,如果触发中断了则用延时去抖(纯延时)。
- 上面是按键事件检测
- 下面是按键事件传输到应用层处理
![](https://i-blog.csdnimg.cn/blog_migrate/cc132557d0595010503824a9abacfe5d.png)
这个在中负责
处理中断事件
216 行, 就是按键中断并延时去抖动后的查询函数调用
这个
HalKeyPoll就在Hal_key.c
![](https://i-blog.csdnimg.cn/blog_migrate/eb8884e578760cbb7cad40d9326a917c.png)
查询到按键按下
![](https://i-blog.csdnimg.cn/blog_migrate/f85c6bab6e2d806825327e1ecf5725b5.png)
435 行, 执行一个回调函数, 该
回调函数直接就是在我们的应用层的
同时注意到一点:
notify(下面代码);不采用中断时用来标记当前按键状态是否转变,采用中断时也要根据keys的值相应设置
![](https://i-blog.csdnimg.cn/blog_migrate/bf76b7e52c04e168193136f7a0d759b0.png)
上面用到回调技术是在下面设置的@!!
总之, 现在知道, 只要有按键按下,就会执行 SimpleBLETest_ProcessEvent 这个函
数, 其实,按键释放的时候也都有一个按键消息送上来,方便我们对按键状态做判断。而
SimpleBLETest_ProcessEvent 这个函数,就是在我们的应用层里的。至此,按键流程分析
完毕。
OSAL_SimpleBLETest.c
![](https://i-blog.csdnimg.cn/blog_migrate/a10a3fbf6ce61d1013f4eeb41c2cdf0b.png)
105 行定义了该
回调函数, 至于这个函数在哪里别赋值等, 我这里点到即可, 不作深入分析了。
总之, 现在知道, 只要有按键按下,就会执行 SimpleBLETest_ProcessEvent 这个函
数, 其实,按键释放的时候也都有一个按键消息送上来,方便我们对按键状态做判断。而
SimpleBLETest_ProcessEvent 这个函数,就是在我们的应用层里的。至此,按键流程分析
完毕。
应用层
simpleBLETest.c
- 初始化注册按键事件
![](https://i-blog.csdnimg.cn/blog_migrate/bc41836ff434daab7b5d66aa590c83b9.png)
这样一旦有按键中断发生就会触发uint16 SimpleBLETest_ProcessEvent( uint8 task_id, uint16 events )函数
逐层进入会到static void simpleBLECentral_HandleKeys( uint8 shift, uint8 keys )
![](https://i-blog.csdnimg.cn/blog_migrate/dc6b47702afaf54800cbe55821debbaa.png)
三、OSAL 操作系统-实验 12 五向按键
![](https://i-blog.csdnimg.cn/blog_migrate/e4aa98a65ed41a8bdb078c9bf5be7665.png)
电路图:
![](https://i-blog.csdnimg.cn/blog_migrate/6fb346778b180e4acdb04a75fb5ddac4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9e7106e23ef9684d73410fbc8d55d974.png)
注意:上面, P20 即是 cc2054x 的 p2.0, 作为
中断输入;而 P06 即是 P0.6,作为
ADC采样输入,5 向按键与 s1 按键相比,多了一个 adc采样,5向按键,实际上是先触发一个按键中断,然后,再进行 adc 采样,每个方向的按键被按下后,由于分压不一样,因此 adc 数值也就不一样, 这样就能区分不同的按键了。
IO定义:
hal_key.c
![](https://i-blog.csdnimg.cn/blog_migrate/ad6c5196c112556a0be6f8227e92f009.png)
P2.0 定 义 按 键 为 下 降 沿 沿 触 发
P0.6为ADC采样输入
设置GPIO(初始化函数中)
![](https://i-blog.csdnimg.cn/blog_migrate/20f689c992e8d996705dcd8c84b1919a.png)
HalKeyConfig中设置中断
![](https://i-blog.csdnimg.cn/blog_migrate/57c63d09c0893765fe8014fe90dcd4d9.png)
299~301 行,这是 p2.0 的 io 中断使能,其中断函数在:HAL_ISR_FUNCTION的halProcessKeyInterrupt()中
在该函数中和key1的用法类似,判断是否是按键按下并进行延时去抖(纯延时去抖)
去抖和延时之后程序跑到哪了呢???
在Hal_drivers.c中的Hal_ProccessEvent中!
当检测到按键按下事件后就会调用HalKeyPoll进行处理,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/2e93d95c01e6eb993f45047f2abeb937.png)
在HalKeyPoll中有一个回调函数,该回调函数就在应用层中,从而实现了
按键按下的消息传送到应用层的业务逻辑:
![](https://i-blog.csdnimg.cn/blog_migrate/bf983b492d2dca1500a9b7af68c67c02.png)
下面是这个回调函数的定义处~
在应用层中OSAL_SimpleBLETest.c:
![](https://i-blog.csdnimg.cn/blog_migrate/34271756ccbdc853168835bab9012483.png)
104 行定义了该回调函数, 或者, 至于这个函数在哪里别赋值等, 我这里点到即可, 不作深入分析了。
总之, 只要有按键按下,就会执行 SimpleBLETest_ProcessEvent 这个函数, 其实,按键释放的时候也都有一个按键消息送上来,方便我们对按键状态做判断。而SimpleBLETest_ProcessEvent 这个函数,就是在我们的应用层里的。至此,按键流程分析完毕。
总之, 只要有按键按下,就会执行 SimpleBLETest_ProcessEvent 这个函数, 其实,按键释放的时候也都有一个按键消息送上来,方便我们对按键状态做判断。而SimpleBLETest_ProcessEvent 这个函数,就是在我们的应用层里的。至此,按键流程分析完毕。
应用层
应用层类似于key1,注册+事件处理(参考上面)
未完~关注我的cc2541分类