[Cortex-M0技术交流] 【M0第一帖】从库文件开始,了解M0程序的编写,增加程序

[复制链接]
 楼主| nixianmin 发表于 2011-9-13 11:55 | 显示全部楼层 |阅读模式
本帖最后由 nixianmin 于 2011-9-13 19:35 编辑

  这几天一直有同学在这玩,根本没时间学习咯,还好公司放4天假:lol,还有最后一天可以玩玩,这不趁早就捣鼓起来了。还要以前准备工作做的还不错,可以直接开始了。  不过刚开始看着库实在不知道怎么入手,看看例子不怎么清楚,看驱动参考手册一大堆函数不知道什么时候用,也不想直接就Copy代码,想弄清楚点M0程序的写法和结构。
  发现keil一个很爽的功能,以前真失败既然没发现,用这个功能就能很方便的知道函数、数据类型等在文件中定义的位置了。



  通过这功能,我把库里的一些定义看了下发现一个规律。

像SYSCLK->;PWRCON.OSC10K_EN = 1;大家都用过
但我不知到他为什么这样写,就在头文件找定义,发现:
#define SYSCLK
((SYSCLK_T *) SYSCLK_BASE)

#define SYSCLK_BASE
(AHB_BASE
+ 0x00200)

#define AHB_BASE
((
uint32_t)0x50000000)

typedef struct
{

SYSCLK_PWRCON_T
PWRCON;


SYSCLK_AHBCLK_T
AHBCLK;


SYSCLK_APBCLK_T
APBCLK;


SYSCLK_CLKSTATUS_T CLKSTATUS;


SYSCLK_CLKSEL0_T
CLKSEL0;


SYSCLK_CLKSEL1_T
CLKSEL1;


SYSCLK_CLKDIV_T
CLKDIV;


SYSCLK_CLKSEL2_T
CLKSEL2;


SYSCLK_PLLCON_T
PLLCON;


SYSCLK_FRQDIV_T
FRQDIV;



} SYSCLK_T;

typedef struct
{
    __IO uint32_t  XTL12M_EN:1;
    __IO uint32_t  XTL32K_EN:1;
    __IO uint32_t  OSC22M_EN:1;
    __IO uint32_t  OSC10K_EN:1;
    __IO uint32_t  PD_WU_DLY:1;
    __IO uint32_t  PD_WU_INT_EN:1;
    __IO uint32_t  PD_WU_STS:1;
    __IO uint32_t  PWR_DOWN:1;
    __IO uint32_t  PD_WAIT_CPU:1;
    __I  uint32_t  RESERVE:23;
} SYSCLK_PWRCON_T;

再配合技术手册的寄存器说明:



    这样我们就知道了SYSCLK->;PWRCON.XTL12M_EN是什么,SYSCLK代表时钟控制器,而SYSCLK_T结构体中的寄存器正好和上面那映射图一一对应, SYSCLK_PWRCON_T结构体和PWRCON寄存器对应,那么其他的一些功能写法也就自然知道了,也让我在下面写程序更能深入去了解。
  以前用过TI的M3,那个直接就调用函数,貌似我都没找到怎么使用寄存器的。以为M0也是直接使用库就好了,现在发现M0还是能很方便的使用寄存器操作的,也不用那么麻烦的一个个寄存器去写




再看库文件中,我还学到了一些以前没用过的写法
__IO uint32_t  XTL12M_EN:1;
//刚开始看不懂,后来联系起来看就知道是位操作的写法了

先写到这,下面再继续研究,慢慢玩





本帖子中包含更多资源

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

×
 楼主| nixianmin 发表于 2011-9-13 19:31 | 显示全部楼层

从时钟开始入手

本帖最后由 nixianmin 于 2011-9-13 19:33 编辑

