技術頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動網(wǎng) > 技術頻道 > 應用方案 > Silicon Labs SIM3L1xx UART0 與 PM8 喚醒編程指導

Silicon Labs SIM3L1xx UART0 與 PM8 喚醒編程指導

時間:2015-06-02 16:33:05來源:深圳市世強先進科技有限公司

導語:?Silicon Labs SIM3L1xx UART0 與 PM8 喚醒編程指導

一、Precision32 SiM3L1xx MCU 簡介:
       高性能模擬與混合信號 IC 領導廠商Silicon Laboratories (芯科實驗室)推出業(yè)界基于ARM® Cortex™-M3 處理器的最低功耗單片機(MCU)系列產(chǎn)品和首款具有“功耗感知”功能的開發(fā)工具。Precision32 SiM3L1xx MCU 及開發(fā)環(huán)境利用創(chuàng)新的混合信號技術,使開發(fā)人員在3.6V 工作電壓下,工作模式功耗降低到175μA/MHz,并且在啟用實時時(RTC)的情況下,休眠模式功耗降低到250nA 以下。新型超低功耗混合信號MCU 是智能儀表、儀器監(jiān)測、家庭自動化、無線安全、資產(chǎn)跟蹤、個人醫(yī)療裝置以及其他連接到物聯(lián)網(wǎng)(IoT)的功耗敏感型應用的理想選擇。

1PM8 模式:
        SIM3L1xx 有多種工作模式,本文主要介紹PM8 模式。PM8 是一個低功耗的睡眠模式。詳細的描述見下表:

 在PM8 模式下,內(nèi)置的LDO 模塊被禁止,RTC0,UART0,LPTimer0,PORT Match,LCD 等模塊是工作的,并且可以保留所有的RAM 數(shù)據(jù)。

2、UART0 簡介:
       UART0 是Silicon Labs MCU 里面為低功耗數(shù)據(jù)通信特別設計的??梢栽赑M8 模式下喚醒MCU 并實現(xiàn)數(shù)據(jù)通信。與PM8 相關的特性有以下:
      * 獨立的16bit 波特率發(fā)生器
      * 在PM8 模式下可以使用RTC0 輸出的時鐘,此時RTC0 模塊運行的時鐘源可
以為外部32.768KHZ 的振蕩器。
      * 在PM8 模式下,可支持的速率是9600bps, 4800bps, 2400bps or 1200bps
      * 可以作為PM8 模式的喚醒源。
      * 引腳描述:
      UART0 有專用端口I / O 引腳。當UART0 被啟用,它是自動映射到相應的引腳,

  如表37.1 所示。

