久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1840|回復: 6
收起左側

STM32單片機使用寄存器配置ADC讀取不到數據問題

[復制鏈接]
ID:831673 發表于 2023-3-22 00:46 | 顯示全部樓層 |閱讀模式
如題,樓主在使用stm32寄存器配置ADC電壓采樣,使用中斷獲取采樣數據,實際效果中,adc配置后無法讀取不到寄存器DR的值,單片機使用stm32f103vet6

單片機代碼如下:
使用的gpio口是PC1,對應的adc1是通道11
引腳配置:
  1. void ADC_GPIO_INIT(void)
  2. {

  3. SET_BIT(RCC->APB2ENR,RCC_APB2ENR_IOPCEN);//**開GPIOC端口時鐘
  4. GPIOC->CRL &= ~(0xf<<4);//**模擬輸入模式 PC1
  5. }
復制代碼

ADC初始化配置
  1. void ADC_Mode_Config(void)
  2. {
  3. SET_BIT(RCC->APB2ENR,RCC_APB2ENR_ADC1EN);//**開ADC1外設時鐘
  4. SET_BIT(RCC->CFGR,RCC_CFGR_ADCPRE_DIV6);//設置ADC分頻因子,6分頻,72/6=12MHZ[indent]
  5. ADC1->CR1=0;//**初始化
  6. ADC1->CR2=0;[/indent][indent]
  7. SET_BIT(ADC1->CR1,ADC_CR1_EOCIE);//**轉換結束后產生中斷
  8. SET_BIT(ADC1->CR2,ADC_CR2_CONT);//**配置連續轉換模式

  9. ADC1->SMPR1|=7<<(3*1);//**采樣周期為239.5個周期
  10. ADC1->SQR1|=0<<20;//**1個轉換

  11. SET_BIT(ADC1->CR2,ADC_CR2_ADON);//**開啟AD轉換器[/indent][indent]
  12. SET_BIT(ADC1->CR2,ADC_CR2_RSTCAL);//**使能復位校準
  13. while(READ_BIT(ADC1->CR2,ADC_CR2_RSTCAL));//**等待校準結束
  14. SET_BIT(ADC1->CR2,ADC_CR2_CAL);//**使能A/D校準
  15. while(READ_BIT(ADC1->CR2,ADC_CR2_CAL));//**等待校準結束[/indent]
  16. ADC1->SQR3&=0XFFFFFFE0
  17. ADC1->SQR3|=11;//**通道配置

  18. NVIC_SetPriority(ADC1_2_IRQn, 1);//配置中斷優先級
  19. NVIC_EnableIRQ(ADC1_2_IRQn);//開中斷

  20. }

復制代碼
中斷函數
  1. void ADC_IRQHandler(void)
  2. {        
  3. if (READ_BIT(ADC1->SR,ADC_SR_EOC))
  4.   {
  5.   // 讀取ADC的轉換值
  6.   ADC_ConvertedValue = ADC1->DR;
  7.   }
  8. }
復制代碼

主函數:
1.png

問題出在ADC初始化函ADC_Mode_Config()上,我的想法是轉換完成后EOCIE產生一個中斷,在中斷中讀取DR寄存器的值,實際效果是讀取到的dr的值始終為0:
2.png


也試圖使用軟件開啟配置:
ADC1->CR2|=7<<17; //軟件控制轉換
ADC1->CR2|=1<<20; //使用外部觸發(SWSTART)
SET_BIT(ADC1->CR2,ADC_CR2_SWSTAR);//**軟件設置開始轉換
while(!(ADC1->SR&1<<1)); //等待完成

當開啟外部觸發EXTTRIG,并配置EXTSEL為SWSTART,在中斷優先級配置后啟用SWSTART,串口接收不到任何信息。
回復

使用道具 舉報

ID:301191 發表于 2023-3-22 15:12 | 顯示全部樓層
頂一下
回復

使用道具 舉報

ID:123289 發表于 2023-3-22 16:27 | 顯示全部樓層
再讀CPU手冊,特別關注AD部分。
回復

使用道具 舉報

ID:831673 發表于 2023-3-23 00:22 | 顯示全部樓層
yzwzfyz 發表于 2023-3-22 16:27
再讀CPU手冊,特別關注AD部分。

找到原因了,問題出在中斷上
回復

使用道具 舉報

