国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【嵌入式】HC32F460串口接收超時(shí)中斷+DMA

這篇具有很好參考價(jià)值的文章主要介紹了【嵌入式】HC32F460串口接收超時(shí)中斷+DMA。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一 項(xiàng)目背景

????????項(xiàng)目需要使用一款UART串口編碼器,編碼器的數(shù)據(jù)以波特率57600持續(xù)向外發(fā)送。但這組數(shù)據(jù)包沒有固定的包頭和校驗(yàn)尾,僅僅是由多圈圈數(shù)和單圈角度組成的六字節(jié)數(shù)據(jù)碼,這樣接收到的數(shù)組無法確定實(shí)際的下標(biāo),所以這邊考慮用串口接收超時(shí)中斷+DMA來實(shí)現(xiàn)。

二 原理說明

【1】UART原理說明:參考【嵌入式】NXP/LPC使用GPIO+定時(shí)器模擬UART串口接收

【2】超時(shí)中斷原理說明:接收的數(shù)據(jù)包通過邏輯分析儀,如下所示:

hc32 串口,嵌入式,單片機(jī),嵌入式硬件,C語言,串口文章來源地址http://www.zghlxwxcb.cn/news/detail-632507.html

? ? ? ? 由上面的數(shù)據(jù)可以看到,兩個(gè)包之間的發(fā)送間隔為500us左右,而一個(gè)包的發(fā)送時(shí)間為170us(波特率為57600,那么每位數(shù)據(jù)是17us,一個(gè)包10位數(shù)據(jù),就是170us),所以只要在串口收發(fā)的過程中加一個(gè)定時(shí)器,設(shè)定超時(shí)時(shí)間為400us(大于170us,小于500us即可),那么?只要超時(shí)了,說明下一次收到的位即為起始位

????????STM32中有一個(gè)空閑中斷(IDLE)的概念,而HC32中沒有,取而代之的是串口接收超時(shí)中斷,兩者基本功能是類似的,都是在串口超過一段時(shí)間沒有接收數(shù)據(jù)之后觸發(fā)的一個(gè)中斷功能。HC32F460的用戶手冊(cè)中對(duì)此也有詳細(xì)說明(我們這邊用的是USART4串口,所以相對(duì)應(yīng)的需需要使用 Timer0 Unit2 B 通道):

hc32 串口,嵌入式,單片機(jī),嵌入式硬件,C語言,串口

【3】DMA原理說明:DMA(Direct Memory Access,直接存儲(chǔ)器訪問) 是單片機(jī)的一個(gè)外設(shè),它的主要功能是用來搬移數(shù)據(jù),但是不需要占用 CPU,即在傳輸數(shù)據(jù)的時(shí)候, CPU 可以干其他的事情,好像多線程一樣。(具體可以參考:串口DMA傳輸模式)

hc32 串口,嵌入式,單片機(jī),嵌入式硬件,C語言,串口

? ? ? ? ?這邊用到DMA,是因?yàn)榫幋a器發(fā)送數(shù)據(jù)比較快,若是一直進(jìn)中斷會(huì)擠占CPU的資源,所以考慮用DMA改進(jìn)。

三 設(shè)計(jì)實(shí)現(xiàn)--超時(shí)定時(shí)器部分

【1】超時(shí)定時(shí)器初始化( Timer0 Unit2 B 通道 ),這個(gè)過程中主要關(guān)注一下定時(shí)器時(shí)間的設(shè)置,如下面的 stcTimerCfg.Tim0_CmpValue = 4200 ,它的時(shí)鐘源是 Tim0_Pclk1 ,在HC32F460中,這個(gè)時(shí)鐘是168MHz的一半,即84MHz,時(shí)鐘的分頻系數(shù)為8,根據(jù)公式:

T=CmpValue*ClockSource*ClockDivision

其中,T = 400us,ClockSource=1/84MHz,ClockDivision=8,計(jì)算出CmpValue=4200:

