技術(shù)頻道

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

Silicon Labs SIM3L1xx UART0 與 PM8 喚醒編程指導(dǎo)

時(shí)間:2015-06-02 16:33:05來源:深圳市世強(qiáng)先進(jìn)科技有限公司

導(dǎo)語(yǔ):?Silicon Labs SIM3L1xx UART0 與 PM8 喚醒編程指導(dǎo)

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

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

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

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

  如表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 中斷響應(yīng)函數(shù):
      以下程序是一個(gè)簡(jiǎn)單的回發(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ā)送完畢會(huì)有一個(gè)發(fā)送完成的標(biāo)志位 (TCPTI),這個(gè)標(biāo)志位在中斷響應(yīng)完需
要軟件清零。
      B 數(shù)據(jù)接收流程:
      接收數(shù)據(jù)的中斷請(qǐng)求標(biāo)志位(RDREQI)在接收FIFO 的數(shù)據(jù)個(gè)數(shù)大于等于FIFO
所設(shè)置的接收個(gè)數(shù)閥值(RFTH)時(shí)產(chǎn)生。這時(shí)可以從接收FIFO 中讀取數(shù)據(jù)。接
收數(shù)據(jù)的中斷啟用通過設(shè)置接收數(shù)據(jù)請(qǐng)求中斷使能標(biāo)志位(RDREQIEN)1。接
收FIFO 填充中的條目的數(shù)量降到低于RFTH 設(shè)置時(shí),會(huì)自動(dòng)清除。

4PM8 UART0 喚醒:
      進(jìn)入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、進(jìn)入PM8 模式:
      進(jìn)入 PM8 模式之前配置好期望的設(shè)置,例如RTC 的設(shè)置,因?yàn)閁ART0 在PM8 模
式下需要使用RTC 的輸出時(shí)鐘。
      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();
      }
      以上程序是進(jìn)入PM8 模式的代碼,整個(gè)進(jìn)入PM8 模式和退出PM8 模式的流程是:
      1)、通過軟件配置,使得MCU 進(jìn)入PM8。
      2)、UART0 在PM8 模式下保持工作,等待接收數(shù)據(jù),如果有數(shù)據(jù)過來首先進(jìn)入數(shù)
據(jù)接收中斷響應(yīng)函數(shù)。然后回到睡眠點(diǎn),繼續(xù)往下運(yùn)行。
      3)、在UART0喚醒MCU退出PM8模式需要特別注意,喚醒后需要馬上關(guān)閉UART0
的事件喚醒功能SI32_PMU_A_disable_uart0_wake_event(SI32_PMU_0);
在需要進(jìn)入PM8模式之前再次開啟這個(gè)事件喚醒功能即可。
      4)、在PM8模式下,看門狗是不工作的,但是無需為時(shí)鐘失效的問題擔(dān)心,因?yàn)檫@
款MCU具備RTC時(shí)鐘失效檢測(cè),RTC時(shí)鐘失效后,會(huì)自動(dòng)切換到內(nèi)部低功耗時(shí)鐘,
并產(chǎn)生RTC時(shí)鐘失效中斷,可以保證MCU可靠的運(yùn)行。

6、調(diào)試建議:
      在調(diào)試PM8模式時(shí),如果程序需要自動(dòng)進(jìn)入PM8模式,而非手動(dòng)按鍵條件下進(jìn)入。
這時(shí)候,如果沒有調(diào)試好會(huì)出現(xiàn)進(jì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、由于代碼會(huì)自動(dòng)進(jìn)入PM8模式,如果已經(jīng)出現(xiàn)調(diào)試失敗的時(shí)候,可以按住按鍵,
使得在重新下載代碼的時(shí)候不會(huì)進(jìn)入PM8模式,導(dǎo)致燒寫代碼失敗而不能繼續(xù)調(diào)試。
      2、如果真的出現(xiàn)調(diào)試失敗卻不能再燒入程序的情況怎么辦?這時(shí)候就要使用一個(gè)工
具強(qiáng)制刪除芯片的代碼。具體操作如下:
      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代碼,請(qǐng)嘗試第三步:
      3) Run the following command: "si32flashutility.exe -r 1 -e 2" This will
      erase the MCU flash memory.
      如果出現(xiàn)下圖的界面,表明擦除成功:

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

標(biāo)簽:

點(diǎn)贊

分享到:

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

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

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

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

相關(guān)資訊

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

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

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

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 版權(quán)所有 粵ICP備 14004826號(hào) | 營(yíng)業(yè)執(zhí)照證書 | 不良信息舉報(bào)中心 | 粵公網(wǎng)安備 44030402000946號(hào)