女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于MM32L0130的LPUART應用(2)

冬至子 ? 來源:靈動MM32MCU ? 作者:靈動MM32 ? 2023-06-02 17:30 ? 次閱讀

LPUART(Low power universal asynchronous receiver transmitter,低功耗通用異步收發器),相比標準的UART,其功耗極低,支持在低功耗模式下運行,并且可以將MCU從低功耗模式喚醒。

上期介紹了MM32全新低功耗系列MM32L0130的LPUART外設,并實現了基本UART收發通信和使用LPUART喚醒MCU。本期介紹LPUART的高級應用,實現DMA收發實驗、使用數據匹配寄存器匹配到指定字符后喚醒MCU。

1 LPUART使用DMA

LPUART可以使用DMA來搬運數據,實現無需CPU參與的快速自動數據傳輸。硬件發出DMA請求與對應的DMA通道直連,也可以通過軟件配置寄存器的方式觸發DMA通道請求。LPUART的控制寄存器有對應的DMA使能位,如下圖所示:

image.png

1.1 DMA中斷

DMA的每個通道都有三種中斷事件標志:DMA半傳輸、DMA傳輸完成和DMA傳輸出錯。各通道單獨的中斷請求由這3種事件標志邏輯或起來。可以配置寄存器的對應位來使能這些中斷:

1.2 LPUART使用DMA的配置步驟

  1. 根據基本UART配置步驟配置LPUART
  2. 使能LPUEN的DMAR與DMAT位激活DMA模式
  3. 使能DMA時鐘
  4. 發送需要配置DMA的源地址(存儲器地址)和目的地址(LPUTXD),傳輸的數據量以及DMA通道
  5. 配置完發送后,只要TXFIFO為空,就會請求DMA發送
  6. 接收需要配置DMA的源地址(LPURXD)和目的地址(存儲器地址),傳輸的數據量以及DMA通道
  7. 配置完接收后,只要RXFIFO有數據,即不為空,就會請求DMA接收

1.3 功能代碼實現

下面例程實現了使用DMA發送和接收LPUART數據,發送和接收完成后進入中斷,例程在基本UART收發實驗的基礎上完成。

a.

申請例程所用到的TX和RX緩存、TX和RX完成標志:

uint8_t TX_Buffer[16], RX_Buffer[16];
uint8_t TX_Complete = 0, RX_Complete = 0;

b.

配置NVIC:

NVIC_InitTypeDef  NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);

c.

配置DMA通道2為LPUART_TX:

void LPUART_DMA_TX_Init(void)
{
    DMA_InitTypeDef DMA_InitStruct;

    RCC_DMA_ClockCmd(DMA1, ENABLE);
    DMA_DeInit(DMA1_Channel2);
    DMA_StructInit(&DMA_InitStruct);
    //DMA transfer peripheral address
    DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&LPUART1- >LPUTXD;
    //DMA transfer memory address
    DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)TX_Buffer;
    //DMA transfer direction from peripheral to memory
    DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;
    //DMA cache size
    DMA_InitStruct.DMA_BufferSize = 16;
    //The peripheral address is forbidden to move backward
    DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    //The memory address is shifted backward
    DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
    //Define the peripheral data width to 8 bits
    DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;
    //M2M mode is disabled
    DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
    DMA_InitStruct.DMA_Auto_reload = DMA_Auto_Reload_Disable;
    DMA_Init(DMA1_Channel2, &DMA_InitStruct);
    DMA_SetChannelMuxSource(DMA1_Channel2, DMA1_MUX_LPUART1_TX);
    //Enable LPUART_DMA1_Channel Transfer complete interrupt
    DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);
    LPUART_TX_DMACmd(LPUART1, ENABLE);
    while((LPUART1- >LPUEN & LPUART_LPUEN_DMAT) == 0);
    //LPUART_DMA1_Channel enable
    DMA_Cmd(DMA1_Channel2, ENABLE);
}

d.

配置DMA通道3為LPUART_RX:

