瑞萨单片机论坛
直播中

jf_1137202360

8年用户 1359经验值
擅长:嵌入式技术
私信 关注
[经验]

【RA4M2设计挑战赛】+基于寄存器开发LED点灯

前言
前一篇我们搭建了开发环境,已经能进行仿真调试,但是没有实现任何功能。这一篇我们就进行嵌入式领域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. 先清除PWPRB0WI
2. 置位 PWPRPFSWE 此时可以写PmnPFS

3. PmnPFS配置

4. 清除 PWPRPFSWE
5. 置位PWPRB0WI此时不可以写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-> 即可访问寄存器。


  1. #include

  2. #include "ARMCM33.h"
  3. #include "R7FA4M2AD.h"

  4. void delay(uint32_t t);

  5. void delay(uint32_t t)
  6. {
  7. volatile uint32_t timeout = t;
  8. while(timeout--);
  9. }


  10. int main(void)
  11. {
  12. R_PMISC->PWPR_b.B0WI = 0;
  13. R_PMISC->PWPR_b.PFSWE = 1;
  14. R_PFS->PORT[4].PIN[5].PmnPFS_b.ASEL = 0;
  15. R_PFS->PORT[4].PIN[5].PmnPFS_b.DSCR = 3;  /* High drive */
  16. R_PFS->PORT[4].PIN[5].PmnPFS_b.EOFR = 0;
  17. R_PFS->PORT[4].PIN[5].PmnPFS_b.ISEL = 0;
  18. R_PFS->PORT[4].PIN[5].PmnPFS_b.NCODR = 0; /* CMOS output */
  19. R_PFS->PORT[4].PIN[5].PmnPFS_b.PCR = 0;   /* Disable input pull-up */
  20. R_PFS->PORT[4].PIN[5].PmnPFS_b.PDR = 1;   /*Output (functions as an output pin) */
  21. //R_PFS->PORT[4].PIN[5].PmnPFS_b.PIDR
  22. //R_PFS->PORT[4].PIN[5].PmnPFS_b.PIM
  23. R_PFS->PORT[4].PIN[5].PmnPFS_b.PMR = 0; /* Used as a general I/O pin */
  24. R_PFS->PORT[4].PIN[5].PmnPFS_b.PODR = 0;
  25. R_PFS->PORT[4].PIN[5].PmnPFS_b.PSEL = 0;
  26. R_PFS->PORT[4].PIN[4].PmnPFS_b.ASEL = 0;
  27. R_PFS->PORT[4].PIN[4].PmnPFS_b.DSCR = 3;  /* High drive */
  28. R_PFS->PORT[4].PIN[4].PmnPFS_b.EOFR = 0;
  29. R_PFS->PORT[4].PIN[4].PmnPFS_b.ISEL = 0;
  30. R_PFS->PORT[4].PIN[4].PmnPFS_b.NCODR = 0; /* CMOS output */
  31. R_PFS->PORT[4].PIN[4].PmnPFS_b.PCR = 0;   /* Disable input pull-up */
  32. R_PFS->PORT[4].PIN[4].PmnPFS_b.PDR = 1;   /*Output (functions as an output pin) */
  33. //R_PFS->PORT[4].PIN[4].PmnPFS_b.PIDR
  34. //R_PFS->PORT[4].PIN[4].PmnPFS_b.PIM
  35. R_PFS->PORT[4].PIN[4].PmnPFS_b.PMR = 0; /* Used as a general I/O pin */
  36. R_PFS->PORT[4].PIN[4].PmnPFS_b.PODR = 0;
  37. R_PFS->PORT[4].PIN[4].PmnPFS_b.PSEL = 0;
  38. R_PFS->PORT[0].PIN[2].PmnPFS_b.ASEL = 0;
  39. R_PFS->PORT[0].PIN[2].PmnPFS_b.DSCR = 3;  /* High drive */
  40. R_PFS->PORT[0].PIN[2].PmnPFS_b.EOFR = 0;
  41. R_PFS->PORT[0].PIN[2].PmnPFS_b.ISEL = 0;
  42. R_PFS->PORT[0].PIN[2].PmnPFS_b.NCODR = 0; /* CMOS output */
  43. R_PFS->PORT[0].PIN[2].PmnPFS_b.PCR = 0;   /* Disable input pull-up */
  44. R_PFS->PORT[0].PIN[2].PmnPFS_b.PDR = 1;   /*Output (functions as an output pin) */
  45. //R_PFS->PORT[0].PIN[2].PmnPFS_b.PIDR
  46. //R_PFS->PORT[0].PIN[2].PmnPFS_b.PIM
  47. R_PFS->PORT[0].PIN[2].PmnPFS_b.PMR = 0; /* Used as a general I/O pin */
  48. R_PFS->PORT[0].PIN[2].PmnPFS_b.PODR = 0;
  49. R_PFS->PORT[0].PIN[2].PmnPFS_b.PSEL = 0;
  50. R_PMISC->PWPR_b.PFSWE = 0;
  51. R_PMISC->PWPR_b.B0WI = 1;
  52. while(1)
  53.   {
  54. R_PORT4->PCNTR3_b.POSR |= 1u<<5;
  55. R_PORT4->PCNTR3_b.POSR |= 1u<<4;
  56. R_PORT0->PCNTR3_b.POSR |= 1u<<2;
  57. delay(100000);
  58. R_PORT4->PCNTR3_b.PORR |= 1u<<5;
  59. R_PORT4->PCNTR3_b.PORR |= 1u<<4;
  60. R_PORT0->PCNTR3_b.PORR |= 1u<<2;
  61. delay(100000);
  62. }
  63. }



测试
仿真下载程序

可以查看外设寄存器


全速运行可以看到3LED闪烁。
总结
以上参考芯片手册,基于寄存器操作实现了LED点灯的测试。演示了从零开始进行外设开发的过程,无非就是查阅手册,操作寄存器,实现对应外设功能,其他的UARTSPI等等更复杂的外设也无非如此。这样的过程有助于新手学习,对于新手建议一定要有这样的从零开始的过程,而不是一开始就使用工具,模板,自动生成代码,进行配置,那样知其然不知其所以然,不利于了解细节,不利于深入提高,对于嵌入式开发一定是任何细节都要了然于心。

参考
RA4M2 Group User’s Manual: Hardware
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

更多回帖

发帖
×
20
完善资料,
赚取积分