void Timer0_Config(void)
{
    stc_clk_freq_t stcClkTmp;
    stc_tim0_base_init_t stcTimerCfg;
    stc_tim0_trigger_init_t StcTimer0TrigInit;

    MEM_ZERO_STRUCT(stcClkTmp);
    MEM_ZERO_STRUCT(stcTimerCfg);
    MEM_ZERO_STRUCT(StcTimer0TrigInit);

    /* Timer0 peripheral enable */
    PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIM02, Enable);

    /* Clear CNTAR register for channel B */
    TIMER0_WriteCntReg(M4_TMR02, Tim0_ChannelB, 0u);

    /* Config register for channel B */
    stcTimerCfg.Tim0_CounterMode = Tim0_Sync;
    stcTimerCfg.Tim0_SyncClockSource = Tim0_Pclk1;
    stcTimerCfg.Tim0_ClockDivision = Tim0_ClkDiv8;
    stcTimerCfg.Tim0_CmpValue = 4200;
    TIMER0_BaseInit(M4_TMR02, Tim0_ChannelB, &stcTimerCfg);

    /* Clear compare flag */
    TIMER0_ClearFlag(M4_TMR02, Tim0_ChannelB);

    /* Config timer0 hardware trigger */
    StcTimer0TrigInit.Tim0_InTrigEnable = false;
    StcTimer0TrigInit.Tim0_InTrigClear = true;
    StcTimer0TrigInit.Tim0_InTrigStart = true;
    StcTimer0TrigInit.Tim0_InTrigStop = false;
    TIMER0_HardTriggerInit(M4_TMR02, Tim0_ChannelB, &StcTimer0TrigInit);
}

四 設(shè)計(jì)實(shí)現(xiàn)--串口部分

【1】串口初始化:

/* USART baudrate definition */
#define USART4_BAUDRATE                  (57600)
/* USART Interrupt Number */
#define USART4_IRQn                      (Int025_IRQn)
#define USART4_ERR_IRQn                  (Int026_IRQn)
#define USART4_RTO_IRQn                  (Int029_IRQn)
/* USART RX Port/Pin definition */
#define USART4_RX_PORT                   (PortE)
#define USART4_RX_PIN                    (Pin14)
#define USART4_RX_FUNC                   (Func_Usart4_Rx)

void initUART4(void)
{
    en_result_t enRet = Ok;
    stc_irq_regi_conf_t stcIrqRegiCfg;
    
    /*配置串口使用的時(shí)鐘和基本通信配置*/
    const stc_usart_uart_init_t stcInitCfg = {
        UsartIntClkCkOutput,
        UsartClkDiv_1,
        UsartDataBits8,
        UsartDataLsbFirst,
        UsartOneStopBit,
        UsartParityNone,
        UsartSampleBit8,
        UsartStartBitFallEdge,
        UsartRtsEnable,
    };
    
    /*打開時(shí)鐘*/
    PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_USART4, Enable);
    
    /*配置相應(yīng)的IO作為串口的RX引腳*/
    PORT_SetFunc(USART4_RX_PORT, USART4_RX_PIN, USART4_RX_FUNC, Disable);

    /*初始化串口配置*/
    enRet = USART_UART_Init(M4_USART4, &stcInitCfg);
    if (enRet != Ok)while (1);
    /*串口波特率設(shè)置*/
    enRet = USART_SetBaudrate(M4_USART4, USART4_BAUDRATE);
    if (enRet != Ok)while (1);
    
    /*設(shè)置串口接收中斷*/
    stcIrqRegiCfg.enIRQn = USART4_IRQn;
    stcIrqRegiCfg.pfnCallback = &Usart4RxIrqCallback;
    stcIrqRegiCfg.enIntSrc = INT_USART4_RI;
    enIrqRegistration(&stcIrqRegiCfg);
    NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
    NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
    
    /*設(shè)置串口接收錯(cuò)誤中斷*/
    stcIrqRegiCfg.enIRQn = USART4_ERR_IRQn;
    stcIrqRegiCfg.pfnCallback = &Usart4ErrIrqCallback;
    stcIrqRegiCfg.enIntSrc = INT_USART4_EI;
    enIrqRegistration(&stcIrqRegiCfg);
    NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
    NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
    
    /*設(shè)置接收超時(shí)中斷*/
    stcIrqRegiCfg.enIRQn = USART4_RTO_IRQn;
    stcIrqRegiCfg.pfnCallback = &Usart4TimeoutIrqCallback;
    stcIrqRegiCfg.enIntSrc = INT_USART4_RTO;
    enIrqRegistration(&stcIrqRegiCfg);
    NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
    NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);

    
    USART_FuncCmd(M4_USART4, UsartRx, Enable);//使能接收
    USART_FuncCmd(M4_USART4, UsartRxInt, Enable);//使能接收中斷
    USART_FuncCmd(M4_USART4, UsartTimeOut, Enable);//使能超時(shí)
    USART_FuncCmd(M4_USART4, UsartTimeOutInt, Enable);//使能超時(shí)中斷
}