void LPUART_DMA_RX_Init(void)
{
    DMA_InitTypeDef DMA_InitStruct;

    RCC_DMA_ClockCmd(DMA1, ENABLE);

    DMA_DeInit(DMA1_Channel3);
    DMA_StructInit(&DMA_InitStruct);
    //DMA transfer peripheral address
    DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&LPUART1- >LPURXD;
    //DMA transfer memory address
    DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)RX_Buffer;
    //DMA transfer direction from peripheral to memory
    DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
    //DMA cache size
    DMA_InitStruct.DMA_BufferSize = 16;
    //The peripheral address is forbidden to move backward
    DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    //The memory address is shifted backward
    DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
    //Define the peripheral data width to 8 bits
    DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;
    //M2M mode is disabled
    DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
    DMA_InitStruct.DMA_Auto_reload = DMA_Auto_Reload_Disable;
    DMA_Init(DMA1_Channel3, &DMA_InitStruct);
    DMA_SetChannelMuxSource(DMA1_Channel3, DMA1_MUX_LPUART1_RX);
    //Enable LPUART_DMA1_Channel Transfer complete interrupt
    DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);
    LPUART_RX_DMACmd(LPUART1, ENABLE);
    while((LPUART1- >LPUEN & LPUART_LPUEN_DMAR) == 0);
    //LPUART_DMA1_Channel enable
    DMA_Cmd(DMA1_Channel3, ENABLE);
}

e.

編寫中斷服務函數:

void DMA1_Channel2_3_IRQHandler(void)
{
    if(DMA_GetITStatus(DMA1_IT_TC2))
    {
        DMA_ClearITPendingBit(DMA1_IT_TC2);
        TX_Complete = 1;
    }
    if(DMA_GetITStatus(DMA1_IT_TC3))
    {
        DMA_ClearITPendingBit(DMA1_IT_TC3);
        RX_Complete = 1;
    }
}

f.

編寫實驗樣例:

void LPUART_RxTx_DMA_Test(void)
{
    uint8_t i;

    for(i = 0; i < 16; i++)
    {
        TX_Buffer[i] = i;
    }
    LPUART_DMA_TX_Init();
    LPUART_DMA_RX_Init();

    while(1)
    {
        if(TX_Complete == 1)
        {
            TX_Complete = 0;
            DMA1_Channel3- >CMAR = (uint32_t)RX_Buffer;
            DMA1_Channel3- >CNDTR = 16;
            DMA_Cmd(DMA1_Channel3, ENABLE);
        }
        if(RX_Complete == 1)
        {
            RX_Complete = 0;
            memcpy((void *)TX_Buffer, (void *)RX_Buffer, 16);
            DMA1_Channel2- >CMAR = (uint32_t)TX_Buffer;
            DMA1_Channel2- >CNDTR = 16;
            DMA_Cmd(DMA1_Channel2, ENABLE);
        }
    }
}

g.

在main函數中配置好LPUART和DMA后,調用實驗函數LPUART_RxTx_DMA_Test,可以得到如下結果:

image.png

2 使用數據匹配寄存器匹配到指定字符后喚醒MCU

為進一步降低系統功耗,MM32L0130系列的LPUART提供了一種接收到指定字符才能喚醒低功耗狀態的MCU的功能。用于喚醒的指定字符,由數據匹配寄存器確定:

image.png

2.1 接收中斷配置寄存器

可以通過LPUART的LPUCON.RXEV寄存器配置喚醒事件為START位、一幀接收完成、一幀數據匹配或者RXD下降沿喚醒。

image.png

2.2 功能代碼實現

匹配指定字符喚醒MCU功能,需要在上期講解的LPUART喚醒低功耗模式中的MCU基礎上修改中斷事件配置、指定喚醒字符,具體代碼如下:

a.

配置LPUART接收中斷事件為接收數據匹配成功:

LPUART_InitTypeDef init_struct;

