色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

CW32L083串口中斷+定時器實現不定長數據接收

華仔的編程隨筆 ? 來源:華仔的編程隨筆 ? 作者:華仔的編程隨筆 ? 2023-07-12 09:00 ? 次閱讀

CW32L083的UART是沒有空閑中斷的,這樣給接收數據幀帶來一定的不便。比如我們需要用的AT指令,那么判斷接收完一條完整的指令,可以用串口斷+結尾rn來判斷接收完一條完整指令。但是這個方法有一個缺點就是返回兩個rn 時就會處理起來非常麻煩。

這是我用串口中斷+定時器來實現 如空閑中斷的接收,而且可以靈活的處理接收最后一個數據后的延時來判是否接收完整一條指令。

【實現方法】

1、初始化串口5,開配置波特率為115200,開啟接收中斷。

static void SerialInit(uint32_t BaudRate)

{
uint32_t PCLK_Freq;

GPIO_InitTypeDef GPIO_InitStructure = {0};

UART_InitTypeDef UART_InitStructure = {0};



PCLK_Freq = SystemCoreClock > > pow2_table[CW_SYSCTRL- >CR0_f.HCLKPRS];

PCLK_Freq > >= pow2_table[CW_SYSCTRL- >CR0_f.PCLKPRS];



// 調試串口使用UART5

//  PB8- >TX

//  PB9< -RX

// 時鐘使能

__RCC_GPIOB_CLK_ENABLE();

__RCC_UART5_CLK_ENABLE();



// 先設置UART TX RX 復用,后設置GPIO的屬性,避免口線上出現毛刺

PB08_AFx_UART5TXD();

PB09_AFx_UART5RXD();



GPIO_InitStructure.Pins = GPIO_PIN_8;

GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_Init(CW_GPIOB, &GPIO_InitStructure);



GPIO_InitStructure.Pins = GPIO_PIN_9;

GPIO_InitStructure.Mode = GPIO_MODE_INPUT;

GPIO_Init(CW_GPIOB, &GPIO_InitStructure);



UART_InitStructure.UART_BaudRate = BaudRate;

UART_InitStructure.UART_Over = UART_Over_16;

UART_InitStructure.UART_Source = UART_Source_PCLK;

UART_InitStructure.UART_UclkFreq = PCLK_Freq;

UART_InitStructure.UART_StartBit = UART_StartBit_FE;

UART_InitStructure.UART_StopBits = UART_StopBits_1;

UART_InitStructure.UART_Parity = UART_Parity_No;

UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;

UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;

UART_Init(CW_UART5, &UART_InitStructure);

//優先級,無優先級分組

NVIC_SetPriority(UART2_UART5_IRQn, 0);

//UARTx中斷使能

NVIC_EnableIRQ(UART2_UART5_IRQn);
}

2、定義一個結構體來儲存串口的數據:

typedef struct _uartx_infor{

uint8_t rx_cnt;

uint8_t tx_cnt;

uint8_t rx_buff[UART_LEN_MAX];

uint8_t tx_buff[UART_LEN_MAX];

FunctionalState rx_state; //接收狀態

} uartx_infor;

3、初始化GTIM1定時器,定義為一次計時,主頻為64M,所以配置16分頻 預載值為40000,從而實現10毫秒溢出產生中斷。

/* 初始化GTIM定時1 創建10ms的中斷*/

void init_gtim1(void)

{

GTIM_InitTypeDef GTIM_InitStruct = {0};
__RCC_GTIM1_CLK_ENABLE();   // GTIM1時鐘使能

__disable_irq();

NVIC_EnableIRQ(GTIM1_IRQn);

__enable_irq();

GTIM_InitStruct.Mode = GTIM_MODE_TIME;

GTIM_InitStruct.OneShotMode = GTIM_COUNT_ONESHOT; //只運行一次

GTIM_InitStruct.Prescaler = GTIM_PRESCALER_DIV16;

GTIM_InitStruct.ReloadValue = 40000UL - 1;    // PWM頻率為 64M/16/ 4M =100Hz

GTIM_InitStruct.ToggleOutState = DISABLE;

GTIM_TimeBaseInit(CW_GTIM1, >IM_InitStruct);

GTIM_ITConfig(CW_GTIM1, GTIM_IT_OV, ENABLE);

//GTIM_Cmd(CW_GTIM1, ENABLE);
}

4、定義串口中斷函數如下,主要的思想就是觸發接收中斷后,停止定時器的運行,重裝ARR值,再開啟定時器,同時把接收到的數據放入緩沖區。如果接收大于最大緩沖區,則接收值歸零。

