91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

淺析新塘031 串口PDMA通信

Q4MP_gh_c472c21 ? 來源:嵌入式ARM ? 作者:吶咯密密 ? 2021-07-06 17:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

環(huán)境搭建這里就跳過了,沒啥用,我還是用KEIL 5 開發(fā),自行下載個PACK包安裝就好了。點此前往新塘官網(wǎng)。搜索自己的MCU型號,打開頁面,在資源中有文檔和軟件。

在文檔中下載數(shù)據(jù)手冊等文檔,在軟件中下載例程和工具,軟件中最實用的是以下幾個軟件:

從上到下依次是:官方例程庫,Nu_link驅(qū)動,外設(shè)引腳配置軟件,時鐘配置軟件。

外設(shè)引腳配置軟件用于快速配置引腳以及復(fù)用,該軟件只能配置引腳及其功能,不能配置外設(shè)等功能呢,例如串口的相關(guān)配置,這些事實現(xiàn)不了的。

時鐘配置軟件僅用于配置系統(tǒng)時鐘以及各外設(shè)時鐘。這兩個軟件支持導(dǎo)出.c代碼??蓮?fù)制粘貼到自己的工程。

這兩個軟件都是非常簡單的,這里就不贅述了。

但是有一個時鐘配置軟件有BUG,以我用的M031SE3AE為例,外部時鐘最大可使用32M,但是軟件中最大只支持24M,希望官方可以修復(fù)。

開始代碼

下載官方的例程,固件庫代碼在文件夾:D:M031_Series_BSP_CMSIS_V3.03.000SampleCodeStdDriver,寄存器代碼在D:M031_Series_BSP_CMSIS_V3.03.000SampleCodeRegBased

這里采用固件庫的方式開發(fā),方便快捷。

時鐘初始化:

void SYS_Init(void){

/*---------------------------------------------------------------------------------------------------------*/ /* Init System Clock */ /*---------------------------------------------------------------------------------------------------------*/ /* Unlock protected registers */ SYS_UnlockReg();

/* Enable HIRC clock (Internal RC 48MHz) */ CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

/* Wait for HIRC clock ready */ CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

/* Select HCLK clock source as HIRC and HCLK source divider as 1 */ CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

/* Set both PCLK0 and PCLK1 as HCLK */ CLK-》PCLKDIV = CLK_PCLKDIV_APB0DIV_DIV1 | CLK_PCLKDIV_APB1DIV_DIV1;

/* Select IP clock source */ /* Select UART0 clock source is HIRC */ CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1)); /* Select UART1 clock source is HIRC */ CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART1SEL_HIRC, CLK_CLKDIV0_UART1(1));

/* Enable UART0 peripheral clock */ CLK_EnableModuleClock(UART0_MODULE); /* Enable UART1 peripheral clock */ CLK_EnableModuleClock(UART1_MODULE); /* Enable PDMA module clock */ CLK_EnableModuleClock(PDMA_MODULE);

/* Update System Core Clock */ /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */ SystemCoreClockUpdate();

/*---------------------------------------------------------------------------------------------------------*/ /* Init I/O Multi-function */ /*---------------------------------------------------------------------------------------------------------*/

/* Set PB multi-function pins for UART0 RXD=PB.12 and TXD=PB.13 */ SYS-》GPB_MFPH = (SYS-》GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)) | (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);

/* Set PB multi-function pins for UART1 RXD(PB.2) and TXD(PB.3) */ SYS-》GPB_MFPL = (SYS-》GPB_MFPL & ~(SYS_GPB_MFPL_PB2MFP_Msk | SYS_GPB_MFPL_PB3MFP_Msk)) | (SYS_GPB_MFPL_PB2MFP_UART1_RXD | SYS_GPB_MFPL_PB3MFP_UART1_TXD);

/* Lock protected registers */ SYS_LockReg();}

在初始化時鐘之前需要確認自己的外部晶振的頻率,然后在system_M031Series.h文件的第38行修改宏定義。

be35f37e-d9a0-11eb-9e57-12bb97331649.png

在初始化時鐘時會將需要的外設(shè)時鐘一起初始化,這里初始化了UART0和UART1的時鐘以及PDMA的時鐘。

初始化UART

由于時鐘已經(jīng)配置,在初始化UART的配置時會顯得特別簡單。如果你的UART沒有特殊要求,兩行代碼即可完成UART的初始化。

void UART0_Init(){ /*---------------------------------------------------------------------------------------------------------*/ /* Init UART */ /*---------------------------------------------------------------------------------------------------------*/ /* Reset UART0 */ SYS_ResetModule(UART0_RST);

/* Configure UART0 and set UART0 baud rate */ UART_Open(UART0, 115200);}

