Cortex-K60自学笔记(二)

关于官方例程的一些理解

总结:这周主要是敲了一下官方例程,感受还是挺多的,虽然说LPLD库规范了他的初始化结构,中断。但因为对每个模块作用及需要设置的参数认识还不够,导致学习的很慢,这周主要是了解了关于 GPIO , UART , PIT , FTM-PWM , FTM-IC , FTM-QD 等几个模块的简单初始化及中断定义。这周没有敲过底层,不是因为觉得底层不重要,主要是因为时间问题吧,还有就是关于单片机基础知识的缺乏,我觉的敲底层低效,也不能完全理解,有点得不偿失,因此直接开始敲例程,加快学习的进度吧。

以下将问学长的一些问题也一同粘贴了出来

1.gpio初始化及button中断

/**
 * --------------基于"拉普兰德K60底层库V3"的工程(test6)-----------------
 * @file test6.c
 * @version 0.0
 * @date 2013-9-29
 * @brief 关于该工程的描述
 *
 * 版权所有:北京拉普兰德电子技术有限公司
 * http://www.lpld.cn
 * mail:support@lpld.cn
 * 硬件平台:  LPLD K60 Card / LPLD K60 Nano
 *
 * 本工程基于"拉普兰德K60底层库V3"开发,
 * 所有开源代码均在"lib"文件夹下,用户不必更改该目录下代码,
 * 所有用户工程需保存在"project"文件夹下,以工程名定义文件夹名,
 * 底层库使用方法见相关文档。 
 *
 */
#include "common.h"

GPIO_InitTypeDef button;


void gpio_init();
void delay_ms();
void button_irq();


void main (void)
{
  gpio_init();	
  while(1)
  {

  } 
}



void gpio_init()
{
  button.GPIO_PTx=PTB;
  button.GPIO_Pins=GPIO_Pin6|GPIO_Pin7|GPIO_Pin8;
  button.GPIO_Dir=DIR_INPUT;
  button.GPIO_PinControl=INPUT_PULL_UP|IRQC_FA;                                 //参数讲解
  button.GPIO_Isr=button_irq;
  LPLD_GPIO_Init(button);
}

void button_irq()
{
  if(LPLD_GPIO_IsPinxExt(PORTB,GPIO_Pin6))                                      //检测端口中断使用PORT
  {
    printf("button pin6 is interrupt");
    if(PTB6_I==0)
      printf("button pin6 is interrupt");                                       //此处有疑问:是不是按键按一下就由0变1,再由1变0.
  }
  if(LPLD_GPIO_IsPinxExt(PORTB,GPIO_Pin7))
    printf("button pin7 is interrupt");
}


void delay_ms()
{
for(int a=0;a<1000;a++)
  for(int b=0;b<1000;b++)
  {
    asm("nop");
  }
}

2.UART初始化及中断

/**
 * --------------基于"拉普兰德K60底层库V3"的工程(test8)-----------------
 * @file test8.c
 * @version 0.0
 * @date 2013-9-29
 * @brief 关于该工程的描述
 *
 * 版权所有:北京拉普兰德电子技术有限公司
 * http://www.lpld.cn
 * mail:support@lpld.cn
 * 硬件平台:  LPLD K60 Card / LPLD K60 Nano
 *
 * 本工程基于"拉普兰德K60底层库V3"开发,
 * 所有开源代码均在"lib"文件夹下,用户不必更改该目录下代码,
 * 所有用户工程需保存在"project"文件夹下,以工程名定义文件夹名,
 * 底层库使用方法见相关文档。 
 *
 */
#include "common.h"


UART_InitTypeDef uarttest;


void uart_init();
void delay_ms();
void uart_isr();



void main (void)
{
  uart_init();
  while(1)
  {

  } 
}

void uart_init()
{
uarttest.UART_Uartx=UART5;                                                      //uart任选一个吗?
uarttest.UART_BaudRate=9600;
uarttest.UART_RxPin=PTE9;                                                       //电路图中有说明吗?
uarttest.UART_TxPin=PTE8;
uarttest.UART_TxIntEnable=0;						//禁用发送中断
uarttest.UART_RxIntEnable=1;						//使能接收中断		
uarttest.UART_RxIsr=uart_isr;
LPLD_UART_Init(uarttest);
LPLD_UART_EnableIrq(uarttest);						//此处需要注意并非是isr(中断服务程序),irq(中断请求),前者是函数,后者是一个定义中断策略的容器。
}

