【ATmega4809 Curiosity Nano测评】串口按键控灯(IoT Led前篇)
[复制链接]
本帖最后由 Ansersion 于 2019-10-22 10:07 编辑
1. 简介
放眼市场上现有的IoT产品,其系统设计可简化如下图所示,其中“远端”为APP、网页等交互方式,红色虚线框中则为IoT设备。
本篇内容将用ATmega4809 Curiosity Nano按照以下模块结构关系实现按键和串口共同控制LED明灭,并且当按键控制LED时通知串口。
其中我们将用到ATMega4809的GPIO中断、定时器中断和串口中断功能。
2. MCC配置
首先是添加USART1串口,并且使能中断,波特率设置为9600(TTL转USB的GND、RX、TX分别接GND、PC0、PC1)
然后我们添加TC0定时器,并且使能溢出中断,超时时间设置为1ms。之所以需要定时器是为了记录系统时钟,从而可以辅助按键去除抖动。
根据官方文档,我们知道PF5是LED,PF6是按键,所以我们将PF5设置为输出端口,PF6设置为输入端口并且使能上升沿触发中断。
最后在中断管理器中打开全局中断
3. 系统流程
CheckNetOK:
检查通讯模块是否联网正常(由于此处没有通讯模块,所以恒返回YES)
Parse Packet:
解析串口数据(收到“0”表示关闭LED,收到其他则表示打开LED)
Judge The Signal:
根据按键状态和串口命令决定LED明灭
Response/Notify:
如果收到串口命令则应答“got”;如果获取按键命令,则通知串口“0”/“1”。
4. 核心代码分析
") rgba(220, 220, 220, 0.5); top: -15px; left: 0px; display: block;">
SystemClockHandler为TC0的中断处理函数,该函数每1ms执行一次,g_SystemTicks记录了当前系统时钟。
") rgba(220, 220, 220, 0.5); top: -15px; left: 0px; display: block;">
KeyInterruptHandler为按键中断函数,每次执行会置位按键标志(KEY_VAL_MASK),并翻转按键LED值(g_KeyValue)。100ms内多次发生中断视为信号抖动,并无视。
") rgba(220, 220, 220, 0.5); top: -15px; left: 0px; display: block;">
分别获取串口和按键值,如果LED值翻转,则重置LED。
5. 演示截图
最后附上工程文件
繁絮至此,但求明细。
|