MCU设计开发小Tips:创建并移植K10 BSP包的具体步骤和方法
PORTA_PCR19 &= (uint32_t)~(uint32_t)((PORT_PCR_ISF_MASK | PORT_PCR_MUX(0x07)));
/*切换到FBE 模式*/
OSC_CR = OSC_CR_ERCLKEN_MASK;
SIM_SOPT2 &= (uint32_t)~(uint32_t)(SIM_SOPT2_MCGCLKSEL_MASK);
MCG_C2 = (MCG_C2_RANGE(0x02) | MCG_C2_EREFS_MASK);
MCG_C1 = (MCG_C1_CLKS(0x02) | MCG_C1_FRdiv(0x05) | MCG_C1_IRCLKEN_MASK);
MCG_C4 &= (uint8_t)~(uint8_t)((MCG_C4_DMX32_MASK | MCG_C4_DRST_DRS(0x03)));
MCG_C5 = MCG_C5_PRdiv(0x07);
MCG_C6 = MCG_C6_Vdiv(0x08);
while((MCG_S & MCG_S_OSCINIT_MASK) == 0x00U) { /*判断晶振是否运行?*/
}
while((MCG_S & MCG_S_IREFST_MASK) != 0x00U) {
/* 判断FLL参考源是否为外部参考时钟 */
}
while((MCG_S & 0x0CU) != 0x08U) { //等待,直到外部参考时钟作为MCG的输出
}
/* 切换到 PBE 模式*/
OSC_CR = OSC_CR_ERCLKEN_MASK;
SIM_SOPT2 &= (uint32_t)~(uint32_t)(SIM_SOPT2_MCGCLKSEL_MASK);
MCG_C1 = (MCG_C1_CLKS(0x02) | MCG_C1_FRdiv(0x05) | MCG_C1_IRCLKEN_MASK);
MCG_C2 = (MCG_C2_RANGE(0x02) | MCG_C2_EREFS_MASK);
MCG_C5 = MCG_C5_PRdiv(0x07);
MCG_C6 = (MCG_C6_PLLS_MASK | MCG_C6_Vdiv(0x08));
while((MCG_S & 0x0CU) != 0x08U) { /*等待,直到外部参考时钟作为MCG输出*/
}
while((MCG_S & MCG_S_LOCK_MASK) == 0x00U) { /* 等待直到锁住*/
}
/* 切换到 PEE模式 */
OSC_CR = OSC_CR_ERCLKEN_MASK;
SIM_SOPT2 &= (uint32_t)~(uint32_t)(SIM_SOPT2_MCGCLKSEL_MASK);
MCG_C1 = (MCG_C1_FRdiv(0x05) | MCG_C1_IRCLKEN_MASK);
MCG_C2 = (MCG_C2_RANGE(0x02) | MCG_C2_EREFS_MASK);
MCG_C5 = MCG_C5_PRdiv(0x07);
MCG_C6 = (MCG_C6_PLLS_MASK | MCG_C6_Vdiv(0x08));
while((MCG_S & 0x0CU) != 0x0CU) { /* 等待,直到PLL输出*/
}
}
图7. PE设置
MQX4.0中PE的时钟初始化代码在bsp_cm.c文件的void __pe_initialize_hardware(void)函数中。可以将上述PE生成的代码直接粘贴在该文件中。调试可能会出现系统时钟配置错误。当出现此类错误时,程序可能会停在图8所示的dispatch.s文件中的等待中断的语句cpsid.n i处。这种错误往往是由于只修改了部分的时钟寄存器设置或者是直接使用其他系列的Kinetis的BSP包中的时钟配置,而没有做相应的修改所造成的。例如,直接使用K60 BSP包的默认时钟部分代码,在K10的25Mhz外部时钟环境中进行调试就会出现上述错误。这里不建议手工书写代码或者直接拷贝其他Kinetis系列的不同时钟配置的代码,建议使用PE来配置生成时钟代码,对于有错误的部分PE中会有相关的红色提示符标示出来,因此不用担心那些时钟寄存器配置错误或被遗漏了。
图8. dispatch.s代码
一般地,在user_config.h配置中,RTC是默认使能的,也就是外部的32.768Khz晶振是需要外接的,如果不外接,可以将配置文件user_config.h中的宏定义语句:
#define BSPCFG_ENABLE_RTCDEV 1 修改为
#define BSPCFG_ENABLE_RTCDEV 0
另外由于K10中不包含USB和以太网的代码,所以需要将相关的USB,Ethernet的文件删除,并将user_config.h头文件中的宏定义修改为:
#define RTCSCFG_ENABLE_ICMP 0
#define RTCSCFG_ENABLE_UDP 0
#define RTCSCFG_ENABLE_TCP 0
#define RTCSCFG_ENABLE_STATS 0
#define RTCSCFG_ENABLE_GATEWAYS 0
#define FTPDCFG_USES_MFS 0
#define RTCSCFG_ENABLE_SNMP 0
#define TELNETDCFG_NOWAIT FALSE
#define HTTPDCFG_POLL_MODE 0
#define HTTPDCFG_STATIC_TASKS 0
#define HTTPDCFG_DYNAMIC_TASKS 0
4. BSP包代码的调试
4.1. 创建一个 简单任务并运行
为了证明所创建的BSP是可以正常工作的,这里建一个最简单的IAR的工程,如图9所示,它包含了我们所创建的基于MQX 4.0的 K10DN512 的BSP库。
图9 建立一个IAR工程
选择保存工程的文件目录位置如下:C:\Freescale\Freescale_MQX_4_0\demo\K10DN512 Demo。在main.c中添加如下的代码:
#include
#include
#define MAIN_TASK 15
#define STACK_SIZE 1024
#define MAIN_STACK STACK_SIZE
extern void main_task(uint_32);
Kinetis 操作系统 以太网 飞思卡尔 MCU 相关文章:
- 智能新趋势 飞思卡尔MCU引领嵌入式应用(03-01)
- 飞思卡尔固定式ePOS终端设计方案(09-23)
- Kinetis 平台的电容式触摸键盘设计(07-30)
- Kinetis M微控制器:面向计量方案的攻城利器(06-15)
- 时钟模式配置以及在MCU应用(09-12)
- 物联网操作系统Ruff 开发无人机项目体验分享(05-02)