void uart_isr()
{
   int8 recv;                                                                    //接收的不是ASCII码吗,为什么不能用uint8?不是报这个错我都没发现int8,看了一下还有vint8,vuint8
  recv=LPLD_UART_GetChar(UART5);      	    	        
  printf(&recv);                                                                 //这步加的打印操作为什么报错?
  LPLD_UART_PutChar(UART5,recv);                                                //接收自身的信号吗?
                                                                                
}

此处做一个总结:

  1. 关于uart有两个函数需要记住, LPLD_UART_PutChar(UARTx,int8)
    (此处有坑,int8,不能是uint8)
    LPLD_UART_GetChar(UARTx)
  2. 还有就是关于uart初始化必要的三个参数UART_Uartx,UART_BaundRate(根据网上说法常见为4800,9600,19200),UART_RxPin,UART_TxPin,此处为GPIO引脚非PORT引脚。
  3. 最后就是提示一些UART端口范围为0-5

3.PIT初始化及中断

/**
 * --------------基于"拉普兰德K60底层库V3"的工程(pit)-----------------
 * @file pit.c
 * @version 0.0
 * @date 2013-9-29
 * @brief 关于该工程的描述
 *
 * 版权所有:北京拉普兰德电子技术有限公司
 * http://www.lpld.cn
 * mail:support@lpld.cn
 * 硬件平台:  LPLD K60 Card / LPLD K60 Nano
 *
 * 本工程基于"拉普兰德K60底层库V3"开发,
 * 所有开源代码均在"lib"文件夹下,用户不必更改该目录下代码,
 * 所有用户工程需保存在"project"文件夹下,以工程名定义文件夹名,
 * 底层库使用方法见相关文档。 
 *
 */
#include "common.h"


PIT_InitTypeDef pit0;
PIT_InitTypeDef pit1;

void delay_ms();
void pit_init();
void pit0_isr();
void pit1_isr();

void main (void)
{
  pit_init()
  while(1)
  {
    
  } 
}


void pit_init()
{
pit0.PIT_Pitx=PIT0;
pit0.PIT_PeriodS=2;
pit0.PIT_Isr=pit0_isr;

pit1.PIT_Pitx=PIT1;
pit1.PIT_PeriodS=1;
pit1.PIT_Isr=pit1_isr;

LPLD_PIT_Init(pit0);
LPLD_PIT_Init(pit1);
LPLD_PIT_EnableIrq(pit0);
LPLD_PIT_EnableIrq(pit1);
}


void pit0_isr()
{
	printf("pit0时间到了");
}


void pit1_isr()
{
	printf("pit0时间到了");
}
void delay_ms()
{
	for(int a=0;a<1000;a++)
		for(int b=0;b<1000;b++)
			asm("nop");
}

uart初始化总结:

  1. PIT、Systick、LPTMR、PDB都是计时器但PIT是最简单的定时器
  2. PIT 初始化必要参数PIT_Pitx(0-3),PIT_PeriodS(计时时长),中断可选。

4.FTM-PWM初始化及中断
对于PWM,最直接的感受就是电机调速

/**
 * --------------基于"拉普兰德K60底层库V3"的工程(pwm)-----------------
 * @file pwm.c
 * @version 0.0
 * @date 2013-9-29
 * @brief 关于该工程的描述
 *
 * 版权所有:北京拉普兰德电子技术有限公司
 * http://www.lpld.cn
 * mail:support@lpld.cn
 * 硬件平台:  LPLD K60 Card / LPLD K60 Nano
 *
 * 本工程基于"拉普兰德K60底层库V3"开发,
 * 所有开源代码均在"lib"文件夹下,用户不必更改该目录下代码,
 * 所有用户工程需保存在"project"文件夹下,以工程名定义文件夹名,
 * 底层库使用方法见相关文档。 
 *
 */
#include "common.h"


void pwm_init();
void delay(uint16);


uint32 angletoperiod(uint8)
FTM_InitTypeDef pwm;

void main (void)
{
	pwm_init();
	LPLD_FTM_PWM_ChangeDuty(FTM0,FTM_Ch0,angletoperiod(45));

  while(1)
  {

  } 
}


void pwm_init()
{
	pwm.FTM_Ftmx=FTM0;
	pwm.FTM_Mode=FTM_MODE_PWM;
	pwm.FTM_PwmFreq=50;
	LPLD_FTM_Init(pwm);
	LPLD_FTM_PWM_Enable(FTM0,FTM_Ch0,angletoperiod(0),PTC1,ALIGN_LEFT)
}
void delay(uint16 b)
{
for(int a=0;a<1000;a++)
	for(;b<1000;b++)
		asm("nop");
}
uint32 angletoperiod(uint8 deg)
{
	uint32 pulse_width=500+2000*(90+deg)/180;
	return (uint32)(10000*pulse_width/20000);
}