void UART1_Init(){ /*---------------------------------------------------------------------------------------------------------*/ /* Init UART */ /*---------------------------------------------------------------------------------------------------------*/ /* Reset UART1 */ SYS_ResetModule(UART1_RST);

/* Configure UART1 and set UART1 Baudrate */ UART_Open(UART1, 2500000); /* Enable Interrupt and install the call back function */ NVIC_EnableIRQ(UART13_IRQn); UART_EnableInt(UART1, UART_INTEN_RDAIEN_Msk); }

串口0用于printf的調(diào)試。串口1 是我需要與其他串口設(shè)備通信接口。除了我在串口1設(shè)置了串口接收中斷以外,初始化一個串口僅僅需要兩個函數(shù),非常方便,這里使用的串口默認配置:一個停止位,無校驗位,8位數(shù)據(jù),如果需要修改可自行進入函數(shù)修改。

在配置串口1的接收中斷時遇到了問題:調(diào)用NVIC_EnableIRQ()函數(shù)初始化中斷線時,參數(shù)我填的是UART1_IRQn,無報錯,編譯可通過,但是測試沒現(xiàn)象,于是進入debug頁面,發(fā)現(xiàn)中斷函數(shù)并未被編譯。

be81c966-d9a0-11eb-9e57-12bb97331649.png

嘗試了很多方法都不能進行編譯,后來去看UART1_IRQn的定義,發(fā)現(xiàn)這個宏定義下面還有一個UART13_IRQn。于是明白過來了,

UART0和UART2共用一個中斷函數(shù)UART02_IRQHandler(),UART1和3共用中斷函數(shù)UART13_IRQHandler()這里區(qū)別于其他家的庫,不能用UART1_IRQn,需要用UART13_IRQn。

beaff2be-d9a0-11eb-9e57-12bb97331649.png

PDMA配置

void PDMA_UART_TxTest(void){ /* UART Tx PDMA channel configuration */ /* Set transfer width (8 bits) and transfer count */ PDMA_SetTransferCnt(PDMA, UART_TX_DMA_CH, PDMA_WIDTH_8, UART_TEST_LENGTH);

/* Set source/destination address and attributes */ PDMA_SetTransferAddr(PDMA, UART_TX_DMA_CH, (uint32_t)SrcArray, PDMA_SAR_INC, (uint32_t)&UART1-》DAT, PDMA_DAR_FIX);

/* Set request source; set basic mode. */ PDMA_SetTransferMode(PDMA, UART_TX_DMA_CH, PDMA_UART1_TX, FALSE, 0);

/* Single request type */ PDMA_SetBurstType(PDMA, UART_TX_DMA_CH, PDMA_REQ_SINGLE, 0);

/* Disable table interrupt */ PDMA_DisableInt(PDMA,UART_TX_DMA_CH, PDMA_INT_TEMPTY );}

這里有幾個需要自行修改的地方,PDMA_SetTransferCnt(PDMA, UART_TX_DMA_CH, PDMA_WIDTH_8, UART_TEST_LENGTH);修改PDMA_WIDTH_8為修改數(shù)據(jù)寬度,這里默認8位,UART_TEST_LENGTH為發(fā)送長度,我這里設(shè)置為11個。PDMA_SetTransferAddr(PDMA, UART_TX_DMA_CH, (uint32_t)SrcArray, PDMA_SAR_INC, (uint32_t)&UART1-》DAT, PDMA_DAR_FIX); SrcArray為數(shù)組的地址。因為我是發(fā)送的DMA,這里配置為內(nèi)存到外設(shè),如果是接收DMA則做以下設(shè)置: PDMA_SetTransferAddr(PDMA, UART_RX_DMA_CH, (uint32_t)&UART1-》DAT, PDMA_SAR_FIX, (uint32_t)DestArray, PDMA_DAR_INC);

配置完后再主函數(shù)打開DMA:

SYS_ResetModule(PDMA_RST);

PDMA_Open(PDMA, (1 《《 UART_TX_DMA_CH));

中斷函數(shù)配置及啟動DMA

