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

2017年8月8日 星期二

stm32f4 使用計時器計時 1ms

stm32f4 使用計時器計時 1ms

可以使用官方範例程式內的 Examples\TIM\TIM_TimeBase 修改
預設是 delay 1s 修改一下參數 Period 除以 1000 即是 1ms
初始化計時器
void timers_init()
{
    uint32_t time_c = 10000;
    uwPrescalerValue = (uint32_t)((SystemCoreClock / 2) / 10000) - 1;
    TimHandle.Instance = TIMx;
    TimHandle.Init.Period = 10000/1000 - 1 ;
    TimHandle.Init.Prescaler         = uwPrescalerValue;
    TimHandle.Init.ClockDivision     = 0;
    TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
    TimHandle.Init.RepetitionCounter = 0;

    if(HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
    {
        Error_Handler();
    }

    if(HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
    {
        Error_Handler();
    }
}
這裡這樣設置就可以了,再來它會自動每 1ms 呼叫 HAL_TIM_PeriodElapsedCallback() 這個函式,這個函式這樣寫
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    static int timer1 = 0;
    static int timer2 = 0;
    ++timer1;
    ++timer2;

    if(timer1 == 1000) {
        BSP_LED_Toggle(LED1);
        timer1 = 0;
    }

    if(timer2 == 500) {
        BSP_LED_Toggle(LED2);
        timer2 = 0;
    }
}
即可用不同頻率閃爍LED了,我不確定中斷程序會不會等這個函式執行完畢;建議用一個全域變數當flag,讓計時器激活他,然後由主函式內的 while 統一控管來處理,不然可能會卡住導致延遲。

Keil uVision 5 查看變數出現 無法查看

Keil uVision 5 查看變數出現 無法查看

因為預設編譯器是優化全開 -O3 某些變數被優化掉就看不到了,暫時先關閉優化就好了
先進入專案選項內
選擇 -O0
再來須要全部重新編譯 F7,需要花點時間,編譯完畢之後使用
F10 (跳過fun) 或 F11(行執行) 來跑程式跑到你要的位置
你可以把滑鼠移動到變數上查看,也可以從右下角查看區域變數。

2017年8月6日 星期日

如何改 Windows 10 桌面右鍵的選單內容的快捷鍵

如何改 Windows 10 桌面右鍵的選單內容的快捷鍵

先按一下開始直接打字搜尋 regedit 進入登錄檔編輯器
接著在上面的路徑輸入,舊版的沒有上面那一條好像自己慢慢點進去
電腦\HKEY_CLASSES_ROOT\Local Settings\MuiCache
再來一路開進去
這邊以 VS 為例,點兩下進去把
在 Visual Studio 中開啟(&V),後面的V改成你要的任意快捷鍵就可以了。

2017年7月31日 星期一

Markdown HackMD Github 同一頁文內跳轉

Markdown HackMD Github 同一頁文內跳轉

使用超連結跳轉即可

HackMD

在 HackMD 內大標題中標題小標題都會自己有一個標籤
比如說一個大標籤
# 第一章
## 第一節
相對應的跳轉方式就是
- [第一章](#第一章)
- [第一節](#第一節)

Github

這個就沒有Markdown自己擴展的連結,只能自己用html補
<h2 id="First">第一章</h2>
相對應的跳轉方式就是
- [第一章](#First)

STM32F469I GPIO 基本的閃爍與按鈕控制

STM32F469I GPIO 基本的閃爍與按鈕控制

板子上現成的 LED 與按鈕對應的 GPIO 腳位

LED1 G6
LED2 D4
LED3 D5
LED4 K3
按键 A0

函式解說

延遲函式,這個內建沒有我們自己弄一個
void delay(){
  int i;
  for(i=0; i<0xffffff; ++i);
}
如果需要精準的時間延遲可以參考這一篇站內連結
STM32 (F469I) 延遲時間 如何精準的計算

初始化

HAL_Init();
BSP_LED_Init(LED1);
這裡的LED1是對應到這張板子的正面的LED1

使用函式

關燈
HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_PIN , GPIO_PIN_RESET);
開燈
HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_PIN , GPIO_PIN_SET);

範例代碼

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  BSP_LED_Init(LED1);

  while(1)
  {
    delay();
    HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_PIN , GPIO_PIN_RESET);
    delay();
    HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_PIN , GPIO_PIN_SET);
  }
}

詳細代碼

如果不用內建函式LED1的字樣的話完整的打法是這樣
下面的範例是 B4 ,第一行就是改成4,第二行與第三行的 GPIO 後面改為B
  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_SET);

GPIO所有腳位的位置

查看手冊 STM32F469 Discovery user manual.pdf 這一份文件內的資料
第17頁與18頁有提到對應MCU那些腳位
背板腳位 實際腳位
D15 PB8
D14 PB9
D13 PD3
D12 PB14
D11 PB15
D10 PH6
D9 PA7
D8 PG10
D7 PG11
D6 PA6
D5 PA2
D4 PG12
D3 PA1
D2 PG13
D1 PG14
D0 PG9

參考