[活动专区] 【AT-START-F425测评】移植RTThread-Nano以及进行OLED显示

[复制链接]
 楼主| 怀揣少年梦 发表于 2022-3-28 19:39 | 显示全部楼层 |阅读模式
一、为什么移植RT-Thread
       RT-Thread是一个完全国产化的嵌入式实时多线程操作系统,看到AT32例程并没有关于RT-Thread的移植,鉴于AT32F425最大FLASH只有64K,故移植RT-Thread极简版,也就是RT-Thread Nano。
二、准备工作
       1、AT32F425 BSP以及固件库。
       下载链接:雅特力科技 : 32位微控制器的创新领导者! (arterytek.com)
       2、RT-Thread Nano源码安装包
       方法一、通过KEIL安装
1)打开 MDK 软件,点击工具栏的 Pack Installer 图标
企业微信截图_16484439054364.png

       2)点击右侧的 Pack,展开 Generic,可以找到 RealThread::RT-Thread,点击 Action 栏对应的 Install ,就可以在线安装 Nano Pack 了。另外,如果需要安装其他版本,则需要展开 RealThread::RT-Thread,进行选择
       企业微信截图_16484435819836.png

       方法二、从官网下载即可。
https://www.rt-thread.org/download/mdk/RealThread.RT-Thread.3.1.5.pack
下载完,直接双击即可。
三、移植流程
       1、新建AT32F425的基本工程(官方给的是所有的工程共用BSP)
       1)复制官方的library到自己所新建的文件夹,并且添加at32f425_board.c、at32f425_board.h、at32f425_clock.c、at32f425_clock.h、at32f425_int.c、at32f425_int.h、main.c、at32f425_conf.h文件。
       2)添加相应的C文件、添加.h文件目录。然后编译。
       2、添加RT-Thread Nano到工程
       1)点击工具栏Manage Run-Time Environment图标,如下图:
       8a110ac9d3b5e98c02d28064456a2ffe.jpg
       2)在 Manage Rum-Time Environment 里"Software Component" 栏找到 RTOS,sel 栏选择 RT-Thread,然后勾选 kernel,点击 "OK" 就添加 RT-Thread 内核到工程了。展开RTOS就可以看到添加到工程的文件。如图所示。
       2d3752e5d66f94e3434dc433d91a97da.jpg

       eb50418540fd0a95a87bea5c6fd76245.jpg
       3、适配RT-Thread Nano
       1)在at32f425_init.c文件中注释HardFault_Handler、PendSV_Handler、SysTick_Handler,这些已经由RT-Thread实现了。
       2)在borad.c中实现系统时钟配置和OS tick配置。然后在main.c函数里面加入LED显示配置,编译,检查是否移植正确
  1. /*
  2. * Copyright (c) 2006-2019, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date           Author       Notes
  8. * 2021-05-24                  the first version
  9. */

  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include "at32f425_board.h"
  13. #include "at32f425_clock.h"
  14. #include "at32f425.h"

  15. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  16. /*
  17. * Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
  18. * the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
  19. */
  20. #define RT_HEAP_SIZE (15*1024)
  21. static rt_uint8_t rt_heap[RT_HEAP_SIZE];

  22. RT_WEAK void *rt_heap_begin_get(void)
  23. {
  24.     return rt_heap;
  25. }

  26. RT_WEAK void *rt_heap_end_get(void)
  27. {
  28.     return rt_heap + RT_HEAP_SIZE;
  29. }
  30. #endif


  31. void rt_os_tick_callback(void)
  32. {
  33.     rt_interrupt_enter();
  34.    
  35.     rt_tick_increase();

  36.     rt_interrupt_leave();
  37. }

  38. /* cortex-m ¼Ü¹¹Ê¹Óà SysTick_Handler() */
  39. void SysTick_Handler(void)
  40. {
  41.     rt_os_tick_callback();
  42. }

  43. /**
  44. * This function will initial your board.
  45. */
  46. void rt_hw_board_init(void)
  47. {
  48.     /*
  49.      * TODO 1: OS Tick Configuration
  50.      * Enable the hardware timer and call the rt_os_tick_callback function
  51.      * periodically with the frequency RT_TICK_PER_SECOND.
  52.      */
  53.      system_clock_config();//system clock config
  54.            /* init LED2 LED3 LED4 */
  55.            at32_board_init();   
  56.                   /* init usart1 */
  57.      uart_print_init(115200);
  58.                  /* 2¡¢OS Tick ƵÂÊÅäÖã¬RT_TICK_PER_SECOND = 1000 ±íʾ 1ms ´¥·¢Ò»´ÎÖÐ¶Ï */
  59.      SysTick_Config(system_core_clock / RT_TICK_PER_SECOND);
  60.      /* Call components board initial (use INIT_BOARD_EXPORT()) */
  61.        
  62. #ifdef RT_USING_COMPONENTS_INIT
  63.     rt_components_board_init();
  64. #endif

  65. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  66.     rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());  //use dynamic memory heap
  67. #endif
  68. }

  69. #ifdef RT_USING_CONSOLE

  70. static int uart_init(void)
  71. {
  72.           /* init usart1 */
  73.     uart_print_init(115200);
  74.        
  75.     return 0;
  76. }
  77. INIT_BOARD_EXPORT(uart_init);

  78. void rt_hw_console_output(const char *str)
  79. {
  80.                 rt_enter_critical(); //enter critial area
  81.     while(*str != '\0')  
  82.                 {
  83.                     if(*str == '\n')
  84.                                 {
  85.                                     usart_data_transmit(USART1, '\r');
  86.                                           while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
  87.                                 }
  88.                           usart_data_transmit(USART1, *str++);
  89.                           while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
  90.                 }
  91.                 rt_exit_critical();//exit critial area
  92. }

  93. #endif

       4、编写OLED驱动
  1. #include "OLED.h"
  2. #include "oledfont.h"
  3. #include <rtthread.h>


  4. /*OLED¶ÎÂë·Ö²¼
  5. Õý³£
  6. £¨page0)      SEG0-SEG128
  7.                                         COM0
  8.                                          |
  9.                                         COM7

  10. ·´ÖÃ
  11. £¨page0)       SEG128-SEG0
  12.                                         COM63
  13.                                          |
  14.                                         COM56
  15.                                        
  16. дÃüÁÆäʵÊÇд¼Ä´æÆ÷
  17. */


  18. /****************************************************************************
  19. * Ãû        ³Æ£ºvoid OLED_Config(void)
  20. * ¹¦        ÄÜ£ºÅäÖÃOLEDÏà¹ØÅäÖÃ
  21. * Èë¿Ú²ÎÊý£ºÎÞ
  22. * ³ö¿Ú²ÎÊý£ºÎÞ
  23. * ˵        Ã÷£º
  24. ****************************************************************************/
  25. void OLED_Config(void)
  26. {
  27.         OLED_GPIO_Init();
  28.         OLED_SPI_Init();
  29.         OLED_Init();
  30. }
  31. /****************************************************************************
  32. * Ãû        ³Æ£ºvoid OLED_GPIO_Init(void)
  33. * ¹¦        ÄÜ£ºÅäÖÃÔÚOLEDÓëstm32¼äspiͨÐŵÄÒý½Å¼°¿ØÖÆOLEDµÄÒý½Å
  34. * Èë¿Ú²ÎÊý£ºÎÞ
  35. * ³ö¿Ú²ÎÊý£ºÎÞ
  36. * ˵        Ã÷£º
  37. ****************************************************************************/
  38. void OLED_GPIO_Init(void)
  39. {
  40.   gpio_init_type gpio_init_struct;

  41.   /* enable the button clock */
  42.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  43.         crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);

  44.   /* set default parameter */
  45.   gpio_default_para_init(&gpio_init_struct);

  46.   /* configure button pin as input with pull-up/pull-down */
  47.         //OLED ƬѡÒý½Å
  48.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  49.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  50.   gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  51.   gpio_init_struct.gpio_pins = GPIO_PINS_4 ;
  52.         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  53.   gpio_init(GPIOA, &gpio_init_struct);
  54.         gpio_bits_set(GPIOA, GPIO_PINS_4);
  55.        
  56.         //OLED ¸´Î»Òý½Å
  57.         gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  58.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  59.   gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  60.   gpio_init_struct.gpio_pins = GPIO_PINS_6;
  61.         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  62.   gpio_init(GPIOA, &gpio_init_struct);
  63.         gpio_bits_set(GPIOA, GPIO_PINS_6);
  64.        
  65.         //OLED SCLK¹Ü½Å
  66.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  67.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  68.         gpio_init_struct.gpio_pull      = GPIO_PULL_DOWN;
  69.   gpio_init_struct.gpio_mode                         = GPIO_MODE_MUX;
  70.   gpio_init_struct.gpio_pins                         = GPIO_PINS_5;
  71.         gpio_init(GPIOA, &gpio_init_struct);
  72.         gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_0);
  73.        
  74.         //OLED MOSI¹Ü½Å
  75.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  76.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  77.         gpio_init_struct.gpio_pull                         = GPIO_PULL_DOWN;
  78.   gpio_init_struct.gpio_mode                         = GPIO_MODE_MUX;
  79.   gpio_init_struct.gpio_pins                         = GPIO_PINS_7;
  80.         gpio_init(GPIOA, &gpio_init_struct);
  81.   gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_0);
  82.        
  83.        
  84.   //OLED Êý¾ÝºÍÃüÁî¿ØÖÆÒý½Å
  85.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  86.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  87.   gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  88.   gpio_init_struct.gpio_pins = GPIO_PINS_0;
  89.         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  90.   gpio_init(GPIOB, &gpio_init_struct);
  91.         gpio_bits_set(GPIOB, GPIO_PINS_0);
  92.        
  93. }


  94. /****************************************************************************
  95. * Ãû        ³Æ£ºvoid OLED_SPI_Init(void)       
  96. * ¹¦        ÄÜ£ºÅäÖÃÔÚOLEDÓëstm32¼äspiͨÐŵijõʼ»¯
  97. * Èë¿Ú²ÎÊý£ºÎÞ
  98. * ³ö¿Ú²ÎÊý£ºÎÞ
  99. * ˵        Ã÷£º
  100. ****************************************************************************/
  101. void OLED_SPI_Init(void)
  102. {
  103.         spi_init_type SPI_InitStructure;
  104.        
  105.   crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);

  106.         //ÅäÖÃSPI1Ïà¹Ø²ÎÊý£ºÈ«Ë«¹¤Í¨ÐÅ¡¢MSB/LSB¡¢Í¨ÐÅËÙ¶È¡¢¹¤×÷ģʽ£¨mode0~mode3£©......
  107.         SPI_InitStructure.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;                //ȫ˫¹¤Í¨ÐÅ
  108.         SPI_InitStructure.master_slave_mode = SPI_MODE_MASTER;                                                                                                        //Ö÷»ú½ÇÉ«
  109.         SPI_InitStructure.frame_bit_num = SPI_FRAME_8BIT;                                 //¿´Ê±Ðòͼ£¬8λÊý¾Ýλ
  110.         SPI_InitStructure.clock_polarity = SPI_CLOCK_POLARITY_LOW;                                                                                                                //ʱÖÓÏß¿ÕÏеÄʱºòÊÇʲôµçƽ£¬µ±Ç°ÅäÖÃΪµÍµçƽ
  111.         SPI_InitStructure.clock_phase = SPI_CLOCK_PHASE_1EDGE;                          //Ö÷»úÔÚʱÖÓÏßÄÄÒ»¸öʱ¿Ì¶ÁÈ¡MISOÒý½ÅµÄµçƽ£¬ÔÚʱÖÓµÚÒ»¸ö±ßÑØÀ´²É¼¯Êý¾Ý
  112.         SPI_InitStructure.cs_mode_selection = SPI_CS_SOFTWARE_MODE;                                                                                                                        //ƬѡÐèÒª´úÂë¿ØÖÆ
  113.         SPI_InitStructure.mclk_freq_division = SPI_MCLK_DIV_256;                //SPI1µÄͨÐÅÓ²¼þʱÖÓ=72MHz/256   
  114.         SPI_InitStructure.first_bit_transmission = SPI_FIRST_BIT_MSB;                                                                                //×î¸ßÓÐЧλÓÅÏÈ´«Êä
  115.         spi_init(SPI1,&SPI_InitStructure);
  116.        
  117.   spi_enable(SPI1, TRUE);
  118.        
  119.        
  120. }


  121. /****************************************************************************
  122. * Ãû        ³Æ£ºvoid OLED_Init(void)       
  123. * ¹¦        ÄÜ£ºOLED³õʼ»¯
  124. * Èë¿Ú²ÎÊý£ºÎÞ
  125. * ³ö¿Ú²ÎÊý£ºÎÞ
  126. * ˵        Ã÷£º²ÎÕÕÉϵçÐòÁгõʼ»¯£¨24/40£©
  127. ****************************************************************************/
  128. void OLED_Init(void)
  129. {
  130.        
  131.         OLED_CS_High;
  132.         //¸´Î»OLED
  133.         OLED_RST_High;  
  134.         rt_thread_mdelay(200);
  135.         OLED_RST_Low;
  136.         rt_thread_mdelay(200);
  137.         OLED_RST_High;
  138.        
  139.         OLED_Write_Operate(OLED_Mode_Cmd,0xAE); //¹Ø±ÕOLED
  140.         OLED_Write_Operate(OLED_Mode_Cmd,0x00); //ÉèÖÃÁеÍλµØÖ·
  141.         OLED_Write_Operate(OLED_Mode_Cmd,0x10); //ÉèÖÃÁиßλµØÖ·
  142.   OLED_Write_Operate(OLED_Mode_Cmd,0x40); //ÉèÖÃÆðʼÐеØÖ·¼°Ó³ÉäRAMÏÔʾÆðʼÐÐ (0x00~0x3F£©
  143.         OLED_Write_Operate(OLED_Mode_Cmd,0xB0); //ÉèÖÃÒ³µØÖ·
  144.         OLED_Write_Operate(OLED_Mode_Cmd,0x81); //¶Ô±È¶ÈÉèÖà                                               
  145.         OLED_Write_Operate(OLED_Mode_Cmd,0xCF); //Set SEG Output Current Brightness
  146.        
  147.         OLED_Write_Operate(OLED_Mode_Cmd,0xA1); //Set SEG/Column Mapping     0xa0×óÓÒ·´ÖÃ 0xa1Õý³£
  148.         OLED_Write_Operate(OLED_Mode_Cmd,0xA6); //
  149.         OLED_Write_Operate(OLED_Mode_Cmd,0xA8); //ÉèÖÃÇý¶¯Â·Êý(1 to 64)
  150.         OLED_Write_Operate(OLED_Mode_Cmd,0x3F); //*duty = 1/64*/
  151.         OLED_Write_Operate(OLED_Mode_Cmd,0xC8); //0xc0ÉÏÏ·´Öà 0xc8Õý³£
  152.         OLED_Write_Operate(OLED_Mode_Cmd,0xD3); //ÉèÖÃÏÔÊ¾Æ«ÒÆ(0x00~0x3F)
  153.         OLED_Write_Operate(OLED_Mode_Cmd,0x00); //not offset
  154.         OLED_Write_Operate(OLED_Mode_Cmd,0xD5); //--set Display clock divide ratio/oscillator frequency
  155.         OLED_Write_Operate(OLED_Mode_Cmd,0x80); //--set divide ratio, Set Clock as 100 Frames/Sec
  156.         OLED_Write_Operate(OLED_Mode_Cmd,0xD9); //*set pre-charge period*/
  157.         OLED_Write_Operate(OLED_Mode_Cmd,0Xf1); //Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  158.         OLED_Write_Operate(OLED_Mode_Cmd,0xDA); //*set COM pins*/
  159.         OLED_Write_Operate(OLED_Mode_Cmd,0x12); //
  160.         OLED_Write_Operate(OLED_Mode_Cmd,0xdb); //*set vcomh*/
  161.         OLED_Write_Operate(OLED_Mode_Cmd,0x40); //Set VCOM Deselect Level
  162.         /**/
  163.         OLED_Write_Operate(OLED_Mode_Cmd,0x20);        //ÉèÖô洢ģʽ£¨0x00,0x02£¬0x01£©
  164.         OLED_Write_Operate(OLED_Mode_Cmd,0x02); //Ò³µØÖ·Ä£Ê½
  165.        
  166.         OLED_Write_Operate(OLED_Mode_Cmd,0x8d); //*set charge pump disable*/
  167.         OLED_Write_Operate(OLED_Mode_Cmd,0x14); //--set(0x10) disable
  168.         /**/
  169.         OLED_Write_Operate(OLED_Mode_Cmd,0xA4); //ÏÔʾ¿ªÆô£¨A4£¬ÏÔʾ£¬A5ÎÞÏÔʾ£©
  170.         OLED_Write_Operate(OLED_Mode_Cmd,0xA6); //±³¾°Õý·´ÏòÏÔʾ£¨0xa6,ÕýÏÔ£¬0xa7£¬·´ÏÔ£©
  171.        
  172.        
  173.         OLED_Display_Clear();                                                                                //ÇåÆÁ
  174.         OLED_Write_Operate(OLED_Mode_Cmd,0xAF); //´ò¿ªÏÔʾ
  175.        
  176. }


  177. /****************************************************************************
  178. * Ãû        ³Æ£ºu8 SPI1_WriteReadByte(u8 Data)       
  179. * ¹¦        ÄÜ£ºSPI1¶Áдһ¸ö×Ö½Ú
  180. * Èë¿Ú²ÎÊý£ºÎÞ
  181. * ³ö¿Ú²ÎÊý£º½ÓÊÕµÄÊý¾Ý
  182. * ·µ»ØÖµ  £º0£¬·¢ËͽÓÊÕ³¬Ê±£¬1³É¹¦
  183. * ˵        Ã÷£ºÎÞ
  184. ****************************************************************************/
  185. u8 SPI1_WriteReadByte(u8 Data)
  186. {
  187.         u8 cnt = 0;
  188.         while(spi_i2s_flag_get(SPI2, SPI_I2S_TDBE_FLAG) == RESET)        //µÈ´ý·¢ËÍÇøÎª¿Õ
  189.         {
  190.                 cnt++;
  191.                 if( cnt > 100)
  192.                         return 0;
  193.                
  194.         }
  195.         spi_i2s_data_transmit(SPI1,Data);                                                                                                                                        //·¢ËÍÒ»¸ö×Ö½ÚµÄÊý¾Ý
  196.         cnt = 0;
  197.         while(spi_i2s_flag_get(SPI1, SPI_I2S_RDBF_FLAG) == RESET)        //µÈ´ý½ÓÊÕÍêÒ»¸öByte
  198.         {       
  199.                 cnt++;
  200.                 if( cnt > 100)
  201.                         return 0;
  202.         }
  203.         return spi_i2s_data_receive(SPI1);                                                                                                //½ÓÊÕÒ»¸ö×Ö½ÚµÄÊý¾Ý
  204.        
  205. }

  206. /****************************************************************************
  207. * Ãû        ³Æ£ºu8 OLED_Write_Byte(u8 data)       
  208. * ¹¦        ÄÜ£ºOLEDдһ¸ö×Ö½Ú
  209. * Èë¿Ú²ÎÊý£ºÎÞ
  210. * ³ö¿Ú²ÎÊý£º½ÓÊÕµÄÊý¾Ý
  211. * ·µ»ØÖµ  £º0ʧ°Ü£¬1³É¹¦
  212. * ˵        Ã÷£ºÎÞ
  213. ****************************************************************************/
  214. u8 OLED_Write_Byte(u8 data)
  215. {
  216.         if(!SPI1_WriteReadByte(data))
  217.                 return 0;
  218.         else
  219.                 return 1;
  220. }


  221. /****************************************************************************
  222. * Ãû        ³Æ£ºvoid OLED_Write_Operate(u8 mode,u8 data)
  223. * ¹¦        ÄÜ£ºOLEDд²Ù×÷
  224. * Èë¿Ú²ÎÊý£ºÄ£Ê½£¬Êý¾Ý
  225. * ³ö¿Ú²ÎÊý£ºÎÞ
  226. * ·µ»ØÖµ  £ºÎÞ
  227. * ˵        Ã÷£ºÎÞ
  228. ****************************************************************************/
  229. void OLED_Write_Operate(u8 mode,u8 data)
  230. {
  231.         OLED_CS_Low;
  232.        
  233.         if(mode)
  234.         {
  235.                 OLED_Write_Data;
  236.         }
  237.         else
  238.         {
  239.                 OLED_Write_Cmd;
  240.         }
  241.        
  242.         OLED_Write_Byte(data);
  243.        
  244.         OLED_CS_High;
  245. }


  246. /****************************************************************************
  247. * Ãû        ³Æ£ºvoid OLED_Display_Clear(void)
  248. * ¹¦        ÄÜ£ºOLEDÇåÆÁ
  249. * Èë¿Ú²ÎÊý£ºÎÞ
  250. * ³ö¿Ú²ÎÊý£ºÎÞ
  251. * ·µ»ØÖµ  £ºÎÞ
  252. * ˵        Ã÷£ºÎÞ
  253. ****************************************************************************/
  254. void OLED_Display_Clear(void)
  255. {
  256.         u8 page = 0;
  257.         u8 i=0;
  258.         OLED_CS_Low;
  259.        
  260.         for(page=0;page < 8; page++)
  261.         {
  262.                 OLED_Write_Operate(OLED_Mode_Cmd,0xB0+page);//ÉèÖÃÒ³µØÖ·
  263.                 OLED_Write_Operate(OLED_Mode_Cmd,0x00);     //ÉèÖÃÏÔʾλÖÃ-Áе͵ØÖ·
  264.           OLED_Write_Operate(OLED_Mode_Cmd,0x10);     //ÉèÖÃÏÔʾλÖÃ-ÁиߵØÖ·
  265.                
  266.                 for(i = 0;i< 128; i++)
  267.                 {
  268.                         OLED_Write_Operate(OLED_Mode_Data,0x00);  //ÇåÆÁ
  269.                 }
  270.         }
  271. }



  272. /****************************************************************************
  273. * Ãû        ³Æ£ºvoid OLED_Set_Positon(void)
  274. * ¹¦        ÄÜ£ºÉèÖÃÏÔÊ¾×ø±ê
  275. * Èë¿Ú²ÎÊý£ºx,y
  276. * ³ö¿Ú²ÎÊý£ºÎÞ
  277. * ·µ»ØÖµ  £ºÎÞ
  278. * ˵        Ã÷£ºÎÞ
  279. ****************************************************************************/
  280. void OLED_Set_Positon(u8 x,u8 y)
  281. {
  282.        
  283.         OLED_Write_Operate(OLED_Mode_Cmd,0xB0 + y);                                                           //ÉèÖÃÒ³µØÖ·
  284.         OLED_Write_Operate(OLED_Mode_Cmd,((x & 0xf0) >>4 ) | 0x10); //ÉèÖÃÁиßËÄλµØÖ·
  285.         OLED_Write_Operate(OLED_Mode_Cmd,(x & 0x0f) | 0x01);              //ÉèÖÃÁеÍËÄλµØÖ·

  286. }


  287. /****************************************************************************
  288. * Ãû        ³Æ£ºvoid OLED_Display_on(void)
  289. * ¹¦        ÄÜ£ºÏÔʾ´ò¿ª
  290. * Èë¿Ú²ÎÊý£ºÎÞ
  291. * ³ö¿Ú²ÎÊý£ºÎÞ
  292. * ·µ»ØÖµ  £ºÎÞ
  293. * ˵        Ã÷£ºÎÞ
  294. ****************************************************************************/
  295. void OLED_Display_on(void)
  296. {
  297.        
  298.         OLED_Write_Operate(OLED_Mode_Cmd,0x8d); //д³äµç±Ã¼Ä´æÆ÷
  299.         OLED_Write_Operate(OLED_Mode_Cmd,0x14); //´ò¿ª³äµç±Ã
  300.         OLED_Write_Operate(OLED_Mode_Cmd,0xAF);        //´ò¿ªOLEDÏÔʾ

  301. }


  302. /****************************************************************************
  303. * Ãû        ³Æ£ºvoid OLED_Display_offvoid)
  304. * ¹¦        ÄÜ£ºÏÔʾ¹Ø±Õ
  305. * Èë¿Ú²ÎÊý£ºÎÞ
  306. * ³ö¿Ú²ÎÊý£ºÎÞ
  307. * ·µ»ØÖµ  £ºÎÞ
  308. * ˵        Ã÷£ºÎÞ
  309. ****************************************************************************/
  310. void OLED_Display_off(void)
  311. {
  312.        
  313.         OLED_Write_Operate(OLED_Mode_Cmd,0x8d); //д³äµç±Ã¼Ä´æÆ÷
  314.         OLED_Write_Operate(OLED_Mode_Cmd,0x10); //¹Ø±Õ³äµç±Ã
  315.         OLED_Write_Operate(OLED_Mode_Cmd,0xAE);        //¹Ø±ÕOLEDÏÔʾ

  316. }


  317. /****************************************************************************
  318. * Ãû        ³Æ£ºvoid OLED_Display_onechar(u8 x,u8 y,u8 character,u8 size)
  319. * ¹¦        ÄÜ£ºÏÔʾµ¥¸ö×Ö·û
  320. * Èë¿Ú²ÎÊý£º
  321. x ,y×ø±êλÖÃ
  322. character ×Ö·û
  323. size ×ֺŴóС
  324. * ³ö¿Ú²ÎÊý£ºÎÞ
  325. * ·µ»ØÖµ  £ºÎÞ
  326. * ˵        Ã÷£ºÎÞ
  327. ****************************************************************************/
  328. void OLED_Display_onechar(u8 x,u8 y,u8 character,u8 size)
  329. {
  330.         u8 c=0,i=0;
  331.         c = character-' ';
  332.         if(x > MAX_COLUMN - 1)
  333.         {
  334.                 x= 0;
  335.                 if(size == SIZE8)
  336.                 {
  337.                         y = y+1;
  338.                 }
  339.                 if(size == SIZE16)
  340.                 {
  341.                         y = y+2;
  342.                 }
  343.         }
  344.         if(size == SIZE16)
  345.         {
  346.                 OLED_Set_Positon(x,y);
  347.                 for( i =0;i< 8; i++)
  348.                 {
  349.                         OLED_Write_Operate(OLED_Mode_Data,F8X16[c*16 + i]);
  350.                 }
  351.                 OLED_Set_Positon(x,y+1);
  352.                 for( i =0;i< 8; i++)
  353.                 {
  354.                         OLED_Write_Operate(OLED_Mode_Data,F8X16[c*16 + i+8]);
  355.                 }
  356.         }
  357.         else
  358.         {
  359.                 OLED_Set_Positon(x,y+1);
  360.                 for( i =0;i< 6; i++)
  361.                 {
  362.                         OLED_Write_Operate(OLED_Mode_Data,F6x8[c][i]);
  363.                 }
  364.         }
  365. }


  366. /****************************************************************************
  367. * Ãû        ³Æ£ºvoid OLED_Display_string(u8 x,u8 y,u8 *str,u8 size)
  368. * ¹¦        ÄÜ£ºÏÔʾ×Ö·û´®
  369. * Èë¿Ú²ÎÊý£º
  370. x ,y×ø±êλÖÃ
  371. str ×Ö·û´®
  372. size ×ֺŴóС
  373. * ³ö¿Ú²ÎÊý£ºÎÞ
  374. * ·µ»ØÖµ  £ºÎÞ
  375. * ˵        Ã÷£ºÎÞ
  376. ****************************************************************************/
  377. void OLED_Display_string(u8 x,u8 y,u8 *str,u8 size)
  378. {
  379.         u8 i=0;
  380.         while(str[i]!='\0')
  381.         {
  382.                 OLED_Display_onechar(x,y,str[i],size);
  383.                 x += 8;
  384.                 if(x > 120)
  385.                 {
  386.                         x = 0;
  387.                         y += 2;
  388.                 }
  389.                 i++;
  390.         }
  391. }


  392. /****************************************************************************
  393. * Ãû        ³Æ£ºvoid OLED_Display_Chinese(u8 x,u8 y,u8 Sno)
  394. * ¹¦        ÄÜ£ºÏÔʾµ¥¸ö×Ö·û
  395. * Èë¿Ú²ÎÊý£º
  396. x ,y×ø±êλÖÃ
  397. Sno ±íʾºº×ÖÊý×éÖÐÒ»¸ö×ÖµÄÂëËùÕ¼µÄÐòºÅ
  398. * ³ö¿Ú²ÎÊý£ºÎÞ
  399. * ·µ»ØÖµ  £ºÎÞ
  400. * ˵        Ã÷£ºÎÞ
  401. ****************************************************************************/
  402. void OLED_Display_Chinese(u8 x,u8 y,u8 Sno)
  403. {
  404.         u8 adder=0,i=0;
  405.         OLED_Set_Positon(x,y);
  406.         for(i = 0;i< 16;i++)
  407.         {
  408.                 OLED_Write_Operate(OLED_Mode_Data,Hzk[2*Sno][i]);
  409.                 adder += 1;
  410.         }
  411.   OLED_Set_Positon(x,y+1);
  412.         for(i = 0;i< 16;i++)
  413.         {
  414.                 OLED_Write_Operate(OLED_Mode_Data,Hzk[2*Sno+1][i]);
  415.                 adder += 1;
  416.         }       
  417. }



  418. /****************************************************************************
  419. * Ãû        ³Æ£ºu32 OLED_POW(u8 m, u8 n)
  420. * ¹¦        ÄÜ£ºmµÄn´Î·½
  421. * Èë¿Ú²ÎÊý£º
  422. mΪµ×Êý£¬nΪָÊý
  423. * ³ö¿Ú²ÎÊý£ºÎÞ
  424. * ·µ»ØÖµ  £ºÎÞ
  425. * ˵        Ã÷£ºÎÞ
  426. ****************************************************************************/
  427. u32 OLED_POW(u8 m, u8 n)
  428. {
  429.         u32 result=1;
  430.         while(n--)
  431.         {
  432.                 result *= m;
  433.         }
  434.         return result;
  435. }


  436. /****************************************************************************
  437. * Ãû        ³Æ£ºvoid OLED_Display_Num(u8 x,u8 y,u32 num, u8 Len,u8 size)
  438. * ¹¦        ÄÜ£ºÏÔʾµ¥¸ö×Ö·û
  439. * Èë¿Ú²ÎÊý£º
  440. x ,y×ø±êλÖÃ
  441. Sno ±íʾºº×ÖÊý×éÖÐÒ»¸ö×ÖµÄÂëËùÕ¼µÄÐòºÅ
  442. * ³ö¿Ú²ÎÊý£ºÎÞ
  443. * ·µ»ØÖµ  £ºÎÞ
  444. * ˵        Ã÷£ºÎÞ
  445. ****************************************************************************/
  446. void OLED_Display_Num(u8 x,u8 y,u32 num, u8 len,u8 size)
  447. {
  448.         u8 i=0;
  449.         u8 endisplay=0;
  450.         u8 temp=0;
  451.         for(i = 0;i < len;i++)
  452.         {
  453.                 temp = (num / (OLED_POW(10,len-i-1)))%10;
  454.                 if(endisplay == 0 && i < len-1)
  455.                 {
  456.                         if(temp == 0)
  457.                         {
  458.                                 OLED_Display_onechar(x + (size / 2) * i,y,' ',size);
  459.                                 continue;
  460.                         }
  461.                         else
  462.                         {
  463.                                 endisplay = 1;
  464.                         }
  465.                 }
  466.                 OLED_Display_onechar(x + (size / 2) * i,y,temp + '0',size);
  467.         }
  468. }


  469. /****************************************************************************
  470. * Ãû        ³Æ£ºvoid OLED_Display_Picture(u8 x0, u8 y0, u8 x1, u8 y1, u8 BMP[])
  471. * ¹¦        ÄÜ£ºÏÔʾһÕÅͼƬ
  472. * Èë¿Ú²ÎÊý£º
  473. x0 ,y0£¬x1£¬y1ͼƬµÄ´óС
  474. BMP[] ͼƬµÄÂë
  475. * ³ö¿Ú²ÎÊý£ºÎÞ
  476. * ·µ»ØÖµ  £ºÎÞ
  477. * ˵        Ã÷£ºÎÞ
  478. ****************************************************************************/
  479. void OLED_Display_Picture(u8 x0, u8 y0, u8 x1, u8 y1, u8 BMP[])
  480. {
  481.         u8 i=0;
  482.         u8 x,y;
  483.   if(y1 == 8)
  484.   {
  485.    y= y1/ 8;
  486.         }               
  487.         else
  488.         {
  489.                 y = y1/ 8 + 1;
  490.         }
  491.         for(y = y0;y < y1;y++)
  492.         {
  493.                 OLED_Set_Positon(x0,y);
  494.                 for(x = x0;x< x1; x++)
  495.                 {
  496.                         OLED_Write_Operate(OLED_Mode_Data,BMP[i++]);
  497.                 }       
  498.         }
  499. }
       5、最后的现象
    69463c02b0265a3176b9d24cb9252d21.jpg
    源代码:
