日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CW32L083串口中斷+定時(shí)器實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)接收

華仔的編程隨筆 ? 來(lái)源:華仔的編程隨筆 ? 作者:華仔的編程隨筆 ? 2023-07-12 09:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

CW32L083的UART是沒(méi)有空閑中斷的,這樣給接收數(shù)據(jù)幀帶來(lái)一定的不便。比如我們需要用的AT指令,那么判斷接收完一條完整的指令,可以用串口斷+結(jié)尾rn來(lái)判斷接收完一條完整指令。但是這個(gè)方法有一個(gè)缺點(diǎn)就是返回兩個(gè)rn 時(shí)就會(huì)處理起來(lái)非常麻煩。

這是我用串口中斷+定時(shí)器來(lái)實(shí)現(xiàn) 如空閑中斷的接收,而且可以靈活的處理接收最后一個(gè)數(shù)據(jù)后的延時(shí)來(lái)判是否接收完整一條指令。

【實(shí)現(xiàn)方法】

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

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];



// 調(diào)試串口使用UART5

//  PB8- >TX

//  PB9< -RX

// 時(shí)鐘使能

__RCC_GPIOB_CLK_ENABLE();

__RCC_UART5_CLK_ENABLE();



// 先設(shè)置UART TX RX 復(fù)用,后設(shè)置GPIO的屬性,避免口線上出現(xiàn)毛刺

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);

//優(yōu)先級(jí),無(wú)優(yōu)先級(jí)分組

NVIC_SetPriority(UART2_UART5_IRQn, 0);

//UARTx中斷使能

NVIC_EnableIRQ(UART2_UART5_IRQn);
}

2、定義一個(gè)結(jié)構(gòu)體來(lái)儲(chǔ)存串口的數(shù)據(jù):

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; //接收狀態(tài)

} uartx_infor;

3、初始化GTIM1定時(shí)器,定義為一次計(jì)時(shí),主頻為64M,所以配置16分頻 預(yù)載值為40000,從而實(shí)現(xiàn)10毫秒溢出產(chǎn)生中斷。

/* 初始化GTIM定時(shí)1 創(chuàng)建10ms的中斷*/

void init_gtim1(void)

