日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]????????????????關(guān)注嵌入式云IOT技術(shù)群,給你帶來更多精彩! ????如圖所示,這個(gè)板子的OLED驅(qū)動(dòng)在開源例程里給出,但是不是基于Keil MDK來開發(fā)的,只是用CubeMX生成了對(duì)應(yīng)的驅(qū)動(dòng)源碼,現(xiàn)在我將它的驅(qū)動(dòng)移植到Keil MDK上來, 屏的代碼可以參考: https://githu


                關(guān)注嵌入式云IOT技術(shù)群,給你帶來更多精彩!

    如圖所示,這個(gè)板子的OLED驅(qū)動(dòng)在開源例程里給出,但是不是基于Keil MDK來開發(fā)的,只是用CubeMX生成了對(duì)應(yīng)的驅(qū)動(dòng)源碼,現(xiàn)在我將它的驅(qū)動(dòng)移植到Keil MDK上來, 屏的代碼可以參考:

https://github.com/alibaba/AliOSThings/tree/rel_3.0.0/app/example/dk/dk_gui

一、LCD的管腳定義以及在開發(fā)板上對(duì)應(yīng)的IO


    屏在開發(fā)板上的連接,參考開發(fā)板在github上提供的文檔關(guān)于CubeMX配置,可以找到LCD相關(guān)的管腳。

相關(guān)的管腳連接

即是下面這幾個(gè)核心的管腳:

二、開始stm32CubeMX的配置

2.1 時(shí)鐘配置

2.2 SPI配置

2.3 GPIO配置

三、生成代碼與LCD驅(qū)動(dòng)移植

LCD的初始化代碼以及寄存器手冊(cè)詳情可參考:
https://download.csdn.net/download/bhtlbhtl123/8963365

接下來看一下我移植過來的ST7789.h

#ifndef __ST7789_H
#define __ST7789_H
#include "main.h"
#include "spi.h"

#define WIDTH        240
#define HEIGHT        240
#define BPP        16
#define LCD_MAX_MEM16_BLOCK             (1 << 6)
#define LCD_PIXEL_PER_BLOCK             (LCD_MAX_MEM16_BLOCK >> 1)

/* Init script function */
struct st7789_function {
  uint8_t cmd;
  uint16_t data;
};

/* Init script commands */
enum st7789_cmd {
  ST7789_START,
  ST7789_END,
  ST7789_CMD,
  ST7789_DATA,
  ST7789_DELAY
};

/* ST7789 Commands */
#define ST7789_CASET    0x2A
#define ST7789_RASET    0x2B
#define ST7789_RAMWR    0x2C
#define ST7789_RAMRD    0x2E

//LCD初始化
int st7789_init(void);
//寫寄存器
void LcdWriteReg(uint8_t Data);
//寫數(shù)據(jù)
void LcdWriteData(uint8_t Data);
//將多個(gè)值寫入顯示寄存器
void LcdWriteDataMultiple(uint8_t * pData, int NumItems);
//寫一個(gè)像素到指定位置
void ST7789H2_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode);
//寫一行數(shù)據(jù)    
void ST7789H2_WriteLine(uint16_t Xpos, uint16_t Ypos, uint16_t *RGBCode, uint16_t pointNum);
//顯示圖片
void st7789_display_picture(void);
#endif //__ST7789_H

ST7789.c

#include "ST7789.h"

static SPI_HandleTypeDef *hspi_lcd = NULL;
uint8_t black_gui[480] = {0};
uint8_t endian_buffer[480];