void UART13_IRQHandler(void){ uint8_t res;// uint32_t u32IntSts = UART1-》ISR; PB1 = 0;

res = UART_READ(UART1);//讀UART_DAT寄存器自動清除中斷標(biāo)志 if(res == 0x1A) { UART_DISABLE_INT(UART1, UART_INTEN_TXPDMAEN_Msk); PDMA_UART_TxTest(); UART_ENABLE_INT(UART1, UART_INTEN_TXPDMAEN_Msk); while (PDMA-》DSCT[UART_TX_DMA_CH].CTL & PDMA_DSCT_CTL_TXCNT_Msk) ; } PB1 = 1;}

在M031中,區(qū)別于我之前用過的其他MCU,在進入中斷函數(shù)之后,只要讀取串口接收寄存器UART_DAT中的值,便可自動清除中斷標(biāo)志,并不需要去操作其他寄存器。非常好用。

DMA的啟動和其他的MCU類似,[size=14.6667px]需重新配置傳輸個數(shù),[size=14.6667px]RAM[size=14.6667px]地址等,再調(diào)用一次初始化函數(shù)就行。然后利用[size=14.6667px]while (PDMA-》DSCT[UART_TX_DMA_CH].CTL & PDMA_DSCT_CTL_TXCNT_Msk) ;判斷數(shù)據(jù)是否發(fā)送完成,實際上就是等待傳輸個數(shù)計數(shù)器為0。

這里插一句PB1的作用,PBI就是gpio PB1口。初始化就一句話GPIO_SetMode(PB, BIT1, GPIO_MODE_OUTPUT);這里方便示波器觀察時間。在使用庫函數(shù)初始化PWM時,因為每一次的啟動都要調(diào)用該函數(shù),庫函數(shù)的操作很費時間,在觸發(fā)串口接收中斷后將PB1拉低,發(fā)送完拉高,在示波器觀察到從觸發(fā)接收中斷到第一個串口數(shù)據(jù)發(fā)送出去,也就是DMA啟動完成,大約耗時8us,效率低下。于是我將DMA初始化改用寄存器的方式,時間縮小到2.8us,好用!

void PDMA_UART_TxTest(void){ /* UART Tx PDMA channel configuration */ PDMA-》DSCT[UART_TX_DMA_CH].CTL = (UART_TEST_LENGTH - 1) 《《 PDMA_DSCT_CTL_TXCNT_Pos | /* Transfer count */ PDMA_WIDTH_8 | /* Transfer width 8 bits */ PDMA_DAR_FIX | /* Fixed destination address */ PDMA_SAR_INC | /* Increment source address */ PDMA_DSCT_CTL_TBINTDIS_Msk | /* Table interrupt disabled */ PDMA_REQ_SINGLE | /* Single request type */ PDMA_OP_BASIC; /* Basic mode */ PDMA-》DSCT[UART_TX_DMA_CH].SA = (uint32_t)SrcArray; /* Source address */ PDMA-》DSCT[UART_TX_DMA_CH].DA = (uint32_t)&UART1-》DAT; /* Destination address */

/* Request source selection */ PDMA-》REQSEL0_3 = (PDMA-》REQSEL0_3 & (~PDMA_REQSEL0_3_REQSRC1_Msk)) | (PDMA_UART1_TX 《《 PDMA_REQSEL0_3_REQSRC1_Pos);}

END

本文為21ic論壇藍V作者吶咯密密原創(chuàng)撰寫

編輯:jq

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

    關(guān)注

    147

    文章

    18925

    瀏覽量

    398248
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67516
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4968

    瀏覽量

    73974
  • BUG
    BUG
    +關(guān)注

    關(guān)注

    0

    文章

    156

    瀏覽量

    16276
  • pack
    +關(guān)注

    關(guān)注

    14

    文章

    75

    瀏覽量

    10232

原文標(biāo)題:缺貨下,又換MCU了:新塘031 串口PDMA通信。

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

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

    請問CW32W031每次傳輸建議發(fā)送最大多少個字節(jié)?

    我看介紹,CW32W031(Sub-1G)空曠區(qū)域通信距離可以達到5km,主要實現(xiàn)小數(shù)據(jù)量、低功耗、復(fù)雜環(huán)境長距離通信。相比于NBIoT技術(shù),Sub-1G節(jié)省了資訊費 那么,如果想使用CW32W
    發(fā)表于 12-10 07:09

    CW32W031射頻芯片的AT指令都有哪些功能?

    我在網(wǎng)上看到一個,基于CW32W031射頻芯片的AT指令無線串口模塊,這個模塊是官方開源的嗎?有源碼嗎?還有這個AT指令都支持啥功能?
    發(fā)表于 12-05 07:27

    串口通信基石:Air8000下Modbus RTU串口初始化詳解!

    串口初始化是Modbus RTU通信穩(wěn)定可靠的關(guān)鍵起點。本篇深入剖析Air8000開發(fā)板串口參數(shù)配置、初始化代碼實現(xiàn)及調(diào)試要點,結(jié)合master_rtu示例,分享實際操作中的經(jīng)驗與避坑指南,讓您
    的頭像 發(fā)表于 10-28 16:33 ?1657次閱讀
    <b class='flag-5'>串口</b><b class='flag-5'>通信</b>基石:Air8000下Modbus RTU<b class='flag-5'>串口</b>初始化詳解!

    串口通信有哪些方式

    串口通信(Serial Communication)是一種通過串行方式逐位傳輸數(shù)據(jù)的通信方式,廣泛應(yīng)用于嵌入式系統(tǒng)、工業(yè)控制、儀器儀表等領(lǐng)域。其通信方式可根據(jù)不同的分類標(biāo)準劃分為多種類
    的頭像 發(fā)表于 09-28 18:02 ?1096次閱讀

    什么是 PDMA 步幅模式?

    什么是 PDMA 步幅模式?如何使用它?
    發(fā)表于 08-21 06:56

    如何使用 M031 系列微控制器 (MCU) 的 PDMA 將 SPI 閃存中的圖片數(shù)據(jù)移動到 TFT 顯示器?

    使用 M031 系列微控制器 (MCU) 的 PDMA 將 SPI 閃存中的圖片數(shù)據(jù)移動到 TFT 顯示器
    發(fā)表于 08-19 08:08

    如何使用帶有PDMA的M251 QSPI來模擬PWM輸出信號?

    使用帶有PDMA的M251 QSPI來模擬PWM輸出信號
    發(fā)表于 08-19 07:00

    如何使用帶有 PDMA 的 NUC1262 LLSI 來控制 ARGB Gen 1 LED 燈?

    使用帶有 PDMA 的 NUC1262 LLSI 來控制 ARGB Gen 1 LED 燈
    發(fā)表于 08-19 06:26

    PLC串口自由協(xié)議通信概述

    串口自由協(xié)議通信是一種靈活的串行通信方式。在該模式下,開發(fā)者無需遵循特定標(biāo)準協(xié)議,可根據(jù)實際需求自由定義數(shù)據(jù)格式與交互規(guī)則。
    的頭像 發(fā)表于 08-07 09:15 ?2153次閱讀
    PLC<b class='flag-5'>串口</b>自由協(xié)議<b class='flag-5'>通信</b>概述

    智嵌物聯(lián)串口轉(zhuǎn)光纖轉(zhuǎn)換器-延長串口通信距離,增強抗干擾性能

    智嵌物聯(lián)研發(fā)的串口光纖收發(fā)器是將RS-485/422/RS232接口信號轉(zhuǎn)換為光纖接口傳輸,通信距離可達20Km,大大延長串口通信距離以及抗干擾性能。設(shè)備可自適應(yīng)
    的頭像 發(fā)表于 06-27 17:08 ?737次閱讀
    智嵌物聯(lián)<b class='flag-5'>串口</b>轉(zhuǎn)光纖轉(zhuǎn)換器-延長<b class='flag-5'>串口</b><b class='flag-5'>通信</b>距離,增強抗干擾性能

    ESP32用作經(jīng)典藍牙串口透傳模塊與手機進行串口通信

    本文介紹了如何把ESP32用作一個藍牙串口透傳設(shè)備使用,其功能和常用的HC-05/06串口藍牙設(shè)備一樣。并與手機藍牙串口APP進行雙向藍牙通信。
    的頭像 發(fā)表于 06-20 17:45 ?3001次閱讀
    ESP32用作經(jīng)典藍牙<b class='flag-5'>串口</b>透傳模塊與手機進行<b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    常用通信接口一(串口、RS232、RS485、USB、TYPE-C原理與區(qū)別)

    一、什么是串口通信?常見的串口通信一般是指異步串行通信。與串行通信相對的是并行
    的頭像 發(fā)表于 05-29 15:44 ?3909次閱讀
    常用<b class='flag-5'>通信</b>接口一(<b class='flag-5'>串口</b>、RS232、RS485、USB、TYPE-C原理與區(qū)別)

    第七章 串口通信

    本章介紹了W55MH32的串口通信,講述了數(shù)據(jù)通信基礎(chǔ)概念、串口通信協(xié)議和特性與功能,以及DMA在串口
    的頭像 發(fā)表于 05-26 17:00 ?997次閱讀
    第七章 <b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    輕松解碼串口通信

    說到通信,在我們的生活方方面面體現(xiàn)的淋漓盡致,比如手機信號,WiFi 等這些無線通信更是近些年 熱點并且各種通信設(shè)備都出來了,真的是科技社會,對我們的生活太方便了對于通信,我們今天聊一
    發(fā)表于 03-24 14:22 ?4次下載

    串口通信的優(yōu)勢與缺點

    串口通信以其簡單實現(xiàn)、低成本、遠距離傳輸、良好兼容性和強實時性著稱,適用于多種場景,但也存在傳輸速度慢、抗干擾能力弱、距離受限、靈活性不足及資源占用多的缺點,需根據(jù)實際需求選擇使用。
    的頭像 發(fā)表于 03-13 15:01 ?1594次閱讀
    <b class='flag-5'>串口</b><b class='flag-5'>通信</b>的優(yōu)勢與缺點