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

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

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

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

RTT下ADC+DMA裸機(jī)程序移植成功經(jīng)驗(yàn)分享

冬至子 ? 來(lái)源:VHMK_9546 ? 作者:VHMK_9546 ? 2023-08-03 15:55 ? 次閱讀

1、實(shí)驗(yàn)環(huán)境
RT-Thread 4.03
STM32F407VET6
STM3F4庫(kù)版本 0.2.2
SDK資源管理器中可以查看版本信息如下圖。(小編遇見(jiàn)過(guò)因版本不兼容出現(xiàn)的編譯錯(cuò)誤問(wèn)題)

1.jpg

2、創(chuàng)建RT-Thread項(xiàng)目

1.jpg

此時(shí)編譯結(jié)果沒(méi)有錯(cuò)誤

1.jpg

打開CubeMX軟件(不使用CubeMX Setting)step1:配置時(shí)鐘。step2、配置ADC+DMA。

1.jpg

根據(jù)自己板子晶振確定時(shí)鐘

1.jpg

根據(jù)ADC引腳配置

1.jpg

配置ADC1通道

1.jpg

配置DMA

1.jpg

ADC參數(shù)設(shè)置

1.jpg

生成項(xiàng)目

1.jpg

在RTT中如圖文件夾下新建源文件

1.jpg

1.jpg

從CubeMX生成的工程中復(fù)制如下圖函數(shù)到RTT文件中;具體代碼有所修改,可參考代碼部分

1.jpg

參考代碼

#include "stm32f4xx_hal.h"
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;
static void MX_DMA_Init(void)
{
/* DMA controller clock enable /
__HAL_RCC_DMA2_CLK_ENABLE();
/
DMA interrupt init /
/
DMA2_Stream0_IRQn interrupt configuration /
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
}
void HAL_ADC_MspInit(ADC_HandleTypeDef
hadc)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
MX_DMA_Init();
if(hadc->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspInit 0 /
/
USER CODE END ADC1_MspInit 0 /
/
Peripheral clock enable /
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/ADC1 GPIO Configuration
PC0 ------> ADC1_IN10
PC1 ------> ADC1_IN11
PC2 ------> ADC1_IN12
PC3 ------> ADC1_IN13
PA0-WKUP ------> ADC1_IN0
PA1 ------> ADC1_IN1
/
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/
ADC1 DMA Init /
/
ADC1 Init /
hdma_adc1.Instance = DMA2_Stream0;
hdma_adc1.Init.Channel = DMA_CHANNEL_0;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR;
hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
HAL_DMA_Init(&hdma_adc1);
__HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);
/
USER CODE BEGIN ADC1_MspInit 1 /
/
USER CODE END ADC1_MspInit 1 /
}
}
void MX_ADC1_Init(void)
{
/
USER CODE BEGIN ADC1_Init 0 /
/
USER CODE END ADC1_Init 0 /
ADC_ChannelConfTypeDef sConfig = {0};
/
USER CODE BEGIN ADC1_Init 1 /
/
USER CODE END ADC1_Init 1 /
/
Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV8;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 6;
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
HAL_ADC_Init(&hadc1);
/
Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
/
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
/
Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = 2;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
/
* Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
/
sConfig.Channel = ADC_CHANNEL_13;
sConfig.Rank = 3;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
/
* Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
/
sConfig.Channel = ADC_CHANNEL_12;
sConfig.Rank = 4;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
/
* Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
/
sConfig.Channel = ADC_CHANNEL_11;
sConfig.Rank = 5;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
/
* Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
/
sConfig.Channel = ADC_CHANNEL_10;
sConfig.Rank = 6;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
/
USER CODE BEGIN ADC1_Init 2 /
/
USER CODE END ADC1_Init 2 /
}
void DMA2_Stream0_IRQHandler(void)
{
/
USER CODE BEGIN DMA2_Stream0_IRQn 0 /
/
USER CODE END DMA2_Stream0_IRQn 0 /
HAL_DMA_IRQHandler(&hdma_adc1);
// rt_kprintf("11111111 n");
/
USER CODE BEGIN DMA2_Stream0_IRQn 1 /
/
USER CODE END DMA2_Stream0_IRQn 1 */
}