【2】串口接收中斷回調(diào):

#define ENCODER_LEN      6
uint8_t ecd_buf[ENCODER_LEN];
uint8_t ecd_timeout_flag;

static void Usart4RxIrqCallback(void)
{
    static uint8_t cnt = 0;
    while(1)
	{
		if (Set == USART_GetStatus(M4_USART4, UsartRxNoEmpty)) 
		{
            if(ecd_timeout_flag == 1)  //如果超時(shí),下一個(gè)接收到的即為起始位
                cnt = 0;
            ecd_buf[cnt++] = USART_RecData(M4_USART4);
            ecd_timeout_flag = 0;
            
            if(cnt > 5)
                cnt = 0;
		}
        else
            break;
	}
}

【3】串口接收錯(cuò)誤中斷回調(diào):

static void Usart4ErrIrqCallback(void)
{
    if (Set == USART_GetStatus(M4_USART4, UsartFrameErr))
        USART_ClearStatus(M4_USART4, UsartFrameErr);

    if (Set == USART_GetStatus(M4_USART4, UsartParityErr))
        USART_ClearStatus(M4_USART4, UsartParityErr);

    if (Set == USART_GetStatus(M4_USART4, UsartOverrunErr))
        USART_ClearStatus(M4_USART4, UsartOverrunErr);
}

【4】串口接收超時(shí)中斷回調(diào):

static void Usart4TimeoutIrqCallback(void)
{
    ecd_timeout_flag = 1;  //下一次接收為通訊碼的開始位
    TIMER0_Cmd(M4_TMR02, Tim0_ChannelB,Disable);
    USART_ClearStatus(M4_USART4, UsartRxTimeOut);
}

? ? ? ? 到這邊為止,就可以正常的讀到編碼器的數(shù)據(jù)了,而且是以編碼器的發(fā)送順序排列在ecd_buf數(shù)組中,只要處理該數(shù)組就可以取到編碼器的多圈圈數(shù)和單圈角度。

? ? ? ? 下面的DMA部分是想改進(jìn)一下控制方案,使得不那么頻繁地進(jìn)入接收中斷,以減小CPU的資源消耗。

五 設(shè)計(jì)實(shí)現(xiàn)--DMA部分

【1】DMA初始化和中斷,其中主要關(guān)注幾點(diǎn):

????????一是接收的數(shù)據(jù)需要映射到ecd_buf的地址:

????????(stcDmaInit.u32DesAddr = (uint32_t)(&ecd_buf))

????????二是發(fā)送數(shù)據(jù)模式需要改為遞增:

????????(stcDmaInit.stcDmaChCfg.enDesInc = AddressIncrease):

static void DmaBtcIrqCallback(void)
{
    USART_ClearStatus(M4_USART4, UsartRxTimeOut);  //清楚接收超時(shí)標(biāo)志
    DMA_ClearIrqFlag(M4_DMA1, DmaCh0, BlkTrnCpltIrq);
}

static void DmaInit(void)
{
    stc_dma_config_t stcDmaInit;
    stc_irq_regi_conf_t stcIrqRegiCfg;

    /* Enable peripheral clock */
    PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_DMA1 | PWC_FCG0_PERIPH_DMA2,Enable);

    /* Enable DMA. */
    DMA_Cmd(M4_DMA1,Enable);

    /* Initialize DMA. */
    MEM_ZERO_STRUCT(stcDmaInit);
    stcDmaInit.u16BlockSize = 1u; /* 1 block */
    stcDmaInit.u32SrcAddr = ((uint32_t)(&M4_USART4->DR)+2ul); /* Set source address. */
    stcDmaInit.u32DesAddr = (uint32_t)(&ecd_buf);     /* Set destination address. */
    stcDmaInit.stcDmaChCfg.enSrcInc = AddressFix;  /* Set source address mode. */
    stcDmaInit.stcDmaChCfg.enDesInc = AddressIncrease;  /* Set destination address mode. */
    stcDmaInit.stcDmaChCfg.enIntEn = Enable;       /* Enable interrupt. */
    stcDmaInit.stcDmaChCfg.enTrnWidth = Dma8Bit;   /* Set data width 8bit. */
    DMA_InitChannel(M4_DMA1, DmaCh0, &stcDmaInit);

    /* Enable the specified DMA channel. */
    DMA_ChannelCmd(M4_DMA1, DmaCh0, Enable);

    /* Clear DMA flag. */
    DMA_ClearIrqFlag(M4_DMA1, DmaCh0, TrnCpltIrq);

    /* Enable peripheral circuit trigger function. */
    PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_AOS,Enable);

    /* Set DMA trigger source. */
    DMA_SetTriggerSrc(M4_DMA1, DmaCh0, EVT_USART4_RI);

    /* Set DMA block transfer complete IRQ */
    stcIrqRegiCfg.enIRQn = Int030_IRQn;
    stcIrqRegiCfg.pfnCallback = &DmaBtcIrqCallback;
    stcIrqRegiCfg.enIntSrc = INT_DMA1_BTC0;
    enIrqRegistration(&stcIrqRegiCfg);
    NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
    NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
}