RTT-4250.zip (9.55 MB, 下载次数: 25)
deliahouse887 发表于 2022-5-16 09:56 | 显示全部楼层
keil自带的吗?

评论

是自己移植的  发表于 2022-5-19 16:28
myiclife 发表于 2022-5-16 10:09 | 显示全部楼层
这个rtt系统自己移植的吗  

评论

是的,自己移植。官网也有移植教程  发表于 2022-5-19 16:39
sanfuzi 发表于 2022-5-16 10:30 | 显示全部楼层
RTThread-Nano性能在呢么样?

评论

个人觉得性能还是不错,尤其是后续的支持多种组件  发表于 2022-5-19 16:41
macpherson 发表于 2022-5-16 11:09 | 显示全部楼层
有延时的图片吗?
sheflynn 发表于 2022-5-16 16:17 | 显示全部楼层
这个工程文件后续还可以移植吗

评论

可以继续移植  发表于 2022-5-19 16:44
gygp 发表于 2022-5-16 17:06 | 显示全部楼层
启动文件如何操作的?

评论

在RTThread官网下载移植文件,启动文件已经设置好了,只需要里面的系统初始化函数,更改一下,另外就是注释异常处理函数即可。  发表于 2022-5-19 16:46
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:一切皆有可能

45

主题

473

帖子

3

粉丝
快速回复 返回顶部 返回列表