時間:2015-06-02 16:33:05來源:深圳市世強先進科技有限公司
一、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)的功耗敏感型應用的理想選擇。
1、PM8 模式:
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
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的額外電流。
標簽:
中國傳動網(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)投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。
相關資訊
產(chǎn)品新聞
更多>2025-04-30
性能躍升20%!維宏NK300CX Plus數(shù)控系統(tǒng)...
2025-04-11
2025-04-08
【產(chǎn)品解讀】全面提升精密制造檢測節(jié)拍...
2025-03-31
應用案例 | 使用宏集TELE監(jiān)控繼電器監(jiān)控...
2025-03-26
2025-03-20