配置RT-Thread Setting

1.jpg

1.jpg

1.jpg

編譯通過(guò),結(jié)果如下圖

1.jpg

修改drv_adc.c文件

1.jpg

編譯通過(guò),結(jié)果如下圖

1.jpg

3、添加業(yè)務(wù)測(cè)試代碼

新建user_adc.c源文件添加業(yè)務(wù)測(cè)試代碼如下

#include
#include
#include
rt_thread_t Adc_thread1= RT_NULL;
#define ADC_MAX_SAMPLE 12
#define ADC_MAX_CHANLE 6
extern ADC_HandleTypeDef hadc1;
extern rt_uint16_t value[ADC_MAX_SAMPLE][ADC_MAX_CHANLE];
rt_uint16_t ADC_ConvertedValue[ADC_MAX_SAMPLE][ADC_MAX_CHANLE];
rt_uint16_t ADC_AverageValue[ADC_MAX_CHANLE];
extern ADC_HandleTypeDef hadc1;
static void CalADC_Average(void)
{
unsigned short i, j;
unsigned short uIntMax,uIntMin,i_Max,i_Min;
unsigned int sum;
for(i=0;i<(ADC_MAX_CHANLE);i++)
{
uIntMax = ADC_ConvertedValue[0][i];
uIntMin = ADC_ConvertedValue[1][i];
i_Max = 0; i_Min = 1;
for(j=0;j if(uIntMax uIntMax=ADC_ConvertedValue[j][i];
i_Max = j;
}
if(uIntMin>ADC_ConvertedValue[j][i]){
uIntMin=ADC_ConvertedValue[j][i];
i_Min = j;
}
}
ADC_ConvertedValue[i_Max][i]=0;
ADC_ConvertedValue[i_Min][i]=0;
sum = 0;
for(j=0; j sum += ADC_ConvertedValue[j][i];
}
if(i_Min==i_Max){
ADC_AverageValue[i] = sum/(ADC_MAX_SAMPLE-1)/11.91;
}
else {
ADC_AverageValue[i] = sum/(ADC_MAX_SAMPLE-2)/11.91;
}
}
}
static void Adc_entry(void *parameter)
{
HAL_ADC_Start_DMA(&hadc1, ADC_ConvertedValue, (uint32_t)(ADC_MAX_SAMPLE * ADC_MAX_CHANLE));
while (1)
{
CalADC_Average();
rt_kprintf("/************************/n");
rt_kprintf("avg0 is :%d n",ADC_AverageValue[0]);
rt_kprintf("avg1 is :%d n",ADC_AverageValue[1]);
rt_kprintf("avg2 is :%d n",ADC_AverageValue[2]);
rt_kprintf("avg3 is :%d n",ADC_AverageValue[3]);
rt_kprintf("avg4 is :%d n",ADC_AverageValue[4]);
rt_kprintf("avg5 is :%d n",ADC_AverageValue[5]);
rt_thread_mdelay(500);
}
}
static int adc_deal(void)
{
rt_err_t ret = RT_EOK;
/*創(chuàng)建第一個(gè)線程,用于采集IN8的值*/
Adc_thread1 = rt_thread_create("adc1",
Adc_entry,
(void*)0,
512,
16,
20);
if(Adc_thread1 != RT_NULL)
rt_thread_startup(Adc_thread1);
else
ret = RT_ERROR;
return ret;
}
INIT_APP_EXPORT(adc_deal);

測(cè)試結(jié)果

本測(cè)試板模擬量是采集4~20MA電流。使用信號(hào)發(fā)生器輸出電流信號(hào)對(duì)各個(gè)通道測(cè)試正常。下圖是對(duì)chanle_10通道采集數(shù)據(jù)(12MA電流顯示118。其他通道接輸入信號(hào)也可以正常采集,其他通道不超過(guò)40為干擾信號(hào),不會(huì)計(jì)入有效采集)。