/**
 * @brief This funcation handles UART2
 */
void UART2_UART5_IRQHandler(void)
{
    /* USER CODE BEGIN */
    uint8_t rx_data;
    if(UART_GetITStatus(CW_UART5, UART_IT_RC) != RESET)
    {
        uart5_infor.rx_state = DISABLE;
        rx_data = UART_ReceiveData_8bit(CW_UART5);
        if(uart5_infor.rx_cnt < UART_LEN_MAX)
        {
            uart5_infor.rx_buff[uart5_infor.rx_cnt] = rx_data;
            CW_GTIM1- >CR0_f.EN = 0;
            CW_GTIM1- >ARR = 40000-1;
            CW_GTIM1- >CR0_f.EN = 1;
        }
        else
        {
            uart5_infor.rx_cnt = 0;
            memset(uart5_infor.rx_buff, 0, UART_LEN_MAX);
        }
        uart5_infor.rx_cnt ++;
        UART_ClearITPendingBit(CW_UART5, UART_IT_RC);
    }
    /* USER CODE END */
}

5、定時器函數為,如果觸發中斷,清除中斷標志,把接收完整數據值置為真:

/**
 * @brief This funcation handles GTIM1
 */
void GTIM1_IRQHandler(void)
{
    /* USER CODE BEGIN */
    if(GTIM_GetITStatus(CW_GTIM1, GTIM_IT_OV))
    {
        GTIM_ClearITPendingBit(CW_GTIM1, GTIM_IT_OV);
        uart5_infor.rx_state = ENABLE; 
    }
    /* USER CODE END */
}

6、在主函數中,我們判斷接收狀態是否為真,如果為真則打印出接收的數值,并且重置串口數據。

while (1)
    {
        if(uart5_infor.rx_state == ENABLE)
        {
            printf("uart5 recv cnt:%drn", uart5_infor.rx_cnt);
            printf("uart5 recv cnt:%srn", uart5_infor.rx_buff);
            uart5_infor_init();
        }
        // GPIO_TogglePin(CW_GPIOC, GPIO_PIN_2);
        // rt_thread_mdelay(500);
        rt_thread_mdelay(10);
    }

【實驗效果】

我們發送不定長數據,正確的從串口返回數據:

image.png

image.png

【總結】

用定時器與串口中斷結合起來,完美的實現了串口的不定長接收。
審核編輯:湯梓紅

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

    關注

    1

    文章

    607

    瀏覽量

    35692
  • 中斷
    +關注

    關注

    5

    文章

    898

    瀏覽量

    41470
  • 定時器
    +關注

    關注

    23

    文章

    3246

    瀏覽量

    114719
  • 串口
    +關注

    關注

    14

    文章

    1551

    瀏覽量

    76421
  • uart
    +關注

    關注

    22

    文章

    1235

    瀏覽量

    101354