{

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

__disable_irq();

NVIC_EnableIRQ(GTIM1_IRQn);

__enable_irq();

GTIM_InitStruct.Mode = GTIM_MODE_TIME;

GTIM_InitStruct.OneShotMode = GTIM_COUNT_ONESHOT; //只運(yùn)行一次

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、定義串口中斷函數(shù)如下,主要的思想就是觸發(fā)接收中斷后,停止定時(shí)器的運(yùn)行,重裝ARR值,再開(kāi)啟定時(shí)器,同時(shí)把接收到的數(shù)據(jù)放入緩沖區(qū)。如果接收大于最大緩沖區(qū),則接收值歸零。

/**
 * @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、定時(shí)器函數(shù)為,如果觸發(fā)中斷,清除中斷標(biāo)志,把接收完整數(shù)據(jù)值置為真:

/**
 * @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、在主函數(shù)中,我們判斷接收狀態(tài)是否為真,如果為真則打印出接收的數(shù)值,并且重置串口數(shù)據(jù)。

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);
    }

【實(shí)驗(yàn)效果】

我們發(fā)送不定長(zhǎng)數(shù)據(jù),正確的從串口返回?cái)?shù)據(jù):

image.png

image.png

【總結(jié)】

用定時(shí)器與串口中斷結(jié)合起來(lái),完美的實(shí)現(xiàn)了串口的不定長(zhǎng)接收。
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 指令
    +關(guān)注

    關(guān)注

    1

    文章

    624

    瀏覽量

    37675
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    920

    瀏覽量

    43883
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3375

    瀏覽量

    124649
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1627

    瀏覽量

    83392
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1322

    瀏覽量

    107026
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    FreeRTOS串口中斷接收不定長(zhǎng)數(shù)據(jù)與二值信號(hào)量的使用

    FreeRTOS例程,使用串口中斷接收不定長(zhǎng)數(shù)據(jù),以及二值信號(hào)量的使用
    的頭像 發(fā)表于 09-26 09:02 ?6429次閱讀
    FreeRTOS<b class='flag-5'>串口中斷</b><b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)</b>的<b class='flag-5'>數(shù)據(jù)</b>與二值信號(hào)量的使用

    CW32定時(shí)器中斷介紹

    可以由硬件自 動(dòng)執(zhí)行觸發(fā)信號(hào)的濾波操作,還能令觸發(fā)事件產(chǎn)生中斷和 DMA 請(qǐng)求。 低功耗定時(shí)器CW32L083 內(nèi)部集成 1 個(gè) 16 位低功耗定時(shí)器(LPTIM),可以以很低的
    發(fā)表于 12-01 07:08

    請(qǐng)問(wèn)CW32L的UART是不是沒(méi)有空閑中斷

    CW32L083的UART是不是沒(méi)有空閑中斷?大家一般怎么實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)接收?是
    發(fā)表于 12-15 07:28

    CW32L083的基本定時(shí)器

    CW32L083 內(nèi)部集成 3 個(gè)基本定時(shí)器 (BTIM),每個(gè) BTIM 完全獨(dú)立且功能完全相同,各包含一個(gè) 16bit 自動(dòng)重裝 載計(jì)數(shù)并由一個(gè)可編程預(yù)分頻驅(qū)動(dòng)。BTIM 支持
    發(fā)表于 12-15 06:23

    stm32串口是如何實(shí)現(xiàn)接收不定長(zhǎng)度數(shù)據(jù)的呢

    stm32串口是如何實(shí)現(xiàn)接收不定長(zhǎng)度數(shù)據(jù)的呢?串口接收數(shù)據(jù)
    發(fā)表于 08-11 08:18

    STM32F103串口中斷是如何去接收不定長(zhǎng)字符

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

    可以用串口空閑中斷+DMA來(lái)實(shí)現(xiàn)串口接收不定長(zhǎng)數(shù)據(jù)嗎?

    串口接收不定長(zhǎng)數(shù)據(jù),論壇上有人說(shuō)可以用串口空閑中斷+DMA來(lái)
    發(fā)表于 03-07 14:49

    CW32L083產(chǎn)品介紹

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

    CW32L083微控制數(shù)據(jù)手冊(cè)

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

    stm32 串口接收不定長(zhǎng)度數(shù)據(jù)及黏包處理 + 串口DMA接收

    ,那么stm32串口是如何實(shí)現(xiàn)接收不定長(zhǎng)度數(shù)據(jù)的呢? 串口接收
    發(fā)表于 12-23 19:09 ?27次下載
    stm32 <b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)度數(shù)據(jù)</b>及黏包處理 + <b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>

    STM32之串口DMA接收不定長(zhǎng)數(shù)據(jù)

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

    STM32CUBEMX(8)--USART通過(guò)定時(shí)器中斷方式接收不定長(zhǎng)數(shù)據(jù)

    本文利用中斷實(shí)現(xiàn)串口不定長(zhǎng)接收(非DMA),使用HAL庫(kù),將接收
    的頭像 發(fā)表于 11-14 16:31 ?2642次閱讀
    STM32CUBEMX(8)--USART通過(guò)<b class='flag-5'>定時(shí)器</b><b class='flag-5'>中斷</b>方式<b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b>

    瑞薩e2studio(12)----USRT通過(guò)定時(shí)器中斷方式接收不定長(zhǎng)數(shù)據(jù)

    本篇文章主要介紹如何使用e2studio對(duì)瑞薩單片機(jī)進(jìn)行USRT通過(guò)定時(shí)器中斷方式接收不定長(zhǎng)數(shù)據(jù)
    的頭像 發(fā)表于 11-15 11:19 ?2296次閱讀
    瑞薩e2studio(12)----USRT通過(guò)<b class='flag-5'>定時(shí)器</b><b class='flag-5'>中斷</b>方式<b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b>

    瑞薩e2studio----USRT通過(guò)定時(shí)器中斷方式接收不定長(zhǎng)數(shù)據(jù)

    本篇文章主要介紹如何使用e2studio對(duì)瑞薩單片機(jī)進(jìn)行USRT通過(guò)定時(shí)器中斷方式接收不定長(zhǎng)數(shù)據(jù)。
    的頭像 發(fā)表于 11-02 17:21 ?2887次閱讀
    瑞薩e2studio----USRT通過(guò)<b class='flag-5'>定時(shí)器</b><b class='flag-5'>中斷</b>方式<b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b>

    CW32L083如何實(shí)現(xiàn)AUTOTRIM時(shí)鐘校準(zhǔn)?

    CW32L083如何實(shí)現(xiàn)AUTOTRIM時(shí)鐘校準(zhǔn)?
    的頭像 發(fā)表于 11-07 17:17 ?1574次閱讀
    <b class='flag-5'>CW32L083</b>如何<b class='flag-5'>實(shí)現(xiàn)</b>AUTOTRIM時(shí)鐘校準(zhǔn)?
    托里县| 大同县| 康定县| 太康县| 区。| 台中县| 临汾市| 宜章县| 安吉县| 临沂市| 凭祥市| 临颍县| 博客| 沈丘县| 分宜县| 景谷| 米泉市| 新绛县| 阿拉善右旗| 柏乡县| 陆川县| 印江| 清镇市| 会昌县| 玉门市| 福海县| 辽宁省| 漳州市| 宣恩县| 旅游| 图木舒克市| 南溪县| 彰化市| 房山区| 东至县| 通辽市| 武鸣县| 霍城县| 如皋市| 建阳市| 金门县|