在线时间828 小时
UID3079326
注册时间2015-2-11
NXP金币28
TA的每日心情 | 奋斗 2025-5-7 09:07 |
---|
签到天数: 353 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 5785
- 最后登录
- 2025-5-7
|
本帖最后由 wambob 于 2015-3-19 19:31 编辑
在体验了流水灯之后,打算一探其奥秘,只看参考手册和例程和纸上谈兵差不多,会运用才是硬道理。
打开光盘自带的源文件GPIO下的Demo_GPIO下的kinetis_l_demo.uvprojx工程,可以看到左边工程面板里的文件,给我的感觉似曾相识,启动文件,驱动文件,应用文件(说白了用户写的代码).
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_ENABLE_CLK(MKL_PORTD);
IO_FUN_SEL(MKL_PORTB,18,1);
IO_FUN_SEL(MKL_PORTB,19,1);
IO_FUN_SEL(MKL_PORTD,1,1);
GPIO_DDR_OUTPUT(MKL_PORTB,18);
GPIO_DDR_OUTPUT(MKL_PORTB,19);
GPIO_DDR_OUTPUT(MKL_PORTD,1);
GPIO_SET(MKL_PORTB,18);
GPIO_SET(MKL_PORTB,19);
GPIO_SET(MKL_PORTD,1);
while(1)
{
GPIO_TOGGLE(MKL_PORTB,18);
myDelay(200);
GPIO_TOGGLE(MKL_PORTB,19);
myDelay(200);
GPIO_TOGGLE(MKL_PORTD,1);
myDelay(200);
}
}
使用了系统模块时钟寄存器SIM_SCGC5
开发板上使用PTB18、PTB19和PTD1三个脚外接三个LED,
也就是上电后的流水灯。
要使用这三个脚,必须打开端口时钟门,
SIM_SCGC5 |= 1u<<12|1u<<10;
使用管脚,还需要配置一下功能。Pin Control Register n (PORTx_PCRn) mux=0b 001
PORTB_PCR18|= 0x00000100u;
PORTB_PCR19|= 0x00000100u;
PORTD_PCR1|= 0x00000100u;
设置方向寄存器FGPIO_PDDR,也就是输入或者输出
GPIOB_PDDR |= 1U<<18;
GPIOB_PDDR |= 1U<<19;
GPIOD_PDDR |= 1U<< 1;
初始化设置寄存器FGPIO_PSOR,设置为高电平,灯熄灭
GPIOB_PSOR |= 1U<< 18;
GPIOB_PSOR |= 1U<< 19;
GPIOD_PSOR |= 1U<< 1;
端口状态翻转寄存器FGPIO_PTOR
GPIOB_PTOR =1U<< 18;
myDelay(200);
GPIOB_PTOR =1U<< 19;
myDelay(200);
GPIOD_PTOR =1U<< 1;
myDelay(200);
程序中还有个延时函数myDelay()。
int main (void)
{
SystemCoreClockUpdate(); //系统核时钟的初始化
SIM_SCGC5 |= 1u<<12|1u<<10; //开启PORTB PORTD模块时钟
uart0Init(9600,0,0,8,1);
printf("YL-KL25Z128 GPIO_Blinky Test start\r\n");
PORTB_PCR18|= 0x00000100u;
PORTB_PCR19|= 0x00000100u;
PORTD_PCR1|= 0x00000100u; //设置为复用GPIO模式
FGPIOB_PSOR |= 1U<< 18; //初始化GPIO为高电平
FGPIOB_PSOR |= 1U<< 19;
FGPIOD_PSOR |= 1U<< 1;
FGPIOB_PDDR |= 1U<<18; //设置GPIO为输出
FGPIOB_PDDR |= 1U<<19;
FGPIOD_PDDR |= 1U<< 1;
while(1)
{
FGPIOB_PTOR =1U<< 18;
myDelay(200);
FGPIOB_PTOR =1U<< 19;
myDelay(200);
FGPIOD_PTOR =1U<< 1;
myDelay(200);
}
}
替换到原来的程序,编译,发送到mbed,按复位键,流水灯实现了。
看着熟悉的代码,你是否会想起点什么。
|
|