收藏 人收藏

    評論

    相關推薦

    基于CW32L083的線控器方案設計

    基于武漢芯源推出的CW32L083設計的空調線控器產品.
    的頭像 發表于 06-25 14:23 ?12.3w次閱讀
    基于<b class='flag-5'>CW32L083</b>的線控器方案設計

    FreeRTOS串口中斷接收不定長數據與二值信號量的使用

    FreeRTOS例程,使用串口中斷接收不定長數據,以及二值信號量的使用
    的頭像 發表于 09-26 09:02 ?4168次閱讀
    FreeRTOS<b class='flag-5'>串口中斷</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b>的<b class='flag-5'>數據</b>與二值信號量的使用

    基于CW32L083的空調遙控方案設計

    基于武漢芯源半導體推出的CW32L083而設計的的空調遙控方案
    的頭像 發表于 06-21 16:03 ?1523次閱讀
    基于<b class='flag-5'>CW32L083</b>的空調遙控<b class='flag-5'>器</b>方案設計

    stm32串口是如何實現接收不定長度數據的呢

    stm32串口是如何實現接收不定長度數據的呢?串口接收數據
    發表于 08-11 08:18

    STM32F103串口中斷是如何去接收不定長字符

    STM32F103串口中斷是如何去接收不定長字符的?有什么方法嗎?
    發表于 12-08 07:40

    武漢芯源Cortex-M0+ 32位低功耗MCU CW32L083系列產品介紹

    FLASH 、最多 24KB RAM、最多87路GPIO,以及一系列增強型外設。外設主要包括:1路12位ADC,6路UART、2路SPI、2路IIC以及多路定時器等功能模塊,相較其他系列產品CW32L083
    發表于 08-24 09:12

    可以用串口空閑中斷+DMA來實現串口接收不定長數據嗎?

    串口接收不定長數據,論壇上有人說可以用串口空閑中斷+DMA來
    發表于 03-07 14:49

    CW32L083產品介紹

    CW32L083是一款基于eFlash的單芯片低功耗微控制,集成了ARM?Cortex?-M0+ 核心,主頻高達64MHz,高速嵌入式存儲(高達256K字節的FLASH和 高達24K字節
    發表于 09-14 06:41

    CW32L083微控制數據手冊

    定時器以及一組高級控制 PWM 定時器CW32L083 可以在 -40° C 到 85° C 的溫度范圍內工作,供電電壓寬達 1.65V ~ 5.5V。支持 Sleep 和 DeepSleep兩種低功耗工作模式。
    發表于 09-14 06:27

    stm32 串口接收不定長度數據及黏包處理 + 串口DMA接收

    ,那么stm32串口是如何實現接收不定長度數據的呢? 串口接收
    發表于 12-23 19:09 ?27次下載
    stm32 <b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長度數據</b>及黏包處理 + <b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>

    STM32之串口DMA接收不定長數據

    使用stm32或者其他單片機的時候,會經常使用到串口通訊,那么如何有效地接收數據呢?假如這段數據不定長的有如何高效
    發表于 12-24 19:03 ?30次下載
    STM32之<b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    STM32CUBEMX(8)--USART通過定時器中斷方式接收不定長數據

    本文利用中斷實現串口不定長接收(非DMA),使用HAL庫,將接收
    的頭像 發表于 11-14 16:31 ?1408次閱讀
    STM32CUBEMX(8)--USART通過<b class='flag-5'>定時器</b><b class='flag-5'>中斷</b>方式<b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    瑞薩e2studio(12)----USRT通過定時器中斷方式接收不定長數據

    本篇文章主要介紹如何使用e2studio對瑞薩單片機進行USRT通過定時器中斷方式接收不定長數據
    的頭像 發表于 11-15 11:19 ?1177次閱讀
    瑞薩e2studio(12)----USRT通過<b class='flag-5'>定時器</b><b class='flag-5'>中斷</b>方式<b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    瑞薩e2studio----USRT通過定時器中斷方式接收不定長數據

    本篇文章主要介紹如何使用e2studio對瑞薩單片機進行USRT通過定時器中斷方式接收不定長數據
    的頭像 發表于 11-02 17:21 ?1540次閱讀
    瑞薩e2studio----USRT通過<b class='flag-5'>定時器</b><b class='flag-5'>中斷</b>方式<b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    CW32L083如何實現AUTOTRIM時鐘校準?

    CW32L083如何實現AUTOTRIM時鐘校準?
    的頭像 發表于 11-07 17:17 ?636次閱讀
    <b class='flag-5'>CW32L083</b>如何<b class='flag-5'>實現</b>AUTOTRIM時鐘校準?
    主站蜘蛛池模板: 九九在线免费视频| 国产激情视频在线播放| 中文字幕在线不卡精品视频99| 香蕉免费高清完整| 天天狠狠弄夜夜狠狠躁·太爽了| 亲胸摸下面激烈免费网站| 美女张开让男生桶| 免费果冻传媒2021在线观看| 久久中文字幕无码A片不卡| 久久91精品国产91久| 湖南电台在线收听| 精品国产mmd在线观看| 黄网址在线观看| 久久精品AV无码亚洲色欲| 精品无码国产自产在线观看 | 先锋影音av资源站av| 少女free大陆| 午夜家庭影院| 亚洲高清国产品国语在线观看| 亚洲国产在线精品第二剧情不卡| 亚洲AV香蕉一区区二区三区蜜桃| 亚洲国产在线精品国自产拍五月| 亚洲精品蜜夜内射| 亚洲无遮挡无码A片在线| 有人有片的观看免费视频| 综合人妻久久一区二区精品| 99RE久久精品国产| 趁老师睡着吃她的奶水| 国产精品久久久久婷婷五月色婷婷| 国产九九九九九九九A片| 黑人玩弄极品人妻系列| 久久只有这里有精品4| 欧美视频毛片在线播放| 四虎影视国产精品亚洲精品| 亚洲精品久久久992KVTV| 在线少女漫画| 成年人免费观看的视频| 国产精品青青草原app大全| 精品欧美一区二区三区四区| 毛片手机在线| 添加一点爱与你电视剧免费观看|