//參考LCD的寄存器手冊(cè)
static struct st7789_function st7789_cfg_script[] = {
  {ST7789_START, ST7789_START},
  {ST7789_CMD, 0x11},
  {ST7789_DELAY, 120},
  {ST7789_CMD, 0x36},
  {ST7789_DATA, 0x00},
  {ST7789_CMD, 0x3a},
  {ST7789_DATA, 0x05},
  {ST7789_CMD, 0xb2},
  {ST7789_DATA, 0x0c},
  {ST7789_DATA, 0x0c},
  {ST7789_DATA, 0x00},
  {ST7789_DATA, 0x33},
  {ST7789_DATA, 0x33},
  {ST7789_CMD, 0xb7},
  {ST7789_DATA, 0x72},
  {ST7789_CMD, 0xbb},
  {ST7789_DATA, 0x3d},
  {ST7789_CMD, 0xc2},
  {ST7789_DATA, 0x01},
  {ST7789_CMD, 0xc3},
  {ST7789_DATA, 0x19},
  {ST7789_CMD, 0xc4},
  {ST7789_DATA, 0x20},
  {ST7789_CMD, 0xc6},
  {ST7789_DATA, 0x0f},
  {ST7789_CMD, 0xd0},
  {ST7789_DATA, 0xa4},
  {ST7789_DATA, 0xa1},
  {ST7789_CMD, 0xe0},
  {ST7789_DATA, 0x70},
  {ST7789_DATA, 0x04},
  {ST7789_DATA, 0x08},
  {ST7789_DATA, 0x09},
  {ST7789_DATA, 0x09},
  {ST7789_DATA, 0x05},
  {ST7789_DATA, 0x2a},
  {ST7789_DATA, 0x33},
  {ST7789_DATA, 0x41},
  {ST7789_DATA, 0x07},
  {ST7789_DATA, 0x13},
  {ST7789_DATA, 0x13},
  {ST7789_DATA, 0x29},
  {ST7789_DATA, 0x2f},
  {ST7789_CMD, 0xe1},
  {ST7789_DATA, 0x70},
  {ST7789_DATA, 0x03},
  {ST7789_DATA, 0x09},
  {ST7789_DATA, 0x0a},
  {ST7789_DATA, 0x09},
  {ST7789_DATA, 0x06},
  {ST7789_DATA, 0x2b},
  {ST7789_DATA, 0x34},
  {ST7789_DATA, 0x41},
  {ST7789_DATA, 0x07},
  {ST7789_DATA, 0x12},
  {ST7789_DATA, 0x14},
  {ST7789_DATA, 0x28},
  {ST7789_DATA, 0x2e},
  {ST7789_CMD, 0x21},
  {ST7789_CMD, 0x29},
  {ST7789_CMD, 0x2a},
  {ST7789_DATA, 0x00},
  {ST7789_DATA, 0x00},
  {ST7789_DATA, 0x00},
  {ST7789_DATA, 0xef},
  {ST7789_CMD, 0x2b},
  {ST7789_DATA, 0x00},
  {ST7789_DATA, 0x00},
  {ST7789_DATA, 0x00},
  {ST7789_DATA, 0xef},
  {ST7789_CMD, 0x2c},
  {ST7789_END, ST7789_END},
};

//ST7789復(fù)位
static void st7789_reset(void)
{    
  HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_SET); 
  HAL_Delay(1);
  HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_RESET);
  HAL_Delay(10);
  HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_SET);  
  HAL_Delay(120);
}

//打開LCD電源
void st7789_power_on(void)
{
    HAL_GPIO_WritePin(LCD_PWR_GPIO_Port, LCD_PWR_Pin, GPIO_PIN_SET); 
}

//ST7789寫函數(shù)
static HAL_StatusTypeDef st7789_write(int is_cmd, uint8_t data)
{
  uint8_t pData[2] = {0};
  assert_param(NULL != hspi_lcd);
  pData[0] = data;
    if (is_cmd)
        HAL_GPIO_WritePin(LCD_DCX_GPIO_Port, LCD_DCX_Pin, GPIO_PIN_RESET);  
    else
        HAL_GPIO_WritePin(LCD_DCX_GPIO_Port, LCD_DCX_Pin, GPIO_PIN_SET);  

  return HAL_SPI_Transmit(hspi_lcd, pData, 1, HAL_MAX_DELAY);
}


static HAL_StatusTypeDef st7789_write_fb(uint16_t *data, uint16_t size)
{
  assert_param(NULL != hspi_lcd);
  return HAL_SPI_Transmit(hspi_lcd, (uint8_t *)data, size, HAL_MAX_DELAY);
}

/********************************************************************
*
*       LcdWriteReg
*
* Function description:
*   Sets display register
*/

