在线时间4 小时
UID46687
注册时间2007-6-10
NXP金币16
该用户从未签到
注册会员

- 积分
- 169
- 最后登录
- 1970-1-1
|
前面对KL26开发板的硬件原理图、板载USBDM、KL26系统时钟进行了学习,基本了解了芯片的基本外围设备及系统时钟原理。准备开始简单的程序设计。在开始自己编写程序前,对KL26开发板提供的例子程序进行了学习分析。
通过对MDK下Demo_GPIO例子的详细分析,基本了解了程序的启动顺序,其实际和STM32启动工作顺序差不多。下面对学习进行简单的总结:
例子主程序如下:
int main (void)
{
SystemCoreClockUpdate();
SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK
| SIM_SCGC5_PORTB_MASK
| SIM_SCGC5_PORTC_MASK
| SIM_SCGC5_PORTD_MASK
| SIM_SCGC5_PORTE_MASK );
uart0Init(9600,0,0,8,1);
printf("YL-KL25Z128 GPIO_Blinky Test start\r\n");
PORT_ENABLE_CLK(MKL_PORTB); /* ʹÄÜPORTʱÖÓ */
PORT_ENABLE_CLK(MKL_PORTD);
IO_FUN_SEL(MKL_PORTB,18,1); /* IO¹¦ÄÜÑ¡Ôñ */
IO_FUN_SEL(MKL_PORTB,19,1);
IO_FUN_SEL(MKL_PORTD,1,1);
GPIO_DDR_OUTPUT(MKL_PORTB,18); /* IOÉèÖÃΪÊä³öģʽ */
GPIO_DDR_OUTPUT(MKL_PORTB,19);
GPIO_DDR_OUTPUT(MKL_PORTD,1);
GPIO_SET(MKL_PORTB,18); /* IOÉèÖÃΪ¸ßµçƽ£¬LEDϨÃð */
GPIO_SET(MKL_PORTB,19);
GPIO_SET(MKL_PORTD,1);
while(1){ /* ²»¶Ï·×ªIO£¬LEDÉÁ˸ */
GPIO_TOGGLE(MKL_PORTB,18);
myDelay(200);
GPIO_TOGGLE(MKL_PORTB,19);
myDelay(200);
GPIO_TOGGLE(MKL_PORTD,1);
myDelay(200);
}
}
1:进入main函数后,先是更新了系统内核时钟,调用的 SystemCoreClockUpdate() 函数;
我们从KL26的参考手册知道,KL26上电启动后,先是从复位向量开始运行的,运行顺序,可以参看startup_MKL25Z4.s 文件(YL-KL26Z开发板提供的例子程序,可以从KL25库程序修改而来,所以文件命名任然沿用了25Z4,但不影响编程);
在startup_MKL25Z4.s 文件 中可以明显看到复位中断程序:
; Reset Handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
在上电复位后,实际程序是先执行的一个系统初始化函数SystemInit();然后才是调用的 main()函数;
2:系统初始化函数SystemInit() 功能
在system_MKL25Z4.c 文件中,我们可以找到SystemInit()函数的具体实现,从函数功能看,主要是实现系统时钟的选择及运行配置。
(1)首先是关闭了看门狗;
(2)根据各时钟源的值,设置MCU的系统时钟,详细可以参考程序代码,不细说。
3:在系统初始化函数SystemInit() 执行完后,进入main()函数执行,在main()函数开始时,首先对系统内核时钟进行了更新;
在设置好系统时钟后,才真正开始用户运行程序代码的设置,因此,在我们自己设计程序时,前面系统时钟的初始化,可以直接参考例子程序的代码,根据自己的实际需要进行修改即可。
4:在系统时钟初始化完成后,由于我们要使用到外设,本例子程序是控制LED0~LED2,以及从串口输出信息,因此在配置MCU的门口时钟,必须先使能外设时钟前打开门口时钟:
SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK
| SIM_SCGC5_PORTB_MASK
| SIM_SCGC5_PORTC_MASK
| SIM_SCGC5_PORTD_MASK
| SIM_SCGC5_PORTE_MASK );
5:三个LED与开发板上的PTB18、PTB19和PTD1三个脚连接,要使LED灯工作,还需要使能端口时钟,与STM32类似。
PORT_ENABLE_CLK(MKL_PORTB); /*使能IO端口时钟 */
PORT_ENABLE_CLK(MKL_PORTD);
6:在使能时钟后,需要设置MCU 管脚的功能,由于是LED连接的是IO端口,而K了26的IO端口是多功能端口,所以需要设置PTB18、PTB19和PTD1三个脚的功能, 各引脚功能可以参考参考手册中第10。3节的“KL26 Signal Multiplexing and Pin Assignments”;
IO_FUN_SEL(MKL_PORTB,18,1); /* IO管脚功能设置 */
IO_FUN_SEL(MKL_PORTB,19,1);
IO_FUN_SEL(MKL_PORTD,1,1);
7:接下来应该设置管脚的数据方向为输出端口:
GPIO_DDR_OUTPUT(MKL_PORTB,18); /* IOÉèÖÃΪÊä³öģʽ */
GPIO_DDR_OUTPUT(MKL_PORTB,19);
GPIO_DDR_OUTPUT(MKL_PORTD,1);
8:接下来就可以控制LED相连接的管脚,输出高低电平,控制LED的亮灭,实现LED流水灯。
总的来说是按照如下的顺序进行程序设计的:
|
|