上次存在的下载问题解决了,终于可以进行程序设计了!
这里的程序下载与以前的方式完成不一样,是使用纯指令来完成的,恍惚又会到了以往的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下载前
当然省事的办法就是直接将Debug文件夹的bin文件直接拖至“DK6Programmer.exe-V5 -s +“串口号”-P 1000000 -p FLASH@0x00=”之后,然后回车,随后再输入“Y”即可,见图2所示。
图2 完成下载
程序下载后,开发板就会自动加载运行程序。
这种下载方式还是比较适合连续调试,因为程序修改编译后,只需按一下“↑”键即可召回原来的指令予以执行。
对于I/O的使用,最好是由LED开启,在开发板上有2个LED,即红色的D4和绿色的D3,见图3所示。由于LED的一端已接GND,因此另一端提供高电平即可点亮。
图3 LED电路
在程序中,用函数GPIO_PortSet( )来点亮LED,用函数GPIO_PortClear ( )来点亮LED,要使LED闪烁,则用函数GPIO_PortToggle ( )。
图4 红灯的点亮与熄灭
对于2个LED该如何来控制它们呢?
那就是从引脚入手,要点亮红灯用GPIO_PortSet(GPIO, BOARD_LED_PORT, 1u << 0);
要点亮绿灯用GPIO_PortSet(GPIO,BOARD_LED_PORT, 1u <<1);
图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 显示效果
有了OLED屏的显示功能,后面再有显示任务就交它好了!