FTM-PWM总结:

  1. 此处占空比定义在函数angletoperiod(uint8 deg)中
  2. PWM初始化:
    (1)FTM_Ftmx(0-2)
    (2)FTM_Mode(下面是关于其定义)
    #define FTM_MODE_PWM 0x01 //PWM输出模式
    #define FTM_MODE_IC 0x02 //输入捕获模式
    #define FTM_MODE_QD 0x04 //正交解码模式
    #define FTM_MODE_DEC 0x08 //双边缘捕获模式
    (3)FTM_PwmFreq
    (配置PWM模式下的PWM输出频率,单位Hz,FTM_MODE_PWM模式下必须初始化)
    (4)还有一个比较特殊一点的函数LPLD_FTM_PWM_Enable(FTM0,FTM_Ch0,angletoperiod(0),PTC1,ALIGN_LEFT)
    FTM初始化不仅要指定其FTM端口号,还要指定其通道(FTM_Ch0-FTM_ChB),定义见下,还有就是占空比,GPIO端口,以及PWM对齐方式.
    FTM_Ch0 =0,
    FTM_Ch1 =1,
    FTM_Ch2 =2,
    FTM_Ch3 =3,
    FTM_Ch4 =4,
    FTM_Ch5 =5,
    FTM_Ch6 =6,
    FTM_Ch7 =7,
    FTM_PhA =8,
    FTM_PhB =9

5.FTM-IC初始化及中断

/**
 * --------------基于"拉普兰德K60底层库V3"的工程(ftm_ic)-----------------
 * @file ftm_ic.c
 * @version 0.0
 * @date 2013-9-29
 * @brief 关于该工程的描述
 *
 * 版权所有:北京拉普兰德电子技术有限公司
 * http://www.lpld.cn
 * mail:support@lpld.cn
 * 硬件平台:  LPLD K60 Card / LPLD K60 Nano
 *
 * 本工程基于"拉普兰德K60底层库V3"开发,
 * 所有开源代码均在"lib"文件夹下,用户不必更改该目录下代码,
 * 所有用户工程需保存在"project"文件夹下,以工程名定义文件夹名,
 * 底层库使用方法见相关文档。 
 *
 */
#include "common.h"


void ic_init();
void ic_isr();
void pwm_init();
void delay(uint16);


FTM_InitTypeDef ftm1,ftm0;
uint32 freq;


void main (void)
{
pwm_init();
ic_init();

  while(1)
  {
    printf("freqency=%d\r\n",freq);
  } 
}


void ic_init()
{
  ftm1.FTM_Ftmx=FTM1;
  ftm1.FTM_Mode=FTM_MODE_IC;
  ftm1.FTM_ClkDiv=FTM_CLK_DIV128;
  ftm1.FTM_Isr=ic_isr;
  LPLD_FTM_Init(ftm1);
  LPLD_FTM_IC_Enable(FTM1,FTM_Ch0,PTB0,CAPTURE_RI);
  LPLD_FTM_EnableIrq(ftm1);
  
}
void ic_isr()
{
if(LPLD_FTM_IsCHnF(FTM1,FTM_Ch0))
{
	uint32 cnt=LPLD_FTM_GetChVal(FTM1,FTM_Ch0);
	freq=(g_bus_clock/LPLD_FTM_GetClkDiv(FTM1))/cnt;
	LPLD_FTM_ClearCounter(FTM1);
	LPLD_FTM_ClearCHnF(FTM1,FTM_Ch0);

}
}
void pwm_init()
{
	ftm0.FTM_Ftmx=FTM0;
	ftm0.FTM_Mode=FTM_MODE_PWM;
	ftm0.FTM_PwmFreq=1000;
	LPLD_FTM_Init(ftm0);
	LPLD_FTM_PWM_Enable(FTM0,FTM_Ch0,5000,PTC1,ALIGN_LEFT);
}
void delay(uint16 b)
{
	for(int a=0;a<1000;a++)
		for(;b<1000;b++)
  			asm("nop")
}