UART0_TX 和UART0_RX 引腳配置示例代碼:
      // UART PINS TO PROPER CONFIG (TX = PB1.2, RX = PB1.3)
      SI32_PBSTD_A_set_pins_push_pull_output(SI32_PBSTD_1, 0x0000004);
      SI32_PBSTD_A_set_pins_digital_input(SI32_PBSTD_1, 0x00000008);
      SI32_PBSTD_A_write_pbskipen(SI32_PBSTD_1, 0x0000000C);
      二、PM8 模式下UART0 編程介紹:
      1、初始化UART0
      //------------------------------------------------------------------
      void gUART0_enter_async_rtc_config()
      {
      // ENABLE UART0 CLOCK
      SI32_CLKCTRL_A_enable_apb_to_modules_0(SI32_CLKCTRL_0,
      SI32_CLKCTRL_A_APBCLKG0_UART0);
      SI32_CLKCTRL_A_enable_apb_to_modules_1(SI32_CLKCTRL_0,
      SI32_CLKCTRL_A_APBCLKG1_MISC0);
      // SETUP UART. BAUD RATE (APB = System Clock)
      SI32_UART_B_enter_full_duplex_mode(SI32_UART_0);
      // RTC Timer Clock Modes (9600 baud)
      SI32_UART_B_select_rtc_clock_mode(SI32_UART_0);
      SI32_UART_B_set_tx_baudrate(SI32_UART_0, 0x03);
      SI32_UART_B_set_rx_baudrate(SI32_UART_0, 0x03);
      // SETUP TX (8-bit, 1stop, no-parity)
      SI32_UART_B_select_tx_data_length(SI32_UART_0, 8);
      SI32_UART_B_enable_tx_start_bit(SI32_UART_0);
      SI32_UART_B_enable_tx_stop_bit(SI32_UART_0);
      SI32_UART_B_disable_tx_parity_bit(SI32_UART_0);
      SI32_UART_B_select_tx_stop_bits(SI32_UART_0,
      SI32_UART_B_CONFIG_TSTPMD_1_STOP_VALUE);
      SI32_UART_B_disable_tx_signal_inversion(SI32_UART_0);
      SI32_UART_B_select_tx_fifo_threshold_for_request_to_1(SI32_UART_0
       );
      SI32_UART_B_enable_tx_output(SI32_UART_0);
      SI32_UART_B_enable_tx(SI32_UART_0);
      // SETUP RX
      SI32_UART_B_select_rx_data_length(SI32_UART_0, 8);
      SI32_UART_B_enable_rx_start_bit(SI32_UART_0);
      SI32_UART_B_enable_rx_stop_bit(SI32_UART_0);
      SI32_UART_B_disable_rx_parity_bit(SI32_UART_0);
      SI32_UART_B_select_rx_stop_bits(SI32_UART_0,
      SI32_UART_B_CONFIG_TSTPMD_1_STOP_VALUE);
      SI32_UART_B_disable_rx_signal_inversion(SI32_UART_0);
      SI32_UART_B_select_rx_fifo_threshold_1(SI32_UART_0);
      SI32_UART_B_enable_rx(SI32_UART_0);
      //flush RX TX fifo
      SI32_UART_B_flush_rx_fifo(SI32_UART_0);
      SI32_UART_B_flush_tx_fifo(SI32_UART_0);
      SI32_UART_B_enable_tx_complete_interrupt(SI32_UART_0);
      SI32_UART_B_enable_rx_data_request_interrupt(SI32_UART_0);
      NVIC_ClearPendingIRQ (UART0_IRQn);
      NVIC_EnableIRQ(UART0_IRQn);
      SI32_UART_B_write_clkdiv(SI32_UART_0,0);
      }
      2、UART0 中斷響應函數(shù):
      以下程序是一個簡單的回發(fā)所接收的數(shù)據(jù)??梢愿鶕?jù)需要更改代碼:
      void UART0_IRQHandler(void)
      {
      uint8_t R_data;
      NVIC_ClearPendingIRQ(UART0_IRQn);
      //clear wakeup flags
      SI32_PMU_A_clear_wakeup_flags(SI32_PMU_0);
      if (SI32_UART_B_is_rx_data_request_interrupt_pending(SI32_UART_0))
      {
      //hardware will clear Rx request interrupt flag
      R_data = SI32_UART_B_read_data_u8(SI32_UART_0);
      SI32_UART_B_write_data_u8(SI32_UART_0, R_data);
       }
      if (SI32_UART_B_is_tx_complete(SI32_UART_0))
      {
      //must clear Tx complete interrupt flag by soft
      SI32_UART_B_clear_tx_complete_interrupt(SI32_UART_0);
      //flush rx fifo,prepare to receive next data
      SI32_UART_B_flush_rx_fifo(SI32_UART_0);
      SI32_UART_B_flush_tx_fifo(SI32_UART_0);
      }
      }

3、數(shù)據(jù)的接收與發(fā)送:
      A 發(fā)送數(shù)據(jù)的流程:
      1.往移位寄存器寫入需要發(fā)送的數(shù)據(jù),例如寫入8bit 數(shù)據(jù):
      SI32_UART_B_write_data_u8(SI32_UART_0, R_data);
      2.確保發(fā)送器沒有被抑制(TINH = 0)
      3.使能數(shù)據(jù)發(fā)送器(TEN = 1)
      數(shù)據(jù)發(fā)送完畢會有一個發(fā)送完成的標志位 (TCPTI),這個標志位在中斷響應完需