init_struct.LPUART_Clock_Source = 0;
init_struct.LPUART_BaudRate = LPUART_Baudrate_9600;
init_struct.LPUART_WordLength = LPUART_WordLength_8b;
init_struct.LPUART_StopBits = LPUART_StopBits_1;
init_struct.LPUART_Parity = LPUART_Parity_No;
init_struct.LPUART_MDU_Value = 0x952;
init_struct.LPUART_NEDET_Source = LPUART_NegativeDectect_Source2;
init_struct.LPUART_RecvEventCfg = LPUART_RecvEvent_RecvData_Mactched;
LPUART_Init(LPUART1, &init_struct);

b.

配置特定的喚醒字符:

LPUART_SetMatchData(LPUART1, ‘5’); //指定字符’5’為喚醒字符

c.

編寫中斷服務程序,判斷接收匹配事件并清除標志:

void LPUART1_IRQHandler()
{
    if(LPUART_GetFlagStatus(LPUART1, LPUART_LPUSTA_START))
    {
        LPUART_ClearFlagStatus(LPUART1, LPUART_LPUSTA_START);
    }
    if(LPUART_GetFlagStatus(LPUART1, LPUART_LPUSTA_MATCH))
    {//判斷接收中斷匹配事件
        LPUART_ClearFlagStatus(LPUART1, LPUART_LPUSTA_MATCH);

    }
    if(LPUART_GetITStatus(LPUART1, LPUART_LPUIF_RXIF) == SET) {
        LPUART_ClearITPendingBit(LPUART1, LPUART_LPUIF_RXIF);
        rxDataBuf[cnt] = LPUART_ReceiveData(LPUART1);
        if(++cnt >= 10)
            cnt_flag = 1;
    }
    EXTI_ClearITPendingBit(EXTI_Line22);
}

d.

編寫試驗樣例:

void LPUART_Wakeup_Test(void)
{
    uint8_t temp, i;
    char string1[] = "LPUART wakeup mcu test!\\r\\n";
    char string2[] = "mcu stop!\\r\\n";
    char string3[] = "mcu wakeup!\\r\\n";

    for(i = 0; i < strlen(string1); i++)
    {
        Output_Byte(LPUART1, string1[i]);
    }
    DELAY_Ms(20);
    for(i = 0; i < strlen(string2); i++)
    {
        Output_Byte(LPUART1, string2[i]);
    }
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//休眠
    for(i = 0; i < strlen(string3); i++)
    {
        Output_Byte(LPUART1, string3[i]);
    }

    while(1)
    {

    }
}

e.

在main函數配置好LPUART后,調用實驗函數LPUART_Wakeup_Test,可以得到如下結果:

