1. 程式人生 > >STM32+RTT 應用(1)

STM32+RTT 應用(1)

STM32F103C8 移植+手機訊息提醒功能

(1) 有了之前trace code的基礎,移植RTT比較容易.

  STM32F103C8T6只有64K-Flash,20K-RAM,移植的主要工作就是去掉暫時不需要的功能,減小code體積、修改RAM大小巨集定義,晶振頻率。

#define STM32_SRAM_SIZE  20
圖1、開發板

圖1、開發板

(2) 手機通知

  stm32通過藍芽模組接收手機通知中心的廣播訊息,使用協議是ANCS(Apple Notification Center Service)。由於使用的藍芽模組已經集成了ANCS功能,只要通過AT指令接收、傳送訊息既可,AT指令通過註冊的”uart2”裝置傳輸。

圖2、手機收到微信訊息

圖2、手機收到微信訊息

  uart2裝置資料使用中斷回撥函式的方式,收到資料後通知需要資料的程序。

bt_io = rt_device_find("uart2");
if(bt_io != RT_NULL)
{   
    rt_device_set_rx_indicate(bt_io, rx_getdata);
    rt_device_open(bt_io, RT_DEVICE_OFLAG_RDWR|RT_DEVICE_FLAG_INT_RX);
    rt_kprintf("open uart2\r\n");
}

(3) rtc實現時鐘

  使用RTC實現簡單的時鐘功能,當前時間記錄在備份暫存器,有後備電源的情況下可以斷電後繼續計時。
  Rtt code中有rtc相關部分,但是預設並沒有用到,這裡使用需要呼叫init函式並稍微修改一下。主要修改是開啟秒中斷,並且在同步手機時間戳後將時間寫入備份暫存器。

void rt_hw_rtc_init(void)
{
    rt_time_t now;
    rtc.type    = RT_Device_Class_RTC;
    if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
    {
        rt_kprintf("rtc is not configured\n");
        rt_kprintf("please configure with set_date and set_time\n");
        date.hour = 0;
        date.min = 0
; date.ss = 0; if ( RTC_Configuration() != 0) { rt_kprintf("rtc configure fail...\r\n"); return ; } } else { now = RTC_GetCounter(); /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); date.hour = (now/3600)%24; now %= 3600; date.min = now/60; date.ss = now%60; RCC_ClearFlag(); RCC_RTCCLKCmd(ENABLE); RTC_WaitForSynchro(); RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); RTC_ExitConfigMode(); RTC_NVIC_Config(); } ...... }

(4) 顯示模組

  顯示部分使用了一個8*8的單色點陣,通過MAX7219驅動,使用簡單、節省IO。由於顯示空間只有8x8點陣,只能顯示簡單的內容,所以在顯示上做了簡單的動態效果。

PS. 預告,下一個應用打算實現基於usb vcom的IAP,並且嘗試log也通過usb介面輸出,這樣只有第一次下載需要下載器或uart,之後只需要一根usb線即可。