要軟件清零。
      B 數(shù)據(jù)接收流程:
      接收數(shù)據(jù)的中斷請求標志位(RDREQI)在接收FIFO 的數(shù)據(jù)個數(shù)大于等于FIFO
所設置的接收個數(shù)閥值(RFTH)時產(chǎn)生。這時可以從接收FIFO 中讀取數(shù)據(jù)。接
收數(shù)據(jù)的中斷啟用通過設置接收數(shù)據(jù)請求中斷使能標志位(RDREQIEN)1。接
收FIFO 填充中的條目的數(shù)量降到低于RFTH 設置時,會自動清除。

4、PM8 UART0 喚醒:
      進入PM8模式前,配置UART0作為PM8的喚醒源,并使能UART0中斷:
      //enable UART0 wakeup
      SI32_PMU_A_enable_uart0_wake_event(SI32_PMU_0);
      NVIC_ClearPendingIRQ (UART0_IRQn);
      NVIC_EnableIRQ(UART0_IRQn);
      SI32_PMU_A_clear_wakeup_flags(SI32_PMU_0);

5、進入PM8 模式:
      進入 PM8 模式之前配置好期望的設置,例如RTC 的設置,因為UART0 在PM8 模
式下需要使用RTC 的輸出時鐘。
      void PowerMode_8(void)
      {
      SI32_CLKCTRL_A_enable_power_mode_8(SI32_CLKCTRL_0);
      SI32_LDO_A_select_digital_bias_high(SI32_LDO_0);
      SI32_LDO_A_select_memory_bias_high(SI32_LDO_0);
      SI32_LDO_A_select_analog_bias_high(SI32_LDO_0);
      // Enable the retention mode of RAM banks needed by the application
      // Enable retention on all 32 kB of RAM
      SI32_PMU_A_set_ram_retention_enable_mask(SI32_PMU_0, 0xFF);
      // Set the pins in the lowest power configuration for this mode.
      SI32_PBSTD_A_write_pins_high(SI32_PBSTD_1, 0x00F0);
      // Set all LDOs to 1.8 V output.
      SI32_LDO_A_write_control(SI32_LDO_0, 0x00343434);
      //RTC Crystal Settings
      SI32_RTC_B_disable_low_frequency_oscillator(SI32_RTC_0);
      SI32_RTC_B_disable_low_frequency_oscillator_output(SI32_RTC_0);
      SI32_RTC_B_enable_auto_gain_control(SI32_RTC_0);
      SI32_RTC_B_disable_bias_doubler(SI32_RTC_0);
      //Disable the SysTick timer.
      SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
      SI32_PMU_A_clear_wakeup_flags(SI32_PMU_0);
      // ENABLE INTERRUPTS
      SI32_PMU_A_enable_uart0_wake_event(SI32_PMU_0);
      NVIC_ClearPendingIRQ (UART0_IRQn);
      NVIC_EnableIRQ(UART0_IRQn);
      SI32_PMU_A_clear_wakeup_flags(SI32_PMU_0);
      // Set the SLEEPDEEP bit in the core.
      SCB->SCR = SCB_SCR_SLEEPDEEP_Msk; // set SLEEPDEEP
      // Execute the DSB (Data Synchronization Barrier), ISB (Instruction
      // Synchronization Barrier), and WFI (Wait for Interrupt) or WFE (Wait for
      // Event) instructions. For SiM3L1xx devices, WFI and WFE have the same
      // behavior
      __DSB();
      __ISB();
      __WFI();
      // Wake from PM8
      // The watchdog timer is re-enabled after a PM8, so disable it again after
      SI32_WDTIMER_A_stop_counter(SI32_WDTIMER_0);
      // exiting PM8
      SI32_PMU_A_disable_uart0_wake_event(SI32_PMU_0);
      SI32_PMU_A_clear_wakeup_flags(SI32_PMU_0);
      LDOConfigure();
      }
      以上程序是進入PM8 模式的代碼,整個進入PM8 模式和退出PM8 模式的流程是:
      1)、通過軟件配置,使得MCU 進入PM8。
      2)、UART0 在PM8 模式下保持工作,等待接收數(shù)據(jù),如果有數(shù)據(jù)過來首先進入數(shù)