void LcdWriteReg(uint8_t Data) 
{
  HAL_GPIO_WritePin(LCD_DCX_GPIO_Port, LCD_DCX_Pin, GPIO_PIN_RESET);  
  HAL_SPI_Transmit(&hspi1, &Data, 110);
}

/********************************************************************
*
*       LcdWriteData
*
* Function description:
*   Writes a value to a display register
*/

void LcdWriteData(uint8_t Data) 
{
  HAL_GPIO_WritePin(LCD_DCX_GPIO_Port, LCD_DCX_Pin, GPIO_PIN_SET);    
  HAL_SPI_Transmit(&hspi1, &Data, 110);
}

/********************************************************************
*
*       LcdWriteDataMultiple
*
* Function description:
*   Writes multiple values to a display register.
*/

void LcdWriteDataMultiple(uint8_t * pData, int NumItems) 
{
  HAL_GPIO_WritePin(LCD_DCX_GPIO_Port, LCD_DCX_Pin, GPIO_PIN_SET);
  HAL_SPI_Transmit(&hspi1, pData, NumItems, 10);
}

//配置啟動(dòng)參數(shù)
static void st7789_run_cfg_script(void)
{
  uint8_t data[2] = {0};
  int i = 0;
  int end_script = 0;

  do {
    switch (st7789_cfg_script[i].cmd) {
    case ST7789_START:
      break;
    case ST7789_CMD:
      data[0] = st7789_cfg_script[i].data & 0xff;
      st7789_write(1, data[0]);
      break;
    case ST7789_DATA:
      data[0] = st7789_cfg_script[i].data & 0xff;
      st7789_write(0, data[0]);
      break;
    case ST7789_DELAY:
      HAL_Delay(120);
      break;
    case ST7789_END:
      end_script = 1;
    }
    i++;
  } while (!end_script);
}

//設(shè)置地址
static void st7789_set_addr_win(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye)
{
  uint8_t col_data[4] = {0};
  uint8_t row_data[4] = {0};

  col_data[0] = xs >> 8 & 0xff;
  col_data[1] = xs & 0xff;
  col_data[2] = xe >> 8 & 0xff;
  col_data[3] = xe & 0xff;
  row_data[0] = ys >> 8 & 0xff;
  row_data[1] = ys & 0xff;
  row_data[2] = ye >> 8 & 0xff;
  row_data[3] = ye & 0xff;
  st7789_write(1, ST7789_CASET);
  st7789_write(0, col_data[0]);
  st7789_write(0, col_data[1]);
  st7789_write(0, col_data[2]);
  st7789_write(0, col_data[3]);
  st7789_write(1, ST7789_RASET);
  st7789_write(0, row_data[0]);
  st7789_write(0, row_data[1]);
  st7789_write(0, row_data[2]);
  st7789_write(0, row_data[3]);
}

//發(fā)送到顯示區(qū)域
static void spec_send_fb(uint16_t color, uint16_t pixel_num)
{
  int i;
  int count, remain;
  uint16_t real_mem[LCD_MAX_MEM16_BLOCK] = {0};

  for (i = 0; i < LCD_MAX_MEM16_BLOCK; ++i) {
    real_mem[i] = color;
  }
  HAL_GPIO_WritePin(LCD_DCX_GPIO_Port, LCD_DCX_Pin, GPIO_PIN_SET);
  if (pixel_num <= LCD_MAX_MEM16_BLOCK) {
    st7789_write_fb(real_mem, pixel_num << 1);
  } else {
    count = pixel_num / LCD_MAX_MEM16_BLOCK;
    remain = pixel_num % LCD_MAX_MEM16_BLOCK;
    for (i = 0; i < count; ++i) {
      st7789_write_fb(real_mem, LCD_MAX_MEM16_BLOCK << 1);
    }
    st7789_write_fb(real_mem, remain << 1);
  }
}

//顯示圖片
void st7789_display_picture(void)
{
  st7789_write(1, ST7789_RAMWR);

  spec_send_fb(0x0, WIDTH * HEIGHT / 4);
  spec_send_fb(0x1111, WIDTH * HEIGHT / 4);
  spec_send_fb(0x7777, WIDTH * HEIGHT / 4);
  spec_send_fb(0xeeee, WIDTH * HEIGHT / 4);
}