【2】串口接收中斷就不用了,由DMA直接接收即可:

//串口接收錯(cuò)誤中斷回調(diào)
static void Usart4ErrIrqCallback(void)
{
    if (Set == USART_GetStatus(M4_USART4, UsartFrameErr))
        USART_ClearStatus(M4_USART4, UsartFrameErr);

    if (Set == USART_GetStatus(M4_USART4, UsartParityErr))
        USART_ClearStatus(M4_USART4, UsartParityErr);

    if (Set == USART_GetStatus(M4_USART4, UsartOverrunErr))
        USART_ClearStatus(M4_USART4, UsartOverrunErr);
}

//串口接收超時(shí)中斷回調(diào)
static void Usart4TimeoutIrqCallback(void)
{
    TIMER0_Cmd(M4_TMR02, Tim0_ChannelB,Disable);
    USART_ClearStatus(M4_USART4, UsartRxTimeOut);
    
    DMA_ChannelCmd(M4_DMA1, DmaCh0, Disable);  //超時(shí)重啟DMA,以進(jìn)行新一輪的接收
    DMA_SetDesAddress(M4_DMA1, DmaCh0, (uint32_t)(ecd_buf));
	DMA_SetTransferCnt(M4_DMA1, DmaCh0, ENCODER_LEN);
    DMA_ChannelCmd(M4_DMA1, DmaCh0, Enable);
}

void initUART4(void)
{
    en_result_t enRet = Ok;
    stc_irq_regi_conf_t stcIrqRegiCfg;
    
    /*配置串口使用的時(shí)鐘和基本通信配置*/
    const stc_usart_uart_init_t stcInitCfg = {
        UsartIntClkCkOutput,
        UsartClkDiv_1,
        UsartDataBits8,
        UsartDataLsbFirst,
        UsartOneStopBit,
        UsartParityNone,
        UsartSampleBit8,
        UsartStartBitFallEdge,
        UsartRtsEnable,
    };
    
    DmaInit();
    
    /*打開時(shí)鐘*/
    PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_USART4, Enable);
    
    /*配置相應(yīng)的IO作為串口的RX引腳*/
    PORT_SetFunc(USART4_RX_PORT, USART4_RX_PIN, USART4_RX_FUNC, Disable);

    /*初始化串口配置*/
    enRet = USART_UART_Init(M4_USART4, &stcInitCfg);
    if (enRet != Ok)while (1);
    /*串口波特率設(shè)置*/
    enRet = USART_SetBaudrate(M4_USART4, USART4_BAUDRATE);
    if (enRet != Ok)while (1);
    
    /*設(shè)置串口接收中斷舍棄*/
    
    /*設(shè)置串口接收錯(cuò)誤中斷*/
    stcIrqRegiCfg.enIRQn = USART4_ERR_IRQn;
    stcIrqRegiCfg.pfnCallback = &Usart4ErrIrqCallback;
    stcIrqRegiCfg.enIntSrc = INT_USART4_EI;
    enIrqRegistration(&stcIrqRegiCfg);
    NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
    NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
    
    /*設(shè)置接收超時(shí)中斷*/
    stcIrqRegiCfg.enIRQn = USART4_RTO_IRQn;
    stcIrqRegiCfg.pfnCallback = &Usart4TimeoutIrqCallback;
    stcIrqRegiCfg.enIntSrc = INT_USART4_RTO;
    enIrqRegistration(&stcIrqRegiCfg);
    NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
    NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);

    
    USART_FuncCmd(M4_USART4, UsartRx, Enable);//使能接收
    USART_FuncCmd(M4_USART4, UsartRxInt, Enable);//使能接收中斷
    USART_FuncCmd(M4_USART4, UsartTimeOut, Enable);//使能超時(shí)
    USART_FuncCmd(M4_USART4, UsartTimeOutInt, Enable);//使能超時(shí)中斷
}

