[Cortex-M0技术交流] 新手学习笔记1——看门狗

[复制链接]
 楼主| jxc827 发表于 2012-5-27 17:01 | 显示全部楼层 |阅读模式
本帖最后由 jxc827 于 2012-6-23 16:51 编辑

新手学习笔记。上电后,流水灯闪烁,当看门狗定时器溢出后,中断中使另外一个灯闪烁一次,然后系统复位重启。
心得1:调试过程中时钟稳定状态寄存器始终为0,耽误了一段时间,最后发现是助学板上芯片不支持,不明白厂家为什么这个地方还搞点差异化,如果大家想使用这个功能得小心了。
心得2:PLL寄存器配置值可以直接调用库函数,然后反写入寄存器,不用自己计算。感觉还是挺方便的。
心得3:M0的时钟设置很灵活,但也导致比较繁琐,一开始让人有点晕。总结下来也就如下几步:选择CPU时钟源(内部或者外部);配置PLL;选择外设时钟源;使能该外设时钟源。
心得4:有些库函数封装的不是很合理,必须查看源码才能确认到底实现了啥功能,简单的程序还是习惯操作寄存器,呵呵。
源代码:
  1. #include <stdio.h>
  2. #include "NUC1xx.h"
  3. #include "DrvSYS.h"
  4. #include "DrvGPIO.h"
  5. #include "DrvTIMER.h"

  6. void delay(uint32_t i)
  7. {
  8. uint32_t j;
  9. while(i--)
  10. {
  11. for(j=0;j<1000;j++);
  12. }
  13. }

  14. uint32_t tmp = 0;
  15. void WDT_Callback(void)
  16. {

  17. DrvWDT_Ioctl(E_WDT_IOC_RESET_TIMER, 0); //复位看门狗定时器
  18. tmp++;
  19. if(tmp%2)
  20. DrvGPIO_ClrBit(E_GPA,5);
  21. else
  22. DrvGPIO_SetBit(E_GPA,5);

  23. }

  24. void WDT_test(void)
  25. {
  26. UNLOCKREG();
  27. DrvSYS_SetOscCtrl(E_SYS_OSC10K, 1); // 使能内部10KHz晶振
  28. // while (DrvSYS_GetChipClockSourceStatus (E_SYS_OSC10K) != 1); //等待内部时钟源稳定, 该器件不支持此功能
  29. delay(1000); //延迟一段时间,等待时钟稳定

  30. DrvSYS_SelectIPClockSource (E_SYS_WDT_CLKSRC , 0x03); //选择WDT时钟源为内部10KHz
  31. DrvSYS_SetIPClock(E_SYS_WDT_CLK,1); //使能WDT外设时钟
  32. DrvWDT_Ioctl(E_WDT_IOC_SET_INTERVAL, 0x05); //设置复位间隔
  33. DrvWDT_Ioctl(E_WDT_IOC_ENABLE_RESET_FUNC, 1); //使能复位
  34. DrvWDT_Ioctl(E_WDT_IOC_ENABLE_INT, 1); //使能中断
  35. DrvWDT_InstallISR((WDT_CALLBACK)WDT_Callback); //注册中断函数
  36. DrvWDT_Ioctl(E_WDT_IOC_START_TIMER, 1); //启动看门狗
  37. LOCKREG();
  38. }

  39. void PLL_config(void)
  40. {
  41. UNLOCKREG();
  42. DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); // 使能外部12M时钟源
  43. LOCKREG();

  44. tmp = DrvSYS_GetExtClockFreq(); //返回外部时钟频率: 0x00b71b00——12MHZ
  45. DrvSYS_SelectPLLSource(E_SYS_EXTERNAL_12M); //选择外部12M时钟源PLL
  46. DrvSYS_SetPLLMode(0); //PLL 正常模式
  47. tmp = DrvSYS_GetPLLContent(E_SYS_EXTERNAL_12M, 50000000); //设置PLL输出50M
  48. DrvSYS_SetPLLContent(tmp);
  49. tmp = DrvSYS_GetPLLClockFreq(); //回读PLL输出频率
  50. UNLOCKREG();
  51. DrvSYS_SelectHCLKSource(2); //0:12M;1:32K;2LL;
  52. LOCKREG();
  53. tmp = DrvSYS_GetHCLKFreq(); //回读HCLK时钟频率
  54. }

  55. int main ()
  56. {
  57. uint32_t count=0;

  58. PLL_config(); //配置系统时钟
  59. WDT_test(); //看门狗测试

  60. DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);
  61. DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT);
  62. DrvGPIO_Open(E_GPA,4, E_IO_OUTPUT);
  63. DrvGPIO_Open(E_GPA,5, E_IO_OUTPUT);

  64. while(1)
  65. {
  66. count=(count+1)%8;
  67. delay(100);
  68. switch(count)
  69. {
  70. case 0: DrvGPIO_ClrBit(E_GPA,2); break;
  71. case 1: DrvGPIO_SetBit(E_GPA,2); break;
  72. case 2: DrvGPIO_ClrBit(E_GPA,3); break;
  73. case 3: DrvGPIO_SetBit(E_GPA,3); break;
  74. case 4: DrvGPIO_ClrBit(E_GPA,4); break;
  75. case 5: DrvGPIO_SetBit(E_GPA,4); break;
  76. default: break;
  77. }
  78. }
  79. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2012-5-28 07:51 | 显示全部楼层
代码用<>不会出现笑脸
 楼主| jxc827 发表于 2012-7-6 22:47 | 显示全部楼层
自己顶
xyz549040622 发表于 2012-7-7 20:33 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

53

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部