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:[email protected]
* 硬件平台: 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:[email protected]
* 硬件平台: 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); //接收自身的信号吗?
}
此处做一个总结:
- 关于uart有两个函数需要记住, LPLD_UART_PutChar(UARTx,int8)
(此处有坑,int8,不能是uint8)
LPLD_UART_GetChar(UARTx)- 还有就是关于uart初始化必要的三个参数UART_Uartx,UART_BaundRate(根据网上说法常见为4800,9600,19200),UART_RxPin,UART_TxPin,此处为GPIO引脚非PORT引脚。
- 最后就是提示一些UART端口范围为0-5
3.PIT初始化及中断
/**
* --------------基于"拉普兰德K60底层库V3"的工程(pit)-----------------
* @file pit.c
* @version 0.0
* @date 2013-9-29
* @brief 关于该工程的描述
*
* 版权所有:北京拉普兰德电子技术有限公司
* http://www.lpld.cn
* mail:[email protected]
* 硬件平台: 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初始化总结:
- PIT、Systick、LPTMR、PDB都是计时器但PIT是最简单的定时器
- 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:[email protected]
* 硬件平台: 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总结:
- 此处占空比定义在函数angletoperiod(uint8 deg)中
- 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:[email protected]
* 硬件平台: 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)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:[email protected]
* 硬件平台: 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总结:
- 相比于前两者,FTM-QD初始化简单的多
- 初始化操作中关键的几个点
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课设吧.