? ? ? ? 項(xiàng)目中只需要用到串口數(shù)據(jù)的接收,所以這邊沒有DMA發(fā)送的內(nèi)容。

六 總結(jié)

?????????綜上,便可以通過串口接收超時(shí)中斷或者串口接收超時(shí)中斷+DMA進(jìn)行接收了。通過DEBUG也可以看到ecd_buf中的數(shù)據(jù)按順序排列為0x00,0x00,0xDD,0x2E,0x38,0x77,與邏輯分析儀中的一致:

hc32 串口,嵌入式,單片機(jī),嵌入式硬件,C語言,串口

到了這里,關(guān)于【嵌入式】HC32F460串口接收超時(shí)中斷+DMA的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 嵌入式開發(fā)--STM32用DMA+IDLE中斷方式串口接收不定長(zhǎng)數(shù)據(jù)

    嵌入式開發(fā)--STM32用DMA+IDLE中斷方式串口接收不定長(zhǎng)數(shù)據(jù)

    之前講過用 利用IDLE空閑中斷來接收不定長(zhǎng)數(shù)據(jù) ,但是沒有用到DMA,其實(shí)用DMA會(huì)更加的高效,MCU也可以騰出更多的性能去處理應(yīng)該做的事情。 IDLE顧名思義,就是空閑的意思,即當(dāng)監(jiān)測(cè)到串口空閑超過1個(gè)串口的數(shù)據(jù)幀時(shí),會(huì)使?fàn)顟B(tài)寄存器(SR或ISR)的IDLE位置位,如果此時(shí)控制

    2024年04月17日
    瀏覽(39)
  • [嵌入式軟件][啟蒙篇][仿真平臺(tái)] STM32F103實(shí)現(xiàn)串口輸出輸入、ADC采集

    [嵌入式軟件][啟蒙篇][仿真平臺(tái)] STM32F103實(shí)現(xiàn)串口輸出輸入、ADC采集

    上一篇:[嵌入式軟件][啟蒙篇][仿真平臺(tái)] STM32F103實(shí)現(xiàn)LED、按鍵 學(xué)C語言時(shí),使用的printf()函數(shù),就是通過串口打印出來的。 跟外部器件通信,比如GPS模塊、藍(lán)牙模塊、wifi模塊; 兩個(gè)開發(fā)板之間通信,制定私有協(xié)議。 PC電腦通信,使用上位機(jī)顯示數(shù)據(jù)或控制下位機(jī)。 操作:打

    2024年01月22日
    瀏覽(107)
  • STM32串口通信詳解(嵌入式學(xué)習(xí))

    STM32串口通信詳解(嵌入式學(xué)習(xí))

    時(shí)鐘信號(hào)在電子領(lǐng)域中是指用于同步和定時(shí)電路操作的周期性信號(hào)。它在數(shù)字系統(tǒng)和通信系統(tǒng)中起著至關(guān)重要的作用,用于協(xié)調(diào)各個(gè)組件之間的數(shù)據(jù)傳輸和操作。 時(shí)鐘信號(hào)有以下幾個(gè)重要的方面: 頻率:時(shí)鐘信號(hào)的頻率是指單位時(shí)間內(nèi)信號(hào)周期的數(shù)量。它通常以赫茲(Hz)為

    2024年02月09日
    瀏覽(23)
  • 【嵌入式】openmv與stm32的串口通信

    【嵌入式】openmv與stm32的串口通信

    參考:(文中部分圖/文字/代碼來自以下文章,部分內(nèi)容由于時(shí)間久遠(yuǎn)已經(jīng)找不到原作者,可聯(lián)系注明或刪除) PYTHON串口數(shù)據(jù)打包發(fā)送STM32接收數(shù)據(jù)解析 openmv中文文檔 這里以openmv循跡代碼為例 main.py 關(guān)于struct.pack: 函數(shù)原型:struct.pack(fmt, v1, v2, …) fmt是格式字符串 v1,v2是要轉(zhuǎn)

    2024年02月14日
    瀏覽(22)
  • 嵌入式硬件——stm32F103C8T6

    嵌入式硬件——stm32F103C8T6

    如下圖:? ? 處理器核心:STM32F103C8T6內(nèi)置了ARM Cortex-M3處理器,這是一種高性能、低功耗的32位RISC處理器,適用于嵌入式系統(tǒng)。 時(shí)鐘速度:它可以工作在不同的時(shí)鐘速度,最高主頻可達(dá)72 MHz。 存儲(chǔ)器:包括64KB的Flash程序存儲(chǔ)器用于存儲(chǔ)程序代碼,以及20KB的SRAM用于存儲(chǔ)數(shù)據(jù)和

    2024年02月05日
    瀏覽(125)
  • 【嵌入式學(xué)習(xí)-STM32F103-USART串口通信】

    【嵌入式學(xué)習(xí)-STM32F103-USART串口通信】

    4-1 基本流程 4-2 整體代碼 4-2-1 main.c 4-2-2 Serial.c 4-2-3 Serial.h 5-1 查詢 5-2 中斷 5-3 整體代碼 5-3-1 main.c 5-3-2 Serial.c 5-3-3 Serial.h 6-1 使用狀態(tài)機(jī)接收數(shù)據(jù)包的思路 6-2 串口收發(fā)HEX數(shù)據(jù)包 6-2-1 main.c 6-2-2 Serial.c 6-2-3 Serial.h 6-3串口收發(fā)文本數(shù)據(jù)包 6-3-1 main.c 6-3-2 Serial.c 6-3-3 Serial.h 全雙工:打

    2024年02月15日
    瀏覽(64)
  • 嵌入式_GD32使用宏開關(guān)進(jìn)行Debug串口打印調(diào)試

    串口Debug是一種將數(shù)據(jù)通過串口發(fā)送的方法。通過使用printf函數(shù),我們可以將需要發(fā)送的數(shù)據(jù)格式化為字符串,并通過串口發(fā)送出去。在C語言中,通常使用串口發(fā)送數(shù)據(jù)的函數(shù)為printf函數(shù),但是需要將標(biāo)準(zhǔn)輸出重定向到串口。 本文詳細(xì)的介紹了如何重定向printf輸出到串口輸出

    2024年02月14日
    瀏覽(27)
  • 嵌入式學(xué)習(xí)筆記——STM32的USART收發(fā)字符串及串口中斷

    嵌入式學(xué)習(xí)筆記——STM32的USART收發(fā)字符串及串口中斷

    上一篇中,介紹了串口收發(fā)相關(guān)的寄存器,通過代碼實(shí)現(xiàn)了一個(gè)字節(jié)的收發(fā),本文接著上面的內(nèi)容,通過功能函數(shù)實(shí)現(xiàn)字符串的收發(fā),然后引入中斷解決收發(fā)過程中while()死等的問題。 根據(jù)昨天的字符發(fā)送函數(shù),只需要稍作修改即可實(shí)現(xiàn)發(fā)送函數(shù)了,一個(gè)字符串的結(jié)尾會(huì)有一

    2024年02月03日
    瀏覽(36)
  • 【嵌入式知識(shí)08】STM32的USART串口通信,給上位機(jī)連續(xù)發(fā)送Hello Windows!

    【嵌入式知識(shí)08】STM32的USART串口通信,給上位機(jī)連續(xù)發(fā)送Hello Windows!

    本文主要介紹串口協(xié)議和RS-232、485標(biāo)準(zhǔn),以及RS232、485電平與TTL電平的區(qū)別,了解\\\"USB/TTL轉(zhuǎn)232\\\"模塊的工作原理;并完成一個(gè)STM32的USART串口通訊程序。 ??串口通信(Serial Communication)的概念非常簡(jiǎn)單,串口按位(bit)發(fā)送和接收字節(jié)的通信方式。盡管比按字節(jié)(byte)的并行通信

    2024年02月13日
    瀏覽(32)
  • 【嵌入式】STM32F031K4U6、STM32F031K6U6、STM32F031K6T6主流ARM Cortex-M0基本型系列MCU規(guī)格參數(shù)

    【嵌入式】STM32F031K4U6、STM32F031K6U6、STM32F031K6T6主流ARM Cortex-M0基本型系列MCU規(guī)格參數(shù)

    一、電路原理圖 【嵌入式】STM32F031K4U6、STM32F031K6U6、STM32F031K6T6主流ARM Cortex-M0基本型系列MCU —— 明佳達(dá) 二、規(guī)格參數(shù) 1、 STM32F031K4U6 (16KB)閃存 32UFQFPN 核心處理器:ARM? Cortex?-M0 內(nèi)核規(guī)格:32 位單核 速度:48MHz 連接能力:I2C,IrDA,LINbus,SPI,UART/USART 外設(shè):DMA,I2S,POR,

    2024年02月04日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包