2017年8月25日 星期五

新版的gitbook怎麼使用markdown編輯、切割編輯室窗

新版的gitbook怎麼使用markdown編輯、切割編輯室窗

乾~在右下角的問號裡拉,長這麼小真的很難找QuQ

2017年8月24日 星期四

STM32F469I GPIO 基本的按鈕與LED控制 彙總整理

STM32F469I GPIO 基本的按鈕與LED控制 彙總整理

前面兩篇介紹
  1. STM32F469I GPIO 基本的閃爍控制
  2. STM32F469I GPIO 基本的按鈕控制
這篇彙整一下順變仿照官方的函式打造了D0~D15的使用模式
整串貼進去官方GPIO範例程序內的 main 之上即可。

使用方式範例

D15 沒有接地時 D2 D3 亮起
下面貼在 main 內
  BSP_LED_Init(LED1);
  BSP_LED_Init(LED2);
  BSP_LED_Init(LED3);
  BSP_LED_Init(LED4);
  // 初始化 ArD 腳位為 OUT
  Ard_LED_Init(ArD2);
  Ard_LED_Init(ArD3);
  // 初始化 ArD 腳位為 IN
  Ard_PB_Init(ArD15);

  while(1)
  {
    /* 按鈕 */
    if(Ard_PB_GetState(ArD15) == PB_RESET)
    {
      /* 按住 */
      Ard_LED_On(ArD2);
      Ard_LED_On(ArD3);
    }
    else if(Ard_PB_GetState(ArD15) == PB_SET)
    {
      /* 放開 */
      Ard_LED_Off(ArD2);
      Ard_LED_Off(ArD3); 
    }
  }

STM32F469I GPIO 基本的按鈕控制

STM32F469I GPIO 基本的按鈕控制

腳位的部分或LED控制可以參考上一篇
https://charlottehong.blogspot.tw/2017/07/stm32f469i-gpio.html

按鈕初始化

/* UserDefine functions ------------------------------------------------------*/
void User_LED_Init()
{
  // 設定角位(3行都要改)
  uint16_t pin       = GPIO_PIN_4;
  GPIO_TypeDef* port = GPIOB;
  __HAL_RCC_GPIOB_CLK_ENABLE();

  // 初始化
  GPIO_InitTypeDef  GPIO_InitStruct;
  GPIO_InitStruct.Pin = pin;                  // 腳位數字
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 設置為輸出
  GPIO_InitStruct.Pull = GPIO_PULLUP;         // 下拉電阻
  GPIO_InitStruct.Speed = GPIO_SPEED_FAST;    // 速度
  HAL_GPIO_Init(port, &GPIO_InitStruct);

  // 設定起始狀態
  HAL_GPIO_WritePin(port, pin, GPIO_PIN_RESET);
}
與前一章節一樣需要設置 Set port and pin 內的參數三行,這裡設置的事 PB8 也就是 Arduino腳位的 D15 的腳位置。

偵測按鈕

這個直接在放主程式main的 while 回圈內就可以
D15放空或接5V會讓D2 D3亮,D15接地則滅。
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == PB_RESET)
{
  /* 接地 */
  HAL_GPIO_WritePin(ArD2_GPIO_PORT, ArD2_PIN, GPIO_PIN_SET);
  HAL_GPIO_WritePin(ArD3_GPIO_PORT, ArD3_PIN, GPIO_PIN_SET);
}
else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == PB_SET)
{
  /* 放開 */
  HAL_GPIO_WritePin(ArD2_GPIO_PORT, ArD2_PIN, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(ArD3_GPIO_PORT, ArD3_PIN, GPIO_PIN_RESET);  
}

2017年8月22日 星期二

OpenCV Mat 導入一為陣列的灰階圖陣列

OpenCV Mat 導入一為陣列的灰階圖陣列

Mat 可以直接讀取圖片
Mat img = imread("img.png");
一般常見格式都能讀取,直接打上完整的檔名就好
如果是已經存到一維的vector陣列內要轉進去可以這樣做
Mat img(1000, 1334, 0); // 圖的寬長
img.data = raw_img.data(); // 指標會指向同一個地方,自己在依狀況處理。

imshow("Image", img);
cvWaitKey(0);

如何存取像素

// 讀圖
IplImage* img01;
img01 = cvLoadImage("kanna.png", 1);

// 讀圖 Mat
Mat kanna = imread("kanna.png");
kanna.at<Vec3b>(30, 20)[0] = 255;
後面的1去找函式有說明,1是彩圖0是灰階圖

2017年8月21日 星期一

2017年8月16日 星期三

CPP 如何引入 C 檔使用

C++ 如何引入 C 檔使用

指令 extern “C” { }

這個指的意思其實就是用C的方式來編譯函式或變數,假如說有一個
void fun(int, int);
C++編譯之後會得到一串名稱為 _fun_int,_int
但是 C 編譯之後只會得到名稱為 _fun
這裡也就就指出了為什麼 C++ 可以多載的原因了。


C++ 引入 C 檔案

如果一份C寫了之後打算給C++使用,就在他的檔頭前後加上這六段即可
// cFile.h

#ifdef  __cplusplus
extern "C" {
#endif

/* 代碼 */

#ifdef  __cplusplus
}
#endif
其實C++ 很大程度的兼容,也可以連考慮都不考慮直接加上就好


C 引入 C++ 檔案

與上面相同


參考

2017年8月10日 星期四

stm32f469i GUI 如何放入自訂圖片 如何轉換圖檔給stm讀取

stm32f469i GUI 如何放入自訂圖片 如何轉換圖檔給stm讀取

打開這一份範例:
STM32Cube_FW_F4_V1.16.0\Projects\STM32469I-Discovery\Examples\LCD_DSI\LCD_DSI_CmdMode_DoubleBuffering
預設有兩張圖片,這兩張個別是
  • image_320x240_argb8888
  • life_augmented_argb8888
放置的位置在
LCD_DSI_CmdMode_DoubleBuffering\Inc
他是一份 .h 檔案定義了這張圖片,裡面長這個樣子
const uint32_t life_augmented_argb8888[76800] =
{
0xFFFFFFFF,
0xFFFFFFFF,
...
};
這裡就是圖片的像素質了,兩個兩個一組看,第一組FF是透明度,越大越不透明,再來個別是 R, G, B 依序比如說一個顏色的 RGB 是 50, 100, 150 對應到的格式就是 0xFF326496。
我寫了一個轉換程序,可以把 BMP 圖檔轉換到 .h 檔,需要的可以參考。
Bmp_to_ARGB888
使用方式直接拉BMP圖檔到解壓縮出來的 exe 上然後放開即可(可以一次拉好幾個進去)。
圖檔只能放exe旁邊(寫的時候沒注意到的小Bug)
或者使用CMD指令(一樣要放一起)
Bmp_to_ARGB888.exe p1.bmp p2.bmp