據(jù)接收中斷響應函數(shù)。然后回到睡眠點,繼續(xù)往下運行。
      3)、在UART0喚醒MCU退出PM8模式需要特別注意,喚醒后需要馬上關閉UART0
的事件喚醒功能SI32_PMU_A_disable_uart0_wake_event(SI32_PMU_0);
在需要進入PM8模式之前再次開啟這個事件喚醒功能即可。
      4)、在PM8模式下,看門狗是不工作的,但是無需為時鐘失效的問題擔心,因為這
款MCU具備RTC時鐘失效檢測,RTC時鐘失效后,會自動切換到內(nèi)部低功耗時鐘,
并產(chǎn)生RTC時鐘失效中斷,可以保證MCU可靠的運行。

6、調(diào)試建議:
      在調(diào)試PM8模式時,如果程序需要自動進入PM8模式,而非手動按鍵條件下進入。
這時候,如果沒有調(diào)試好會出現(xiàn)進入睡眠不能喚醒的狀態(tài),也就是芯片一直處于PM8
模式,程序中卻沒有有效的喚醒源可以喚醒MCU。
建議:在main函數(shù)中,加入按鍵陷阱:
      int main(void)
      {
      while (!SI32_PBSTD_A_read_pin(SI32_PBSTD_1, 4)); //pin 4
      //add the app code here
      While(1)
      {
      …………
      }
      }
     1、由于代碼會自動進入PM8模式,如果已經(jīng)出現(xiàn)調(diào)試失敗的時候,可以按住按鍵,
使得在重新下載代碼的時候不會進入PM8模式,導致燒寫代碼失敗而不能繼續(xù)調(diào)試。
      2、如果真的出現(xiàn)調(diào)試失敗卻不能再燒入程序的情況怎么辦?這時候就要使用一個工
具強制刪除芯片的代碼。具體操作如下:
      To fix this problem if it has already occurred:
      1) Use the command line to navigate to
       (default install
      location). This tool is also available for download at SiLabs.com
      2) Run the following command: "si32flashutility.exe -e 2 -r 2" This willerase the MCU flash memory.
      如果第二步未能成功擦除芯片flash代碼,請嘗試第三步:
      3) Run the following command: "si32flashutility.exe -r 1 -e 2" This will
      erase the MCU flash memory.
      如果出現(xiàn)下圖的界面,表明擦除成功:

  標注:為了試驗方便,圖片中FlashProgrammer文件夾被拷貝到了C:\Silabs\目錄下。
默認的路徑是:C:\SiLabs\Precision32_v1.1.0\Utilities\FlashProgrammer
      3、在測試PM8功耗時,請把仿真器從PCB板上移除。如果不移除會給測量帶來超過
60uA的額外電流。

標簽:

點贊

分享到:

上一篇:Silicon Labs無線收發(fā)器SI446...

下一篇:通過EFM32系列Demo調(diào)試外部MC...

中國傳動網(wǎng)版權與免責聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(wǎng)(www.wangxinlc.cn)獨家所有。如需轉載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責任。

本網(wǎng)轉載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。

相關資訊

網(wǎng)站簡介|會員服務|聯(lián)系方式|幫助信息|版權信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動網(wǎng)-工業(yè)自動化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務平臺

網(wǎng)站客服服務咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2025 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權所有
粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報中心 | 粵公網(wǎng)安備 44030402000946號