ID:831673 發表于 2023-3-23 00:31 | 顯示全部樓層
問題補充更新:
我將ADC的中斷觸發關閉,設置成單次轉換模式,直接在轉換結束后讀取DR寄存器的值,沒有通過觸發來讀取,發現可以正常讀取到ADC的值:
  1. static void ADCx_Mode_Config(void)
  2. {
  3. RCC->APB2ENR|=1<<9; //ADC1 時鐘使能
  4. RCC->APB2RSTR|=1<<9; //ADC1 復位
  5. RCC->APB2RSTR&=~(1<<9);//復位結束
  6. RCC->CFGR&=~(3<<14); //分頻因子清零
  7. //SYSCLK/DIV2=12M ADC 時鐘設置為 12M,ADC 最大時鐘不能超過 14M!
  8. //否則將導致 ADC 準確度下降!
  9. RCC->CFGR|=2<<14;
  10. ADC1->CR1&=0XF0FFFF; //工作模式清零
  11. ADC1->CR1|=0<<16; //獨立工作模式
  12. ADC1->CR1&=~(1<<8); //非掃描模式
  13.        
  14. ADC1->CR2&=~(1<<1);//單次轉換模式
  15.        
  16. //ADC1->CR2|=1<<1; //連續轉換模式
  17. //ADC1->CR1|=1<<5;//開中斷
  18.        
  19. ADC1->CR2&=~(7<<17);
  20. ADC1->CR2|=7<<17; //軟件控制轉換
  21. ADC1->CR2|=1<<20; //使用用外部觸發(SWSTART)!!! 必須使用一個事件來觸發
  22. ADC1->CR2&=~(1<<11); //右對齊
  23. ADC1->SQR1&=~(0XF<<20);
  24. ADC1->SQR1|=0<<20; //1 個轉換在規則序列中 也就是只轉換規則序列 1
  25. //設置通道 11 的采樣時間
  26. ADC1->SMPR1&=~(3*1); //通道 11 采樣時間清空
  27. ADC1->SMPR1|=7<<(3*1); //通道 11 239.5 周期,提高采樣時間可以提高精確度
  28. ADC1->CR2|=1<<0; //開啟 AD 轉換器
  29. ADC1->CR2|=1<<3; //使能復位校準
  30. while(ADC1->CR2&1<<3); //等待校準結束
  31. //該位由軟件設置并由硬件清除。在校準寄存器被初始化后該位將被清除。
  32. ADC1->CR2|=1<<2; //開啟 AD 校準
  33. while(ADC1->CR2&1<<2); //等待校準結束
  34. //該位由軟件設置以開始校準,并在校準結束時由硬件清除
  35. }

  36. u16 Get_Adc(void)
  37. {
  38. ADC1->SQR3&=0XFFFFFFE0;//???? 1 ?? ch
  39. ADC1->SQR3|=ADC_Channel_11;
  40. ADC1->CR2|=1<<22; //????????
  41. while(!(ADC1->SR&1<<1)); //??????
  42. return ADC1->DR; //?? adc ?
  43. }
復制代碼


由此可見在串口調試助手中無法輸出內容是由于中斷的問題
以下是中斷EOCIE的說明:

EOCIE:允許產生EOC中斷 (Interrupt enable for EOC)
該位由軟件設置和清除,用于禁止或允許轉換結束后產生中斷。
0:禁止EOC中斷;
1:允許EOC中斷。當硬件設置EOC位時產生中斷。

那么,理論上ADC轉化完成后將產生EOC中斷,進入中斷函數,在中斷函數中讀取到DR的值,而實際效果是ADC在中斷這里卡死,具體原因還在尋找。
回復

使用道具 舉報

ID:831673 發表于 2023-3-23 01:14 | 顯示全部樓層
找到最終原因了,是我中斷函數名寫錯導致EOC中斷產生后沒法進入中斷函數。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩三级在线观看 | 丝袜 亚洲 欧美 日韩 综合 | 老司机午夜性大片 | 亚洲iv一区二区三区 | 国产成人精品一区二区三区四区 | 国产在线拍偷自揄拍视频 | 国产一区在线免费观看 | 色综合中文 | 成人在线中文字幕 | 日本不卡一区二区三区 | 亚洲精品乱码久久久久久按摩 | 亚洲精品在线免费播放 | 真人一级毛片 | 综合久久久久久久 | 欧美一区二区三区在线播放 | 成人在线一级片 | 超碰日本 | 亚洲精品一 | 日韩精品一区二区三区 | 亚洲天堂av在线 | 天天干天天操 | 国产激情一区二区三区 | 中文字幕av亚洲精品一部二部 | 亚洲精品久久区二区三区蜜桃臀 | 日韩在线 | 久久久久久久久久久国产 | 久国产| 69电影网| 亚洲视频欧美视频 | chengrenzaixian| 国内自拍偷拍 | 午夜免费视频 | 最新毛片网站 | av在线免费观看网址 | 四虎永久在线精品免费一区二 | 亚洲视频二区 | 久久综合国产精品 | 国产精品亚洲第一区在线暖暖韩国 | 不卡视频一区二区三区 | 五月婷婷 六月丁香 | 成人超碰 |