1.jpg

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • adc
    adc
    +關(guān)注

    關(guān)注

    98

    文章

    6503

    瀏覽量

    544871
  • 信號(hào)發(fā)生器

    關(guān)注

    28

    文章

    1476

    瀏覽量

    108805
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    561

    瀏覽量

    100623
  • ADC采樣
    +關(guān)注

    關(guān)注

    0

    文章

    134

    瀏覽量

    12850
  • RTThread
    +關(guān)注

    關(guān)注

    8

    文章

    132

    瀏覽量

    40894
  • STM32F407VET6
    +關(guān)注

    關(guān)注

    2

    文章

    5

    瀏覽量

    2946
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用STM32L031F6在hal庫(kù)進(jìn)行ADC+DMA多通道采集,采集的電壓值始終為0的原因?

    使用STM32L031F6芯片 在hal庫(kù)進(jìn)行ADC+DMA多通道采集時(shí)候,采集的電壓值始終為0是什么原因?
    發(fā)表于 03-14 07:06

    stm32cubemx建立多通道ADC+DMA,想使用DMA中斷要怎么實(shí)現(xiàn)?

    各位大神: 我在用stm32 cubemx建立ADC+DMA多通道,想使用DMA中斷,百度了個(gè)設(shè)置在DMA里增加ADC1,然后在中斷里開啟DMA
    發(fā)表于 04-02 07:14

    STM32G4 ADC+DMA中斷異常是什么原因?qū)е碌模?/a>

    高級(jí)定時(shí)器1 3路互補(bǔ)pwm ,pwm ch4 觸發(fā)adc,出現(xiàn)的問(wèn)題是 單獨(dú)啟動(dòng)pwm ch4 adc+dma 正常,如果不啟動(dòng)ch4正常情況是不會(huì)觸發(fā) adc+dma中斷,但是正常啟動(dòng)3路互補(bǔ)PWM 沒(méi)啟動(dòng)pwm ch4 情
    發(fā)表于 04-02 06:52

    使用rt-thread的ADC框架,增加了DMA采集部分,采集到的兩通道數(shù)據(jù)中,有一個(gè)通道數(shù)據(jù)異常,為什么?

    裸機(jī)程序通過(guò)ADC+DMA采集兩通道模擬量數(shù)據(jù),可以正常采集到數(shù)據(jù),使用rt-thread的ADC框架,增加了DMA采集部分,采集到的兩通道
    發(fā)表于 07-12 08:07

    為什么STM32F103C8T6加上ADC+DMA后液晶不能顯示?

    STM32F103C8T6加上ADC+DMA后,液晶不能顯示,但是ADC+DMA使用正常,液晶是LCM19264,已經(jīng)檢查了I/O沒(méi)有沖突,具體配置如下: 說(shuō)明: 一:I/O口: 1:LCD
    發(fā)表于 08-16 05:12

    STM32多通道ADC+DMA為什么無(wú)法進(jìn)入中斷

    STM32 多通道ADC+DMA無(wú)法進(jìn)入中斷問(wèn)題中斷函數(shù)名稱不一致stm32f10x_it.c 中斷名稱DMA1_ChanneMl1_IRQHandler.啟動(dòng)文件DMA1_Channel1_IRQHandler
    發(fā)表于 08-02 08:33

    STM32F103定時(shí)器觸發(fā)ADC+DMA傳輸 精選資料分享

    STM32F103定時(shí)器觸發(fā)ADC+DMA傳輸ADC除了軟件觸發(fā)方式之外還有外部觸發(fā)模式,我用TIM2定時(shí)器觸發(fā)ADC,并用DMA傳輸ADC
    發(fā)表于 08-11 06:05

    MM32F103 ADC+DMA 多通道采樣

    MM32F103 ADC+DMA 多通道采樣請(qǐng)問(wèn)軟件如何配置?
    發(fā)表于 08-27 14:48

    怎樣去解決STM32多通道ADC+DMA無(wú)法進(jìn)入中斷的問(wèn)題

    STM32多通道ADC+DMA為什么會(huì)無(wú)法進(jìn)入中斷呢?怎樣去解決STM32多通道ADC+DMA無(wú)法進(jìn)入中斷的問(wèn)題?
    發(fā)表于 09-26 08:04

    如何對(duì)單緩沖模式的ADC+DMA如何進(jìn)行配置

    怎樣去操作單緩沖模式的ADC+DMA呢?如何對(duì)單緩沖模式的ADC+DMA如何進(jìn)行配置?
    發(fā)表于 10-18 09:29

    STM32F407的ADC+DMA該如何去使用呢

    怎樣去讀取ADC的值?STM32F407的ADC+DMA該如何去使用呢?
    發(fā)表于 10-18 08:34

    請(qǐng)問(wèn)一在RT-Thread studio上怎樣去添加ADC+DMA呢?

    請(qǐng)問(wèn)一在RT-Thread studio上怎樣去添加ADC+DMA呢?
    發(fā)表于 10-11 10:33

    對(duì)一起特殊故障處理的成功經(jīng)驗(yàn)

    對(duì)一起特殊故障處理的成功經(jīng)驗(yàn)
    發(fā)表于 05-26 13:40 ?21次下載

    STM32F103定時(shí)器觸發(fā)ADC+DMA傳輸

    STM32F103定時(shí)器觸發(fā)ADC+DMA傳輸ADC除了軟件觸發(fā)方式之外還有外部觸發(fā)模式,我用TIM2定時(shí)器觸發(fā)ADC,并用DMA傳輸ADC
    發(fā)表于 11-30 10:36 ?57次下載
    STM32F103定時(shí)器觸發(fā)<b class='flag-5'>ADC+DMA</b>傳輸

    STM32U5 ADC+DMA配置演示

    隨意選擇ADC1的4個(gè)通道,掃描模式,連續(xù)轉(zhuǎn)換,DMA傳輸轉(zhuǎn)換結(jié)果并令DMA工作在外設(shè)字到內(nèi)存字的循環(huán)傳輸模式。使用CubeMx進(jìn)行配置。其中DMA通道使用Channel 1。
    的頭像 發(fā)表于 07-29 16:19 ?1859次閱讀
    STM32U5 <b class='flag-5'>ADC+DMA</b>配置演示
    主站蜘蛛池模板: 亚洲一二三产品区别在哪里| 亚洲理论片在线中文字幕| 色偷偷777| 97在线播放视频| 精品国产麻豆免费人成网站| 无码AV精品久久一区二区免费| www.色小姐| 女性露出奶头流出精子| 孕妇泬出白浆18P| 久久精品国产亚洲AV热无遮挡| 亚洲欧美综合乱码精品成人网| 国产精品无码麻豆放荡AV| 首页_亚洲AV色老汉影院| 古风一女N男到处做高H| 视频一区国产在线二区| 闺蜜扒开我尿口使劲揉| 十分钟在线观看免费视频高清WWW| 波多野结衣 熟女| 日韩国产精品欧美一区二区| 国产午夜精品久久理论片| 涩涩999| 古风一女N男到处做高H| 无遮挡午夜男女XX00动态| 国产国产乱老熟视频网站| 乌克兰18性hd| 国产人人为我我为人人澡| 亚洲大爷操| caoporen超碰在线视频| 十分钟免费观看大全视频| 99久久精品费精品国产一区二| 国产亚洲tv在线观看| 亚洲国产日韩欧美在线a乱码| 国产亚洲精品久久久久苍井松| 亚洲精品第一综合99久久| 九九热这里有精品| 最近的中文字幕免费完整| 狠狠色综合久久婷婷| 亚洲乱码日产精品BD在线下载| 国产在线精品亚洲第一区| 亚洲中文有码字幕日本| 美国兽皇zoo在线播放|