折腾了一下午,把基本可能会用到的外设跑了一下
基本上就是GPIO、定时器、串口和按键这类
还有AD再找例程来玩吧
1、LED
这个很通用,基本上就是通用IO口模式的配置
PMx、PMCx和Px这三个寄存器就可以摆平
- P0 |= 0x03U;<br />
- PM0 &= 0xFCU;<br />
- PMC0 &= 0xFCU;
具体可以查询硬件手册
妹的,点这个LED1灯,花了哥3个小时,最后发现板子上这个LED1默认是断开的
坑得里焦外嫩
自己焊上吧
2、TIMER
也是很好理解,按照手册一步步配置,基本上没有大问题
- void R_TAU0_Create(void)<br />
- {<br />
- TAU0EN = 1U; /* supplies input clock */<br />
- TPS0 &= 0x00U;<br />
- /* Stop all channels */<br />
- TT0 |= 0x0FU;<br />
- /* Mask channel 0 interrupt */<br />
- TMMK00 = 1U; /* disable INTTM00 interrupt */<br />
- TMIF00 = 0U; /* clear INTTM00 interrupt flag */<br />
- <br />
- /* Set INTTM00 low priority */<br />
- TMPR100 = 1U;<br />
- TMPR000 = 1U;<br />
- <br />
- /* Channel 0 used as interval timer */<br />
- TMR00H = 0x00U;<br />
- TMR00L = 0x00U;<br />
- <br />
- TDR00H = 0x9CU;<br />
- TDR00L = 0x3FU;<br />
- TO0 &= 0x0EU;<br />
- TOE0 |= 0x01U;<br />
- }<br />
- <br />
- void R_TAU0_Channel0_Start(void)<br />
- {<br />
- TMIF00 = 0U; /* clear INTTM00 interrupt flag */<br />
- TMMK00 = 0U; /* enable INTTM00 interrupt */<br />
- TS0 |= 0x01U;<br />
- }<br />
- <br />
- void R_TAU0_Channel0_Stop(void)<br />
- {<br />
- TT0 |= 0x01U;<br />
- /* Mask channel 0 interrupt */<br />
- TMMK00 = 1U; /* disable INTTM00 interrupt */<br />
- TMIF00 = 0U; /* clear INTTM00 interrupt flag */<br />
- }
定时器配置2ms来一次中断
服务程序:
- #pragma interrupt INTTM00 R_TAU0_Channel0_Interrupt //中断服务函数入口<br />
- <br />
- __interrupt void R_TAU0_Channel0_Interrupt(void)<br />
- {<br />
- /* Start user code. Do not edit comment generated here */<br />
- <br />
- if (++inttm00counter == 250U) /* 250 times interrupt ? */<br />
- {<br />
- <br />
- TDR00H = 0x9CU; /* Set new timer interval to TAU0 channel 0 */<br />
- TDR00L = 0x3FU;<br />
- P0.1 = !P0.1;//500ms LED2翻转一次<br />
- inttm00counter = 0U; /* Clear TM00 interrupt count */<br />
- }<br />
- <br />
- /* End user code. Do not edit comment generated here */<br />
- }
3、UART
额,这个太多了,视频后面把代码打包上来吧
比较乱,仅供参考
要注意UART例程是启用了奇偶校验的,干掉才能正常通信
4、键中断
这个是R7F0C809的一个比较有特色的地方
把按键的外部中断直接固化成了一个模块
果然是为消费电子而生啊
配置好简单,比GPIO复杂不到哪里去
- KRMK = 1U; /* disable INTKR operation */<br />
- KRIF = 0U; /* clear INTKR interrupt flag */<br />
- KRCTL |= 0x80U;<br />
- KRCTL &= 0xFEU;<br />
- KRM0 |= 0x10U;<br />
- <br />
- /* Set INTKR level 1 priority */<br />
- KRPR1 = 1U;<br />
- KRPR0 = 1U; <br />
- /* Key Interrupt Start */<br />
- KRF = 0U;<br />
- KRIF = 0U; /* clear INTKR interrupt flag */<br />
- KRMK = 0U; /* enable INTKR operation */
和键中断相关的配置主要是KRCTL、KRM和KRF
不过还得注意通用IO的配置要匹配再就是中断函数
- #pragma interrupt INTKR KEY_Interrupt //中断函数入口<br />
- <br />
- __interrupt void KEY_Interrupt()<br />
- {<br />
- <br />
- Key_Value = KRF;<br />
- if(Key_Value && 0x10U){P0.0 = ~P0.0;}<br />
- KRF = 0U; <br />
- }<br />
可以多个按键进行键值判断,很方便
上个操作视频吧,很low
LED2由定时器每500ms翻转一次
PC键盘串口点亮或者熄灭LED1
按键K1完成键中断功能,翻转LED1不过实测消抖稍微差劲了些,偶尔会出现多次触发的情况
还要自己消抖的话,那和外部中断有什么区别?
键中断也是个噱头了
代码撸上,比较乱,随便看看吧,嗯,回复可见吧
发现板子上丝印的一个错误
K1是INTP0吗?
似乎不是啊,顶了天被复用成INTP1呢
不知道是不是哪里看走眼了