上次存在的下载问题解决了,终于可以进行程序设计了!
这里的程序下载与以前的方式完成不一样,是使用纯指令来完成的,恍惚又会到了以往的DOS时代。
在程序编译后所生成的目标文件是BIN类型的,而非通常所生成的HEX文件。
程序下载是在DK6Programmer的控制下通过串口来实现的,下载前需使用cd指令来进入指定的目录,以led_blinky例程为例,则是在命令窗口键入"cd Documents\MCUXpressoIDE_11.4.0_6237\workspace\k32w061dk6_led_blinky"。随后,键入“DK6Programmer -l”指令以查看当前的串口号。其实这也大可必,因为通过设备管理器就可弄清开发板所占用的串口号。然后用 “DK6Programmer.exe-V5 -s ”+“串口号” -P 1000000 -pFLASH@0x00=” +“生成的bin文件路径”即可完成下载。
![1.jpg 1.jpg](https://static.assets-stash.eet-china.com/forum/202109/15/015952uzre0s42srryzbkb.jpg)
图1下载前
当然省事的办法就是直接将Debug文件夹的bin文件直接拖至“DK6Programmer.exe-V5 -s +“串口号”-P 1000000 -p FLASH@0x00=”之后,然后回车,随后再输入“Y”即可,见图2所示。
![2.jpg 2.jpg](https://static.assets-stash.eet-china.com/forum/202109/15/015952cz4rasraaum8uurk.jpg)
图2 完成下载
程序下载后,开发板就会自动加载运行程序。
这种下载方式还是比较适合连续调试,因为程序修改编译后,只需按一下“↑”键即可召回原来的指令予以执行。
对于I/O的使用,最好是由LED开启,在开发板上有2个LED,即红色的D4和绿色的D3,见图3所示。由于LED的一端已接GND,因此另一端提供高电平即可点亮。
![3.jpg 3.jpg](https://static.assets-stash.eet-china.com/forum/202109/15/015952z9r166zzv91eu16u.jpg)
图3 LED电路
在程序中,用函数GPIO_PortSet( )来点亮LED,用函数GPIO_PortClear ( )来点亮LED,要使LED闪烁,则用函数GPIO_PortToggle ( )。
![4.jpg 4.jpg](https://static.assets-stash.eet-china.com/forum/202109/15/015952lj44j4v4be6yvo6y.jpg)
图4 红灯的点亮与熄灭
对于2个LED该如何来控制它们呢?
那就是从引脚入手,要点亮红灯用GPIO_PortSet(GPIO, BOARD_LED_PORT, 1u << 0);
要点亮绿灯用GPIO_PortSet(GPIO,BOARD_LED_PORT, 1u <<1);
![5.jpg 5.jpg](https://static.assets-stash.eet-china.com/forum/202109/15/015952utrxtls9tmduut6u.jpg)
图5点亮绿灯
有了前面的基础,我们就可以I/O来模拟I2C通讯以驱动OLED屏。
该显示屏为0.91寸的单色屏,尺寸规格为80*160像素点。
OLED屏与开发板的连接关系为:
SCL---PIO11
SDA---PIO10
这样设置的好处在于,利用Arduino接口来连接能省去连线的麻烦。
为输出高低电平,所进行的语句定义为:
#define OLED_SCLK_Set() GPIO_PortSet(GPIO,BOARD_LED_PORT, 1u << 11)
#define OLED_SDIN_Set() GPIO_PortSet(GPIO,BOARD_LED_PORT, 1u << 10)
OLED屏的初始化函数为:
voidOLED_Init(void){ Write_IIC_Command(0xAE); //display off Write_IIC_Command(0x40);//--set start line address Write_IIC_Command(0xb0);//Set Page Start Address for Page Addressing Mode,0-7 Write_IIC_Command(0xc8);//Set COM Output Scan Direction Write_IIC_Command(0x81);//--set contrast control register Write_IIC_Command(0xff); Write_IIC_Command(0xa1);//--set segment re-map 0 to 127 Write_IIC_Command(0xa6);//--set normal display Write_IIC_Command(0xa8);//--set multiplex ratio(1 to 64) Write_IIC_Command(0x1F); Write_IIC_Command(0xd3);//-set display offset Write_IIC_Command(0x00);//-not offset Write_IIC_Command(0xd5);//--set display clock divide ratio/oscillator frequency Write_IIC_Command(0xf0);//--set divide ratio Write_IIC_Command(0xd9);//--set pre-charge period Write_IIC_Command(0x22); Write_IIC_Command(0xda);//--set com pins hardware configuration Write_IIC_Command(0x02); Write_IIC_Command(0x8d);//--set DC-DC enable Write_IIC_Command(0x14); Write_IIC_Command(0xdb);//--set vcomh Write_IIC_Command(0x49);//0x20,0.77xVcc Write_IIC_Command(0xaf);//--turn on oled panel }
复制代码字符显示函数为:
void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_tChar_Size){ unsignedchar c=0,i=0; c=chr-' '; if(x>Max_Column-1) { x=0; y=y+2; } if(Char_Size ==16) { OLED_Set_Pos(x,y); for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); OLED_Set_Pos(x,y+1); for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); } }
复制代码字符串显示函数为:
voidOLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_tChar_Size){ unsignedchar j=0; while (chr[j]!='\0') { OLED_ShowChar(x,y,chr[j],Char_Size); x+=8; if(x>120) { x=0; y+=2; } j++; } }
复制代码实现图6所示效果的主程序为:
int main(void){ /* Define the init structure for the output LED pin*/ gpio_pin_config_tled_config = { kGPIO_DigitalOutput, 1, }; /* Board pin init */ /* Security code to allow debug access */ SYSCON->CODESECURITYPROT = 0x87654320; RESET_PeripheralReset(kFC0_RST_SHIFT_RSTn); RESET_PeripheralReset(kGPIO0_RST_SHIFT_RSTn); BOARD_BootClockRUN(); BOARD_InitDebugConsole(); BOARD_InitPins(); /* Init output LED GPIO. */ GPIO_PortInit(GPIO, BOARD_LED_PORT); //GPIO_PinInit(GPIO, BOARD_LED_PORT, BOARD_LED_PIN, &led_config); GPIO_PinInit(GPIO, BOARD_LED_PORT, 1, &led_config); GPIO_PinInit(GPIO, BOARD_LED_PORT, 0, &led_config); GPIO_PinInit(GPIO, BOARD_LED_PORT, 11, &led_config); GPIO_PinInit(GPIO, BOARD_LED_PORT, 10, &led_config); /* Set systick reload value to generate 1ms interrupt */ if (SysTick_Config(SystemCoreClock / 1000U)) { while (1) { } } GPIO_PortClear(GPIO, BOARD_LED_PORT, 1u << 0); // OFF GPIO_PortSet(GPIO, BOARD_LED_PORT, 1u << 1); // ON OLED_Init(); OLED_Clear(); OLED_ShowString(0,0,"K32W061 TEST",16); OLED_ShowString(0,2,"OLED DISPLAY",16); while (1) { /* Delay 1000 ms */ SysTick_DelayTicks(1000U); GPIO_PortToggle(GPIO, BOARD_LED_PORT, 1u << 1); }
复制代码![6.jpg 6.jpg](https://static.assets-stash.eet-china.com/forum/202109/15/015952qf11fj9m0f1j9mr1.jpg)
图6 显示效果
有了OLED屏的显示功能,后面再有显示任务就交它好了!
![红.gif 红.gif](https://static.assets-stash.eet-china.com/forum/202109/15/020349w444t6e5eez6g4mr.gif)
![绿.gif 绿.gif](https://static.assets-stash.eet-china.com/forum/202109/15/020353duf5lbafularbzu0.gif)