image.png

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5421

    瀏覽量

    123352
  • 異步收發器
    +關注

    關注

    0

    文章

    37

    瀏覽量

    10980
  • FIFO存儲
    +關注

    關注

    0

    文章

    103

    瀏覽量

    6144
  • 串口中斷
    +關注

    關注

    0

    文章

    67

    瀏覽量

    14244
  • MCU芯片
    +關注

    關注

    3

    文章

    256

    瀏覽量

    11966
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    基于MM32L0130LPUART應用(1)

    LPUART(Low power universal asynchronous receiver transmitter,低功耗通用異步收發器),相比標準的UART,其功耗極低,支持在低功耗模式下運行,并且可以將MCU從低功耗模式喚醒。
    的頭像 發表于 11-18 10:35 ?3321次閱讀
    基于<b class='flag-5'>MM32L0130</b>的<b class='flag-5'>LPUART</b>應用(1)

    使用MM32L0130 IRM實現紅外發碼

    1、使用MM32L0130 IRM實現紅外發碼  紅外遙控是一種無線、非接觸控制技術,具有抗干擾能力強,信息傳輸可靠,功耗低,成本低,易于實現等顯著優點,被諸多電子設備包括消費電子、家用電器、安防
    發表于 10-21 14:22

    基于MM32L0130的低功耗電子時鐘設計方案相關資料分享

    1、基于MM32L0130的低功耗電子時鐘設計  MM32L0130作為靈動微電子推出的一款低功耗芯片,內置多種省電工作模式保證低功耗應用的要求。前面章節分別對MM32L0130片上外設SLCD
    發表于 11-09 16:00

    基于MM32L0130LPUART外設應用簡介

    運行,并且可以將MCU從低功耗模式喚醒。本文介紹MM32全新低功耗系列MM32L0130LPUART外設,實現基本UART收發通信、通過UART中斷使MCU從低功耗模式中喚醒。1 LPUAR
    發表于 12-09 16:04

    請問有人使用IAR進行過MM32L0130的開發嗎?

    我在使用IAR8.30進行MM32L0130開發板試用時遇到了一個棘手的問題,其例程能夠下載到開發板(至少在IAR中任何報錯,也可以在線調試),可是就是一直開在時鐘配置階段,一直沒有配置成功,有人遇到過這樣的問題嗎?或者在調試其他單片機時是否有類似現象?麻煩指導一下解決辦法
    發表于 12-18 21:48

    使用MM32L0130片上IRM模塊實現紅外發碼

    靈動股份推出的MM32L0130系列MCU具有片上IRM紅外調制器,該模塊使用片上的定時器和串口,實現數據的 FSK/ASK 調制,以滿足紅外發碼的需求。
    的頭像 發表于 10-13 17:03 ?1542次閱讀

    MM32L0130 RTC日歷和鬧鐘

    RTC 模塊是用于提供時間(時、分、秒、亞秒)和日期(年、月、日)功能的定時計數器,日歷以 BCD碼的格式顯示。內部包含周期性的喚醒單元,用于喚醒低功耗模式。支持夏令時補償,支持數字校準補償晶振精度的偏差。靈動微電子推出的MM32L0130系列MCU片上RTC外設具有以下特征。
    的頭像 發表于 10-28 10:37 ?1639次閱讀

    基于MM32L0130的低功耗電子時鐘設計

    MM32L0130作為靈動微電子推出的一款低功耗芯片,內置多種省電工作模式保證低功耗應用的要求。前面章節分別對MM32L0130片上外設SLCD和RTC做了相關描述,并列舉對應程序實現SLCD驅動
    的頭像 發表于 11-04 10:12 ?2042次閱讀

    基于MM32L0130LPUART應用(2

    LPUART(Low power universal asynchronous receiver transmitter,低功耗通用異步收發器),相比標準的UART,其功耗極低,支持在低功耗模式下運行,并且可以將MCU從低功耗模式喚醒。
    的頭像 發表于 11-24 17:52 ?1103次閱讀

    MM32L0130 產品手冊(中文版)

    MM32L0130 產品手冊(中文版)
    發表于 02-27 18:24 ?0次下載
    <b class='flag-5'>MM32L0130</b> 產品手冊(中文版)

    MM32L0130 產品手冊(英文版)

    MM32L0130 產品手冊(英文版)
    發表于 02-27 18:25 ?0次下載
    <b class='flag-5'>MM32L0130</b> 產品手冊(英文版)

    MM32L0130 用戶手冊(中文版)

    MM32L0130 用戶手冊(中文版)
    發表于 02-27 18:26 ?0次下載
    <b class='flag-5'>MM32L0130</b> 用戶手冊(中文版)

    MM32L0130 用戶手冊(英文版)

    MM32L0130 用戶手冊(英文版)
    發表于 02-27 18:26 ?0次下載
    <b class='flag-5'>MM32L0130</b> 用戶手冊(英文版)

    基于MM32L0130LPUART應用(1)

    LPUART(Low power universal asynchronous receiver transmitter,低功耗通用異步收發器),相比標準的UART,其功耗極低,支持在低功耗模式下運行,并且可以將MCU從低功耗模式喚醒。
    的頭像 發表于 06-02 17:27 ?1694次閱讀
    基于<b class='flag-5'>MM32L0130</b>的<b class='flag-5'>LPUART</b>應用(1)

    使用MM32L0130和HYS1254的電子秤方案驗證

    NPI提了需求,需要驗證使用友商SDADC芯片和MM32L0130微控制器集成的一個系統應用方案。
    的頭像 發表于 10-17 17:16 ?1101次閱讀
    使用<b class='flag-5'>MM32L0130</b>和HYS1254的電子秤方案驗證