FTM-IC总结:

  1. 感觉初始化大同小异
  2. (1)ftm1.FTM_ClkDiv=FTM_CLK_DIV128;
    ftm1.FTM_Isr=ic_isr;
    LPLD_FTM_IC_Enable(FTM1,FTM_Ch0,PTB0,CAPTURE_RI);
    (2)上面的几个函数是需要注意的
    关于FTM_ClkDiv ,LPLD库定义如下
    #define FTM_CLK_DIV1 0 //FTM CLK分频系数1
    #define FTM_CLK_DIV2 1 //FTM CLK分频系数2
    #define FTM_CLK_DIV4 2 //FTM CLK分频系数4
    #define FTM_CLK_DIV8 3 //FTM CLK分频系数8
    #define FTM_CLK_DIV16 4 //FTM CLK分频系数16
    #define FTM_CLK_DIV32 5 //FTM CLK分频系数32
    #define FTM_CLK_DIV64 6 //FTM CLK分频系数64
    #define FTM_CLK_DIV128 7 //FTM CLK分频系数128
    (3)再有就是LPLD_FTM_IC_Enable函数,包括FTMx,FTM通道,GPIO端口,还有就是捕获方式(定义如下)
    #define CAPTURE_RI FTM_CnSC_ELSA_MASK //上升沿捕获
    #define CAPTURE_FA FTM_CnSC_ELSB_MASK //下降沿捕获

6.FTM-QD初始化及中断

/**
 * --------------基于"拉普兰德K60底层库V3"的工程(ftm_qd)-----------------
 * @file ftm_qd.c
 * @version 0.0
 * @date 2013-9-29
 * @brief 关于该工程的描述
 *
 * 版权所有:北京拉普兰德电子技术有限公司
 * http://www.lpld.cn
 * mail:support@lpld.cn
 * 硬件平台:  LPLD K60 Card / LPLD K60 Nano
 *
 * 本工程基于"拉普兰德K60底层库V3"开发,
 * 所有开源代码均在"lib"文件夹下,用户不必更改该目录下代码,
 * 所有用户工程需保存在"project"文件夹下,以工程名定义文件夹名,
 * 底层库使用方法见相关文档。 
 *
 */
#include "common.h"


void qd_init();
void pit_init();
void delay(uint16);
void pit_isr();


FTM_InitTypeDef qd;
PIT_InitTypeDef pit;
int32 qdresult=0;


void main (void)
{
qd_init();
pit_init();
  while(1)
  {
    printf("QDCounter=%d\r\n",qdresult);
    delay(1000);
  } 
}


void qd_init()
{
qd.FTM_Ftmx=FTM1;
qd.FTM_Mode=FTM_MODE_QD;
qd.FTM_QdMode=QD_MODE_PHAB;
LPLD_FTM_Init(qd);
LPLD_FTM_QD_Enable(FTM1,PTB0,PTB1);



}
void pit_init()
{
pit.PIT_Pitx=PIT1;
pit.PIT_PeriodMs=20;
pit.PIT_Isr=pit_isr;
LPLD_PIT_Init(pit);
LPLD_PIT_EnableIrq(pit);

}
void delay(uint16 b)
{
  for(int a=0;a<1000;a++)
  {
    for(;b<1000;b++)
    {
      asm("nop");
    }
  }
}
void pit_isr()
{
qdresult=LPLD_FTM_GetCounter(FTM1);
LPLD_FTM_ClearCounter(FTM1);
}

FTM-QD总结:

  1. 相比于前两者,FTM-QD初始化简单的多
  2. 初始化操作中关键的几个点
    FTM_Ftm
    FTM_QdMod
    LPLD_FTM_QD_Enable
    (1)FTMx
    (2)FTM_QdMod包含
    #define QD_MODE_PHAB 0 //AB相解码模式
    #define QD_MODE_CNTDIR FTM_QDCTRL_QUADMODE_MASK //计数和方向解码模式
    (3)再有就是LPLD_FTM_QD_Enable函数,包含FTMx端口,以及正交的两个GPIO端口。

这周的一些感受真的想写下来,说真的,智能车团队是我加入的第一个团队,因此我也一直没有放弃,真的想一直做下去,但同样因为自己组的学习进度都比较慢,学单片机也没板子,觉得有点凉。我想边做边学,程序方面以做一些小的项目锻炼自己对单片机的了解。同时自己也打算花钱去买一块板子,团队不知道为什么一直不肯给我们配板子,也只能自己想办法了。真的很想和大家一起通过校内赛进入国赛。虽然自己平时时间挺紧张,但还是坚持把。最后,也祝我的三个队友顺利通过从c课设吧.
在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值