本帖最后由 jinglixixi_457498010 于 2021-9-15 02:08 编辑

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