RA4M2 RA4M2设计挑战赛
前言
前一篇我们搭建了开发环境,已经能进行仿真调试,但是没有实现任何功能。这一篇我们就进行嵌入式领域HelloWorld级别的LED点灯测试。这里不使用复杂的fsp代码框架,fsp过于复杂且不友好,对于新手不利,也不适合学习。所以我们根据手册基于寄存器操作直接实现。
过程
原理图
使用P405 P404 P002驱动LED
GPIO模块
参见参考的《19. I/O Ports》
相关寄存器
PCNTR1/PODR/PDR:控制输出方向和输出值
PCNTR2/EIDR/PIDR:只读,读引脚状态
PCNTR3/PORR/POSR:引脚置位或者复位操作
PCNTR4/EORR/EOSR:ELC控制引脚输出
PmnPFS/PmnPFS_HA/PmnPFS_BY:引脚功能配置
PWPR,PWPRS:写PmnPFS保护寄存器
PmSAR:端口 Security属性。如果为0则需要使用PWPRS解除写保护,否则使用PWPR。默认为为1.
GPIO操作可以只使用PmnPFS进行功能配置,输入输出操作,
也可以使用PCNTR1~PCNTR4实现。
注意PmnPFS的操作需要先解除保护。
操作步骤
1. 先清除PWPR的B0WI
2. 置位 PWPR的 PFSWE 此时可以写PmnPFS
3. PmnPFS配置
4. 清除 PWPR的 PFSWE
5. 置位PWPR的B0WI此时不可以写PmnPFS
代码
GPIO的寄存器
R_PORT0_Type
#define R_PORT0_BASE 0x40080000UL
#define R_PORT0 ((R_PORT0_Type *) R_PORT0_BASE)
#define R_PFS ((R_PFS_Type *) R_PFS_BASE)
#define R_PFS_BASE 0x40080800UL
通过R_PORT-> 即可访问寄存器。
-
- #include
-
- #include "ARMCM33.h"
- #include "R7FA4M2AD.h"
-
- void delay(uint32_t t);
-
- void delay(uint32_t t)
- {
- volatile uint32_t timeout = t;
- while(timeout--);
- }
-
-
- int main(void)
- {
- R_PMISC->PWPR_b.B0WI = 0;
- R_PMISC->PWPR_b.PFSWE = 1;
- R_PFS->PORT[4].PIN[5].PmnPFS_b.ASEL = 0;
- R_PFS->PORT[4].PIN[5].PmnPFS_b.DSCR = 3; /* High drive */
- R_PFS->PORT[4].PIN[5].PmnPFS_b.EOFR = 0;
- R_PFS->PORT[4].PIN[5].PmnPFS_b.ISEL = 0;
- R_PFS->PORT[4].PIN[5].PmnPFS_b.NCODR = 0; /* CMOS output */
- R_PFS->PORT[4].PIN[5].PmnPFS_b.PCR = 0; /* Disable input pull-up */
- R_PFS->PORT[4].PIN[5].PmnPFS_b.PDR = 1; /*Output (functions as an output pin) */
- //R_PFS->PORT[4].PIN[5].PmnPFS_b.PIDR
- //R_PFS->PORT[4].PIN[5].PmnPFS_b.PIM
- R_PFS->PORT[4].PIN[5].PmnPFS_b.PMR = 0; /* Used as a general I/O pin */
- R_PFS->PORT[4].PIN[5].PmnPFS_b.PODR = 0;
- R_PFS->PORT[4].PIN[5].PmnPFS_b.PSEL = 0;
- R_PFS->PORT[4].PIN[4].PmnPFS_b.ASEL = 0;
- R_PFS->PORT[4].PIN[4].PmnPFS_b.DSCR = 3; /* High drive */
- R_PFS->PORT[4].PIN[4].PmnPFS_b.EOFR = 0;
- R_PFS->PORT[4].PIN[4].PmnPFS_b.ISEL = 0;
- R_PFS->PORT[4].PIN[4].PmnPFS_b.NCODR = 0; /* CMOS output */
- R_PFS->PORT[4].PIN[4].PmnPFS_b.PCR = 0; /* Disable input pull-up */
- R_PFS->PORT[4].PIN[4].PmnPFS_b.PDR = 1; /*Output (functions as an output pin) */
- //R_PFS->PORT[4].PIN[4].PmnPFS_b.PIDR
- //R_PFS->PORT[4].PIN[4].PmnPFS_b.PIM
- R_PFS->PORT[4].PIN[4].PmnPFS_b.PMR = 0; /* Used as a general I/O pin */
- R_PFS->PORT[4].PIN[4].PmnPFS_b.PODR = 0;
- R_PFS->PORT[4].PIN[4].PmnPFS_b.PSEL = 0;
- R_PFS->PORT[0].PIN[2].PmnPFS_b.ASEL = 0;
- R_PFS->PORT[0].PIN[2].PmnPFS_b.DSCR = 3; /* High drive */
- R_PFS->PORT[0].PIN[2].PmnPFS_b.EOFR = 0;
- R_PFS->PORT[0].PIN[2].PmnPFS_b.ISEL = 0;
- R_PFS->PORT[0].PIN[2].PmnPFS_b.NCODR = 0; /* CMOS output */
- R_PFS->PORT[0].PIN[2].PmnPFS_b.PCR = 0; /* Disable input pull-up */
- R_PFS->PORT[0].PIN[2].PmnPFS_b.PDR = 1; /*Output (functions as an output pin) */
- //R_PFS->PORT[0].PIN[2].PmnPFS_b.PIDR
- //R_PFS->PORT[0].PIN[2].PmnPFS_b.PIM
- R_PFS->PORT[0].PIN[2].PmnPFS_b.PMR = 0; /* Used as a general I/O pin */
- R_PFS->PORT[0].PIN[2].PmnPFS_b.PODR = 0;
- R_PFS->PORT[0].PIN[2].PmnPFS_b.PSEL = 0;
- R_PMISC->PWPR_b.PFSWE = 0;
- R_PMISC->PWPR_b.B0WI = 1;
- while(1)
- {
- R_PORT4->PCNTR3_b.POSR |= 1u<<5;
- R_PORT4->PCNTR3_b.POSR |= 1u<<4;
- R_PORT0->PCNTR3_b.POSR |= 1u<<2;
- delay(100000);
- R_PORT4->PCNTR3_b.PORR |= 1u<<5;
- R_PORT4->PCNTR3_b.PORR |= 1u<<4;
- R_PORT0->PCNTR3_b.PORR |= 1u<<2;
- delay(100000);
- }
- }
测试
仿真下载程序
可以查看外设寄存器
全速运行可以看到3个LED闪烁。
总结
以上参考芯片手册,基于寄存器操作实现了LED点灯的测试。演示了从零开始进行外设开发的过程,无非就是查阅手册,操作寄存器,实现对应外设功能,其他的UART,SPI等等更复杂的外设也无非如此。这样的过程有助于新手学习,对于新手建议一定要有这样的从零开始的过程,而不是一开始就使用工具,模板,自动生成代码,进行配置,那样知其然不知其所以然,不利于了解细节,不利于深入提高,对于嵌入式开发一定是任何细节都要了然于心。
参考
RA4M2 Group User’s Manual: Hardware
附件:
您需要登录才可以下载或查看附件。没有帐号?注册
更多回帖