RM67162除錯案例

2021-09-27 08:20:31 字數 3365 閱讀 4732

#include 「nrf_drv_spi.h」

#include 「nrf_gpio.h」

#include 「dxc_hal.h」

#include 「dxc_hallcd.h」

#include 「drv_rm67162.h」

///#if 0

// 高速 spi, 最高可以達到 32mbps

static const nrfx_spim_t oled_spi = nrfx_spim_instance(3);

// @brief 初始化flash 硬體介面

static void rm6716x_spi_init(void)

;nrf_gpio_cfg_output(rm6716x_spi_csn_pin);

rm6716x_spi_csn_set();

// @brief 傳送資料,必須為阻塞模式

// @param in 輸入資料;inlen 輸入資料長度

// @param out 輸出資料;outlen 輸出資料長度

void rm6716x_transfer(const uint8_t* in, uint8_t inlen, uint8_t* out, uint8_t outlen)

#endif

///// @brief 設定命令模式

static __inline void rm6716x_set_command_mode(void)

// @brief 設定資料模式

static __inline void rm6716x_set_data_mode(void)

// @brief 傳送資料

void rm6716x_write_data(const uint8_t* data, uint16_t datalen)

// @brief 傳送命令和資料

void rm6716x_send_command_data(uint8_t cmd, const uint8_t* data, uint16_t datalen)

rm6716x_spi_csn_set();// @brief 傳送命令和位元組

static __inline void rm6716x_send_command_byte(uint8_t cmd, uint8_t byte)

// @brief 傳送命令

static __inline void rm6716x_write_command(uint8_t cmd)

///uint16_t mem_start_address; // 垂直滾動位址

int16_t mem_length = 390; // 記憶體長(左右長度)

int16_t mem_width = 390; // 記憶體寬(上下高度)

///// @brief 介面除錯

void rm6716x_who_am_i(void)

void rm6716x_reset(void)

// @brief 退出休眠

void rm6716x_exit_sleep(void)

length = x2-x1+1;

weight = y2-y1+1;

for (i=0; i<=256;)

// 對某個區域記憶體進行寫

rm6716x_set_addr_window(x1, y1, x2, y2);

for(i=0; i// @brief 顯示一張的一部分

// @param x1,y1 顯示座標

// @param xoft,yoft 顯示偏移量

// @return true 成功顯示;false 失敗,沒有顯示

bool rm6716x_show_picture(int16_t x1, int16_t y1, int16_t xoft, int16_t yoft, const uint8_t *data)

if (y1 < 0)

length = ((data[2] << 8) | (data[3] & 0xff));

width = ((data[4] << 8) | (data[5] & 0xff));

if (xoft > length - 1 || yoft > width - 1) // 偏移超出大小

xlen = length - xoft;

ylen = width - yoft;

xoft = 0;

if (x1 + xlen > mem_length - 1)

xlen = mem_length - x1;

else

xoft = (length - xlen) * 2;

length <<= 1;

if (y1 + ylen > mem_width - 1)

ylen = mem_width - y1;

else

offset += yoft * length;

//log("x1+xlen-1=%d, %d", x1+xlen-1, y1+ylen-1);

rm6716x_set_addr_window(x1, y1, x1 + xlen - 1, y1 + ylen - 1);

for (i=0; i// @brief 垂直滾動定義命令

// @param tfix 頂部固定區域;scoll 滾動區域;bfix 底部固定區域

// @note: tfix + scoll + bfix = 320

void rm6716x_vertical_scrolling_defined(uint16_t tfix, uint16_t scoll, uint16_t bfix)

{uint8_t data[6];

data[0] = tfix >> 8;

data[1] = tfix;

data[2] = scoll >> 8;

data[3] = scoll;

data[4] = bfix >> 8;

data[5] = bfix;

lcd_sendcmddata(rm6716x_cmd_vertical_scrolling, data, 6);

// @brief 設定垂直滾動起始位址

void rm6716x_set_mem_start_address(uint16_t addr)

{uint8_t data[2];

if (addr == mem_start_address)

return;

mem_start_address = addr;

data[0] = addr >> 8;

data[1] = addr;

lcd_sendcmddata(rm6716x_cmd_ver_scro_start_addr, data, 2);

GDB初次除錯案例

這篇文章是初次嘗試gdb除錯後寫的,這個案例結合了我個人的分析,在gdb第一次執行當中遇到困難的可以看一看。開始接觸linux核心的第二天,學的是一段小小的程式設計,然後實驗就是使用gdb除錯並糾錯,這裡附上 這是乙個有錯誤的c程式 include include static char buff ...

dump檔案 dump除錯案例1 未知跳轉

背景 自己手裡有乙個用duilib開發的工具在某乙個使用者那邊高頻崩潰。只要一啟動就崩潰,一天崩潰幾十次,很奇怪。從使用者那邊抓取dump檔案回來,調出windbg進行除錯查詢原因。過程 1.準備好pdb及原始碼檔案,windbg載入dump起來。命令列輸入.ecxr,然後切換看堆疊如下 報錯的 在...

C heap堆的相關操作及跟蹤除錯案例

include 標頭檔案 make heap 建堆,最大值在所給範圍的最前面,其他位置不確定 pop heap 將堆頂 所給範圍最前面 元素移到所給範圍的最後,並將餘下的最大的元素放在最前面 pop back 將所給範圍的最後乙個元素刪除 push back 在所給範圍的末尾加入新的元素 push ...