//寫寄存器
void ST7789H2_WriteReg(uint8_t Command, uint8_t *Parameters, uint8_t NbParameters)
{
  uint8_t   i;

  /* Send command */
  LcdWriteReg(Command);

  /* Send command's parameters if any */
  for (i=0; i<NbParameters; i++)
  {
    LcdWriteData(Parameters[i]);
  }
}

//在指定位置設(shè)置光標(biāo)
void ST7789H2_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
  uint8_t   parameter[4];
  /* CASET: Comumn Addrses Set */
  parameter[0] = 0x00;     
  parameter[1] = 0x00 + Xpos;
  parameter[2] = 0x00;
  parameter[3] = 0xEF + Xpos;
  ST7789H2_WriteReg(0x2A, parameter, 4);
  /* RASET: Row Addrses Set */  
  parameter[0] = 0x00;
  parameter[1] = 0x00 + Ypos;
  parameter[2] = 0x00;
  parameter[3] = 0xEF + Ypos;
  ST7789H2_WriteReg(0x2B, parameter, 4);
}

//清屏
void BSP_LCD_Clear(void)
{
  uint32_t counter = 0;
  uint32_t y_size = 0;

    memset(black_gui, 0x00sizeof(black_gui));

  for (counter = 0; counter < 240; counter++)
  {
        /* Set Cursor */
        ST7789H2_SetCursor(0, counter); 

        /* Prepare to write to LCD RAM */
        ST7789H2_WriteReg(0x2C, (uint8_t*)NULL0);   /* RAM write data command */

        LcdWriteDataMultiple(black_gui, 480);    
  }
}

//往指定區(qū)域?qū)懸粋€(gè)像素
void ST7789H2_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t data)
{
  uint8_t dataB = 0;

  /* Set Cursor */
  ST7789H2_SetCursor(Xpos, Ypos);

  /* Prepare to write to LCD RAM */
  ST7789H2_WriteReg(0x2C, (uint8_t*)NULL0);   /* RAM write data command */

  /* Write RAM data */
  dataB = (uint8_t)(data >> 8);
  LcdWriteData(dataB);
  dataB = (uint8_t)data;
  LcdWriteData(dataB);
}

//往指定區(qū)域?qū)懸恍袛?shù)據(jù)
void ST7789H2_WriteLine(uint16_t Xpos, uint16_t Ypos, uint16_t *RGBCode, uint16_t pointNum)
{
  int i = 0;

  /* Set Cursor */
  ST7789H2_SetCursor(Xpos, Ypos);

  /* Prepare to write to LCD RAM */
  ST7789H2_WriteReg(0x2C, (uint8_t*)NULL0);   /* RAM write data command */

  for (i = 0; i < pointNum; i++) {
    endian_buffer[2*i] = (uint8_t)(RGBCode[i] >> 8);
    endian_buffer[2*i + 1] = (uint8_t)RGBCode[i];
  }

  /* Write RAM data */
  LcdWriteDataMultiple(endian_buffer, pointNum*2);
}




//ST7789初始化
int st7789_init(void)
{
  hspi_lcd = &hspi1;
  st7789_power_on();
  st7789_reset();
  st7789_run_cfg_script();
  return HAL_OK;
}

在main.c中添加邏輯:

/**
  * @brief  The application entry point.
  * @retval int
  */

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */


  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  /* USER CODE BEGIN 2 */
  st7789_init();
  st7789_display_picture();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
      HAL_Delay(200);
  }
  /* USER CODE END 3 */
}

四、運(yùn)行結(jié)果


     由于這個(gè)板子遺留較多硬件問題且諾行不愿在開發(fā)板出廠時(shí)修復(fù);開發(fā)板相關(guān)文檔較亂,所以只能靠自己慢慢探索咯,總體來說,這個(gè)板子還是非常強(qiáng)大的,可以用做日常學(xué)習(xí),詳情可看:

https://github.com/alibaba/AliOS-Things/wiki/Developer-Kit-Tutorial





免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