打印
[Cortex-M0技术交流]

【M0第一帖】从库文件开始,了解M0程序的编写,增加程序

[复制链接]
5815|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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函数的参数,不然速度太快没有效果。
/*********************************************
//
//
**********************************************/
#include<stdio.h>
#include"NUC1xx.h"
#include"DrvSYS.h"
#include"DrvGPIO.h"
//内部22M时钟
void SelectClk_22M()
{
  SYSCLK->WRCON.OSC22M_EN=1;
  
  DrvSYS_Delay(5000); //us级延时函数
  DrvSYS_SelectHCLKSource (7);   //选择时钟源
                // E_SYS_OSC22M
}
//外部12M时钟
void SelectClk_12M()
{
  SYSCLK->WRCON.XTL12M_EN=1;
  /* Waiting for 12M Xtal stable */
  DrvSYS_Delay(5000); //us级延时函数
  DrvSYS_SelectHCLKSource (0);    //选择时钟源
                    //  E_SYS_XTL12M
}
//外部32K时钟
void SelectClk_32K()
{
  SYSCLK->WRCON.XTL32K_EN=1;

  DrvSYS_Delay(100000); //us级延时函数,延时短了可能出问题
  DrvSYS_SelectHCLKSource (1);       //选择时钟源
                         // E_SYS_XTL32K
}
//外部10K时钟
void SelectClk_10K()
{
  SYSCLK->WRCON.OSC10K_EN=1;
  
  DrvSYS_Delay(5000); //us级延时函数
  DrvSYS_SelectHCLKSource (3);   //选择时钟源
                         //E_SYS_OSC10K
}

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

void delay(uint16_t dly_time)
{
  uint8_t i=0;
  for(;dly_time>0;dly_time--)
    for(i=255;i>0;i--);
}

int main(void)
{
  uint16_t cycle=0x0004;

  UNLOCKREG();   //解寄存器锁保护
  SelectClk_32K();
  //SelectClk_10K();
  //SelectClk_22M();
  //SelectClk_12M();
  //PLL50M();

  //led端口设置
  DrvGPIO_Open (E_GPA,2,E_IO_OUTPUT);
  DrvGPIO_Open (E_GPA,3,E_IO_OUTPUT);
  DrvGPIO_Open (E_GPA,4,E_IO_OUTPUT);
  DrvGPIO_Open (E_GPA,5,E_IO_OUTPUT);


  while(1)
  {
    for(cycle=0x0004;cycle<0X0040;cycle<<=1)
    {
      DrvGPIO_SetPortBits (E_GPA,cycle);
      delay(10);//修改延时函数看时钟频率
    }
  }
}

GPIO.rar

593.79 KB

使用特权

评论回复
板凳
tao560532| | 2011-9-15 19:39 | 只看该作者
赞一个

使用特权

评论回复
地板
ddjrz| | 2011-9-29 10:21 | 只看该作者
顶下

使用特权

评论回复
5
mbydyjj| | 2011-9-30 13:19 | 只看该作者
谢了

使用特权

评论回复
6
yanding708811| | 2011-10-9 18:32 | 只看该作者
不错

使用特权

评论回复
7
hzj52188| | 2011-10-17 22:29 | 只看该作者
楼主学习方法很不错,强荐

使用特权

评论回复
8
liuyonggyah| | 2011-11-28 14:15 | 只看该作者
简直傻到家了

使用特权

评论回复
9
tendence| | 2011-11-28 23:35 | 只看该作者
学习了

使用特权

评论回复
10
dake1478| | 2014-3-5 21:37 | 只看该作者
:)

使用特权

评论回复
11
Enan01| | 2014-3-16 22:04 | 只看该作者
这帖子不错,我也一直没有搞懂,现在终于懂了!!!!!!!!!!!!!!!!!!谢了,哥们儿!!!!!!!!!!!!!!!!!

使用特权

评论回复
12
陈少鸿735| | 2014-7-29 08:20 | 只看该作者
谢谢哥们

使用特权

评论回复
13
陈少鸿735| | 2014-7-29 08:29 | 只看该作者
写得很详细,很入们

使用特权

评论回复
14
lqc754| | 2014-8-2 12:48 | 只看该作者
很好!看明了。

使用特权

评论回复
15
dandan5241| | 2014-8-15 18:16 | 只看该作者

使用特权

评论回复
16
firefly2k| | 2015-1-14 10:55 | 只看该作者
谢谢分享

使用特权

评论回复
17
lvyunhua| | 2015-1-19 13:47 | 只看该作者
不错,感谢分享!

使用特权

评论回复
18
hxjlm| | 2015-2-6 15:17 | 只看该作者
hao

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

40

主题

431

帖子

6

粉丝