在线时间613 小时
UID252169
注册时间2010-12-5
NXP金币0
TA的每日心情 | 开心 2019-2-14 16:49 |
---|
签到天数: 296 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 4473
- 最后登录
- 2020-4-14
|
本帖最后由 zhjb1 于 2016-7-8 10:34 编辑
实验一
如题,为了保护焊MAPS_K22和FRDM_K64F板子,试验先从自己焊的KS22板子开始[原因很简单,那板子看的就喜欢,自然不希望小车还没有动,板子就玩完了]。
经过许多网友的帮助和鼓励,以及他们的经验:SDK2.0与以前的代码是差不多的,于是乎仔细的研究了一番,当然先从GPIO开始。实话实说,这些程序代码与前一段时间学习的KL系列的代码还是有所不同,正如前边的体会,他的层次结构是分开的。下边举例说明GPIO的学习和体会。
SDK2.0_KS22的代码文件夹:SDK_2.0_MAPS-KS22\boards\mapsks22\driver_examples\gpio\led_output,里面的主程序就是:gpio_led_output.c,此次就从LED开始。
前边的Include文件就不说了,接着就是定义变量:
#define BOARD_LED_GPIO BOARD_LED_RED2_GPIO
#define BOARD_LED_GPIO_PIN BOARD_LED_RED2_GPIO_PIN
项目搜索,搜到这些变量的定义在:board.h里:
#define BOARD_LED_RED2_GPIO_PORT PORTB
#define BOARD_LED_RED2_GPIO_PIN 9U
显然这里仅仅是声明文档,在对应的.c里,仅仅有一个宏说明。
接着main中有GPIO_PinInit()——GPIO初始化,搜了一下,在fsl_gpio.c,代码宏一看就明白。下边开始学习理解:
源代码初始化就不写了,我直接将PORTB和9U带入,初始化程序变为:
GPIO_PinInit(PORTB,9U,&led_config);
结果没有问题。
在fsl_gpio.h中有一个模块是:GPIO_WritePinOutput(GPIO_Type *base, uint32_t pin, uint8_t output)
写模块,很好立即拿来实验,替换GPIO_TogglePinsOutput,:
GPIO_WritePinOutput(PORTB,9U,0);
延时;
GPIO_WritePinOutput(PORTB,9U,0);
延时;
结果很好的运行起来了。
在尝试增加其他口时发现毫无反应,程序也无报错。于是再看了前边的初始化函数,本次仅仅解决GPIO,其他的就不看了,在pin_mux.c中有BOARD_InitPins初始化函数,看完才知道为何加其他口无效,缺少GPIO定义,于是在里面加上自己的:
/* Enable gpio port clock */
CLOCK_EnableClock(kCLOCK_PortC);
/* Config the LCD IOs */
PORT_SetPinMux(PORTC,12U,kPORT_MuxAsGpio);
PORT_SetPinMux(PORTC,13U,kPORT_MuxAsGpio);
PORT_SetPinMux(PORTC,14U,kPORT_MuxAsGpio);
PORT_SetPinMux(PORTC,15U,kPORT_MuxAsGpio);
为了统一自定义变量,LCD串口信号,分别为:
#define res GPIOC
#define resPin 15U
#define reg GPIOC
#define regPin 14U
#define sda GPIOC
#define sdaPin 13U
#define clk GPIOC
#define clkPin 12U
为了通用,将它们直接写入到board.h中。
程序中添加了一个ioInit()函数,里面存放定义GPIO;
//I/O Initial
void ioInit(void){
gpio_pin_config_t led_config={kGPIO_DigitalOutput,0,};
GPIO_PinInit(res,resPin,&led_config);//PTC15
GPIO_PinInit(reg,regPin,&led_config);//PTC14
GPIO_PinInit(clk,clkPin,&led_config);//PTC13
GPIO_PinInit(sda,sdaPin,&led_config);//PTC12
}
这样我的主程序代码就统一为变量了。
int main(void){
/* Define the init structure for the output LED pin*/
//gpio_pin_config_t led_config ={ kGPIO_DigitalOutput, 0,};
/* Board pin, clock, debug console init */
BOARD_InitPins();
BOARD_BootClockHSRUN();
BOARD_InitDebugConsole();
ioInit();
/* Print a note to terminal. */
//PRINTF("\r\n GPIO Driver example\r\n");
//PRINTF("\r\n The LED is taking turns to shine.\r\n");
for(;;){
GPIO_WritePinOutput(res,resPin,1);
GPIO_WritePinOutput(reg,regPin,0);
GPIO_WritePinOutput(clk,clkPin,1);
GPIO_WritePinOutput(sda,sdaPin,0);
delay(2000);
GPIO_WritePinOutput(res,resPin,0);
GPIO_WritePinOutput(reg,regPin,1);
GPIO_WritePinOutput(clk,clkPin,0);
GPIO_WritePinOutput(sda,sdaPin,1);
delay(2000);
}
}
当然,前边还有一个延时函数delay();
结果是PTC15~124个口LED闪亮。
NXP的程序对于已有经验的寄存器写者,可能开始会有点麻烦,但真正看懂了后还是不难学的。
实际上他的程序结构可以这么理解:
主函数只是表象定义变量;一些初始化函数定义功能和用途;有单独的宏来描述这些GPIO口或其他模块的类型或什么的;所有的操作尽量以变量进行,最后由芯片定义来解释这些。有点像用户层、底层描述、中间接口的层次结构。
明天要走远门,10天后才回来,先扔上此文,回来立即K64F。照片是成功驱动LCD显示ASCII码。以后再贴LCD的代码。增加3张照片。这款LCD太小,找个大点的LCD放上,这次是采用4线JLINK V7下载的。并且将收到的K64F也放上,下边的K64F是在RAM下用龙丘的K60OLSD显示驱动的,在Flash下不成功——早几天前的实验。
|
-
插针面
-
MCU面
-
针脚面+LCD
-
MCU面
-
K64F加电显示
|