先了解芯片的时钟系统,下午弄了个程序,通过函数设置系统的时钟10K,32K,12M,22M,50M五种,通过流水灯的速度来测试下时钟设置是不是都可以实现,当设置为12M以上时要修改delay函数的参数,不然速度太快没有效果。
  1. /*********************************************
  2. //
  3. //
  4. **********************************************/
  5. #include<stdio.h>
  6. #include"NUC1xx.h"
  7. #include"DrvSYS.h"
  8. #include"DrvGPIO.h"
  9. //内部22M时钟
  10. void SelectClk_22M()
  11. {
  12.   SYSCLK->WRCON.OSC22M_EN=1;
  13.   
  14.   DrvSYS_Delay(5000); //us级延时函数
  15.   DrvSYS_SelectHCLKSource (7);   //选择时钟源
  16.                 // E_SYS_OSC22M
  17. }
  18. //外部12M时钟
  19. void SelectClk_12M()
  20. {
  21.   SYSCLK->WRCON.XTL12M_EN=1;
  22.   /* Waiting for 12M Xtal stable */
  23.   DrvSYS_Delay(5000); //us级延时函数
  24.   DrvSYS_SelectHCLKSource (0);    //选择时钟源
  25.                     //  E_SYS_XTL12M
  26. }
  27. //外部32K时钟
  28. void SelectClk_32K()
  29. {
  30.   SYSCLK->WRCON.XTL32K_EN=1;

  31.   DrvSYS_Delay(100000); //us级延时函数,延时短了可能出问题
  32.   DrvSYS_SelectHCLKSource (1);       //选择时钟源
  33.                          // E_SYS_XTL32K
  34. }
  35. //外部10K时钟
  36. void SelectClk_10K()
  37. {
  38.   SYSCLK->WRCON.OSC10K_EN=1;
  39.   
  40.   DrvSYS_Delay(5000); //us级延时函数
  41.   DrvSYS_SelectHCLKSource (3);   //选择时钟源
  42.                          //E_SYS_OSC10K
  43. }

  44. void PLL50M()
  45. {
  46.   SYSCLK->WRCON.XTL12M_EN=1;
  47.   
  48.   DrvSYS_Delay(5000); //us级延时函数
  49.   DrvSYS_SelectPLLSource (E_SYS_EXTERNAL_12M );
  50.   DrvSYS_Open (50000000);     //PLL设置为50MHZ
  51.   DrvSYS_SelectHCLKSource (2);      //选择时钟源
  52.                          // E_SYS_PLL
  53. }

  54. void delay(uint16_t dly_time)
  55. {
  56.   uint8_t i=0;
  57.   for(;dly_time>0;dly_time--)
  58.     for(i=255;i>0;i--);
  59. }

  60. int main(void)
  61. {
  62.   uint16_t cycle=0x0004;

  63.   UNLOCKREG();   //解寄存器锁保护
  64.   SelectClk_32K();
  65.   //SelectClk_10K();
  66.   //SelectClk_22M();
  67.   //SelectClk_12M();
  68.   //PLL50M();

  69.   //led端口设置
  70.   DrvGPIO_Open (E_GPA,2,E_IO_OUTPUT);
  71.   DrvGPIO_Open (E_GPA,3,E_IO_OUTPUT);
  72.   DrvGPIO_Open (E_GPA,4,E_IO_OUTPUT);
  73.   DrvGPIO_Open (E_GPA,5,E_IO_OUTPUT);


  74.   while(1)
  75.   {
  76.     for(cycle=0x0004;cycle<0X0040;cycle<<=1)
  77.     {
  78.       DrvGPIO_SetPortBits (E_GPA,cycle);
  79.       delay(10);//修改延时函数看时钟频率
  80.     }
  81.   }
  82. }

本帖子中包含更多资源

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

×
tao560532 发表于 2011-9-15 19:39 | 显示全部楼层
赞一个
ddjrz 发表于 2011-9-29 10:21 | 显示全部楼层
顶下
mbydyjj 发表于 2011-9-30 13:19 | 显示全部楼层
谢了
yanding708811 发表于 2011-10-9 18:32 | 显示全部楼层
不错
hzj52188 发表于 2011-10-17 22:29 | 显示全部楼层
楼主学习方法很不错,强荐
liuyonggyah 发表于 2011-11-28 14:15 | 显示全部楼层
简直傻到家了
tendence 发表于 2011-11-28 23:35 | 显示全部楼层
学习了
dake1478 发表于 2014-3-5 21:37 | 显示全部楼层
Enan01 发表于 2014-3-16 22:04 | 显示全部楼层
这帖子不错,我也一直没有搞懂,现在终于懂了!!!!!!!!!!!!!!!!!!谢了,哥们儿!!!!!!!!!!!!!!!!!
陈少鸿735 发表于 2014-7-29 08:20 | 显示全部楼层
谢谢哥们
陈少鸿735 发表于 2014-7-29 08:29 | 显示全部楼层
写得很详细,很入们
lqc754 发表于 2014-8-2 12:48 | 显示全部楼层
很好!看明了。
dandan5241 发表于 2014-8-15 18:16 | 显示全部楼层
firefly2k 发表于 2015-1-14 10:55 | 显示全部楼层
谢谢分享
lvyunhua 发表于 2015-1-19 13:47 | 显示全部楼层
不错,感谢分享!
hxjlm 发表于 2015-2-6 15:17 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:电机控制,TI InstaSpin Foc交流群:335663930

40

主题

431

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:电机控制,TI InstaSpin Foc交流群:335663930

40

主题

431

帖子

6

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